diff --git a/toolkit/components/webextensions/ExtensionStorage.jsm b/toolkit/components/webextensions/ExtensionStorage.jsm index 0b0ffb0003..728cba728c 100644 --- a/toolkit/components/webextensions/ExtensionStorage.jsm +++ b/toolkit/components/webextensions/ExtensionStorage.jsm @@ -197,6 +197,19 @@ this.ExtensionStorage = { }); }, + getManaged(keys) { + // Managed storage is populated by enterprise policy, which this UXP + // branch does not implement. Return the requested defaults, matching the + // WebExtension storage contract for an empty managed area. + if (keys === null || keys === undefined) { + return Promise.resolve({}); + } + if (typeof(keys) == "object" && !Array.isArray(keys)) { + return Promise.resolve(Object.assign({}, keys)); + } + return Promise.resolve({}); + }, + addOnChangedListener(extensionId, listener) { let listeners = this.listeners.get(extensionId) || new Set(); listeners.add(listener); diff --git a/toolkit/components/webextensions/ext-c-storage.js b/toolkit/components/webextensions/ext-c-storage.js index e8d53058f6..34abcd2254 100644 --- a/toolkit/components/webextensions/ext-c-storage.js +++ b/toolkit/components/webextensions/ext-c-storage.js @@ -41,6 +41,27 @@ function storageApiFactory(context) { }, }, + managed: { + get: function(keys) { + keys = sanitize(keys); + return context.childManager.callParentAsyncFunction("storage.managed.get", [ + keys, + ]); + }, + set: function() { + throw new context.cloneScope.Error( + "storage.managed is read-only"); + }, + remove: function() { + throw new context.cloneScope.Error( + "storage.managed is read-only"); + }, + clear: function() { + throw new context.cloneScope.Error( + "storage.managed is read-only"); + }, + }, + sync: { get: function(keys) { keys = sanitize(keys); diff --git a/toolkit/components/webextensions/ext-storage.js b/toolkit/components/webextensions/ext-storage.js index b1e22c46c0..4bc5168fd1 100644 --- a/toolkit/components/webextensions/ext-storage.js +++ b/toolkit/components/webextensions/ext-storage.js @@ -29,6 +29,27 @@ function storageApiFactory(context) { }, }, + // UXP has no enterprise managed-storage backend. Expose the namespace + // as an empty, read-only area so extensions can feature-detect it and + // continue using their defaults. + managed: { + get: function(spec) { + return ExtensionStorage.getManaged(spec); + }, + set: function() { + throw new context.cloneScope.Error( + "storage.managed is read-only"); + }, + remove: function() { + throw new context.cloneScope.Error( + "storage.managed is read-only"); + }, + clear: function() { + throw new context.cloneScope.Error( + "storage.managed is read-only"); + }, + }, + onChanged: new EventManager(context, "storage.onChanged", fire => { let listenerLocal = changes => { fire(changes, "local"); diff --git a/toolkit/components/webextensions/schemas/manifest.json b/toolkit/components/webextensions/schemas/manifest.json index 2b69e72fd4..7212db4781 100644 --- a/toolkit/components/webextensions/schemas/manifest.json +++ b/toolkit/components/webextensions/schemas/manifest.json @@ -183,6 +183,29 @@ "optional": true }, + "optional_permissions": { + "type": "array", + "items": { + "choices": [ + { "$ref": "Permission" }, + { + "type": "string", + "deprecated": "Unknown optional permission ${value}" + } + ] + }, + "optional": true + }, + + "user_scripts": { + "type": "object", + "optional": true, + "properties": { + "api_script": { "$ref": "ExtensionURL" } + }, + "additionalProperties": { "$ref": "UnrecognizedProperty" } + }, + "web_accessible_resources": { "type": "array", "items": { "type": "string" }, @@ -218,6 +241,7 @@ "enum": [ "alarms", "clipboardWrite", + "contextualIdentities", "dns", "idle", "menus", @@ -387,8 +411,7 @@ }, { "id": "PersistentBackgroundProperty", - "type": "boolean", - "deprecated": "Event pages are not currently supported. This will run as a persistent background page." + "type": "boolean" } ] } diff --git a/toolkit/components/webextensions/schemas/storage.json b/toolkit/components/webextensions/schemas/storage.json index a54a209424..35e3931902 100644 --- a/toolkit/components/webextensions/schemas/storage.json +++ b/toolkit/components/webextensions/schemas/storage.json @@ -220,7 +220,6 @@ } }, "managed": { - "unsupported": true, "$ref": "StorageArea", "description": "Items in the managed storage area are set by the domain administrator, and are read-only for the extension; trying to modify this namespace results in an error." }