69 lines
2.1 KiB
Markdown
69 lines
2.1 KiB
Markdown
# Implementing a manifest property
|
|
|
|
Like functions and events, implementing a new manifest key requires
|
|
writing a definition in the schema and extending the API's instance
|
|
of `ExtensionAPI`.
|
|
|
|
The contents of a WebExtension's `manifest.json` are validated using
|
|
a type called `WebExtensionManifest` defined in the namespace
|
|
`manifest`.
|
|
The first step when adding a new property is to extend the schema so
|
|
that manifests containing the new property pass validation.
|
|
This is done with the `"$extend"` property as follows:
|
|
|
|
```js
|
|
[
|
|
"namespace": "manifest",
|
|
"types": [
|
|
{
|
|
"$extend": "WebExtensionManifest",
|
|
"properties": {
|
|
"my_api_property": {
|
|
"type": "string",
|
|
"optional": true,
|
|
...
|
|
}
|
|
}
|
|
}
|
|
]
|
|
]
|
|
```
|
|
|
|
The next step is to inform the WebExtensions framework that this API
|
|
should be instantiated and notified when extensions that use the new
|
|
manifest key are loaded.
|
|
For built-in APIs, this is done with the `manifest` property
|
|
in the API manifest (e.g., `ext-toolkit.json`).
|
|
Note that this property is an array so an extension can implement
|
|
multiple properties:
|
|
|
|
```js
|
|
"myapi": {
|
|
"schema": "...",
|
|
"url": "...",
|
|
"manifest": ["my_api_property"]
|
|
}
|
|
```
|
|
|
|
The final step is to write code to handle the new manifest entry.
|
|
The WebExtensions framework processes an extension's manifest when the
|
|
extension starts up, this happens for existing extensions when a new
|
|
browser session starts up and it can happen in the middle of a session
|
|
when an extension is first installed or enabled, or when the extension
|
|
is updated.
|
|
The JSON fragment above causes the WebExtensions framework to load the
|
|
API implementation when it encounters a specific manifest key while
|
|
starting an extension, and then call its `onManifestEntry()` method
|
|
with the name of the property as an argument.
|
|
The value of the property is not passed, but the full manifest is
|
|
available through `this.extension.manifest`:
|
|
|
|
```js
|
|
this.myapi = class extends ExtensionAPI {
|
|
onManifestEntry(name) {
|
|
let value = this.extension.manifest.my_api_property;
|
|
/* do something with value... */
|
|
}
|
|
}
|
|
```
|