--- a/browser/components/extensions/ext-bookmarks.js
+++ b/browser/components/extensions/ext-bookmarks.js
@@ -72,17 +72,17 @@ function convert(result) {
node.url = result.url.href; // Output is always URL object.
} else {
node.dateGroupModified = result.lastModified.getTime();
}
return node;
}
-extensions.registerSchemaAPI("bookmarks", context => {
+extensions.registerSchemaAPI("bookmarks", "addon_parent", context => {
return {
bookmarks: {
get: function(idOrIdList) {
let list = Array.isArray(idOrIdList) ? idOrIdList : [idOrIdList];
return Task.spawn(function* () {
let bookmarks = [];
for (let id of list) {
--- a/browser/components/extensions/ext-browserAction.js
+++ b/browser/components/extensions/ext-browserAction.js
@@ -360,17 +360,17 @@ extensions.on("manifest_browser_action",
extensions.on("shutdown", (type, extension) => {
if (browserActionMap.has(extension)) {
browserActionMap.get(extension).shutdown();
browserActionMap.delete(extension);
}
});
/* eslint-enable mozilla/balanced-listeners */
-extensions.registerSchemaAPI("browserAction", context => {
+extensions.registerSchemaAPI("browserAction", "addon_parent", context => {
let {extension} = context;
return {
browserAction: {
onClicked: new EventManager(context, "browserAction.onClicked", fire => {
let listener = () => {
let tab = TabManager.activeTab;
fire(TabManager.convert(extension, tab));
};
--- a/browser/components/extensions/ext-commands.js
+++ b/browser/components/extensions/ext-commands.js
@@ -223,17 +223,17 @@ extensions.on("shutdown", (type, extensi
let commandsList = commandsMap.get(extension);
if (commandsList) {
commandsList.unregister();
commandsMap.delete(extension);
}
});
/* eslint-enable mozilla/balanced-listeners */
-extensions.registerSchemaAPI("commands", context => {
+extensions.registerSchemaAPI("commands", "addon_parent", context => {
let {extension} = context;
return {
commands: {
getAll() {
let commands = commandsMap.get(extension).commands;
return Promise.resolve(Array.from(commands, ([name, command]) => {
return ({
name,
--- a/browser/components/extensions/ext-contextMenus.js
+++ b/browser/components/extensions/ext-contextMenus.js
@@ -480,17 +480,17 @@ extensions.on("shutdown", (type, extensi
gRootItems.delete(extension);
if (--gExtensionCount == 0) {
Services.obs.removeObserver(contextMenuObserver,
"on-build-contextmenu");
}
});
/* eslint-enable mozilla/balanced-listeners */
-extensions.registerSchemaAPI("contextMenus", context => {
+extensions.registerSchemaAPI("contextMenus", "addon_parent", context => {
let {extension} = context;
return {
contextMenus: {
create: function(createProperties, callback) {
let menuItem = new MenuItem(extension, context, createProperties);
gContextMenuMap.get(extension).set(menuItem.id, menuItem);
if (callback) {
runSafe(context, callback);
--- a/browser/components/extensions/ext-history.js
+++ b/browser/components/extensions/ext-history.js
@@ -125,17 +125,17 @@ function getObserver() {
},
};
EventEmitter.decorate(_observer);
PlacesUtils.history.addObserver(_observer, false);
}
return _observer;
}
-extensions.registerSchemaAPI("history", context => {
+extensions.registerSchemaAPI("history", "addon_parent", context => {
return {
history: {
addUrl: function(details) {
let transition, date;
try {
transition = getTransitionType(details.transition);
} catch (error) {
return Promise.reject({message: error.message});
--- a/browser/components/extensions/ext-pageAction.js
+++ b/browser/components/extensions/ext-pageAction.js
@@ -212,17 +212,17 @@ extensions.on("shutdown", (type, extensi
/* eslint-enable mozilla/balanced-listeners */
PageAction.for = extension => {
return pageActionMap.get(extension);
};
global.pageActionFor = PageAction.for;
-extensions.registerSchemaAPI("pageAction", context => {
+extensions.registerSchemaAPI("pageAction", "addon_parent", context => {
let {extension} = context;
return {
pageAction: {
onClicked: new EventManager(context, "pageAction.onClicked", fire => {
let listener = (evt, tab) => {
fire(TabManager.convert(extension, tab));
};
let pageAction = PageAction.for(extension);
--- a/browser/components/extensions/ext-tabs.js
+++ b/browser/components/extensions/ext-tabs.js
@@ -259,17 +259,17 @@ let tabListener = {
awaitTabReady(tab) {
return new Promise((resolve, reject) => {
this.tabReadyPromises.set(tab, {resolve, reject});
});
},
};
-extensions.registerSchemaAPI("tabs", context => {
+extensions.registerSchemaAPI("tabs", "addon_parent", context => {
let {extension} = context;
let self = {
tabs: {
onActivated: new WindowEventManager(context, "tabs.onActivated", "TabSelect", (fire, event) => {
let tab = event.originalTarget;
let tabId = TabManager.getId(tab);
let windowId = WindowManager.getId(tab.ownerGlobal);
fire({tabId, windowId});
--- a/browser/components/extensions/ext-windows.js
+++ b/browser/components/extensions/ext-windows.js
@@ -10,17 +10,17 @@ XPCOMUtils.defineLazyModuleGetter(this,
XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
"resource://gre/modules/PrivateBrowsingUtils.jsm");
Cu.import("resource://gre/modules/ExtensionUtils.jsm");
var {
EventManager,
} = ExtensionUtils;
-extensions.registerSchemaAPI("windows", context => {
+extensions.registerSchemaAPI("windows", "addon_parent", context => {
let {extension} = context;
return {
windows: {
onCreated:
new WindowEventManager(context, "windows.onCreated", "domwindowopened", (fire, window) => {
fire(WindowManager.convert(extension, window));
}).api(),
--- a/mobile/android/components/extensions/ext-pageAction.js
+++ b/mobile/android/components/extensions/ext-pageAction.js
@@ -112,17 +112,17 @@ extensions.on("manifest_page_action", (t
extensions.on("shutdown", (type, extension) => {
if (pageActionMap.has(extension)) {
pageActionMap.get(extension).shutdown();
pageActionMap.delete(extension);
}
});
/* eslint-enable mozilla/balanced-listeners */
-extensions.registerSchemaAPI("pageAction", context => {
+extensions.registerSchemaAPI("pageAction", "addon_parent", context => {
let {extension} = context;
return {
pageAction: {
onClicked: new SingletonEventManager(context, "pageAction.onClicked", fire => {
let listener = (event) => {
fire();
};
pageActionMap.get(extension).on("click", listener);
--- a/toolkit/components/extensions/Extension.jsm
+++ b/toolkit/components/extensions/Extension.jsm
@@ -113,17 +113,22 @@ const COMMENT_REGEXP = new RegExp(String
`.replace(/\s+/g, ""), "gm");
var ExtensionContext, GlobalManager;
// This object loads the ext-*.js scripts that define the extension API.
var Management = {
initialized: null,
scopes: [],
- schemaApis: [],
+ schemaApis: {
+ addon_parent: [],
+ addon_child: [],
+ content_parent: [],
+ content_child: [],
+ },
emitter: new EventEmitter(),
// Loads all the ext-*.js scripts currently registered.
lazyInit() {
if (this.initialized) {
return this.initialized;
}
@@ -147,54 +152,64 @@ var Management = {
this.initialized = promise;
return this.initialized;
},
/**
* Called by an ext-*.js script to register an API.
*
* @param {string} namespace The API namespace.
- * Used to determine whether the API should be generated when the caller
- * requests a subset of the available APIs (e.g. in content scripts).
+ * Intended to match the namespace of the generated API, but not used at
+ * the moment - see bugzil.la/1295774.
+ * @param {string} envType Restricts the API to contexts that run in the
+ * given environment. Must be one of the following:
+ * - "addon_parent" - addon APIs that runs in the main process.
+ * - "addon_child" - addon APIs that runs in an addon process.
+ * - "content_parent" - content script APIs that runs in the main process.
+ * - "content_child" - content script APIs that runs in a content process.
* @param {function(BaseContext)} getAPI A function that returns an object
* that will be merged with |chrome| and |browser|. The next example adds
* the create, update and remove methods to the tabs API.
*
- * registerSchemaAPI("tabs", (context) => ({
+ * registerSchemaAPI("tabs", "addon_parent", (context) => ({
* tabs: { create, update },
* }));
- * registerSchemaAPI("tabs", (context) => ({
+ * registerSchemaAPI("tabs", "addon_parent", (context) => ({
* tabs: { remove },
* }));
*/
- registerSchemaAPI(namespace, getAPI) {
- this.schemaApis.push({namespace, getAPI});
+ registerSchemaAPI(namespace, envType, getAPI) {
+ this.schemaApis[envType].push({namespace, getAPI});
+ if (envType === "addon_child") {
+ // TODO(robwu): Remove this. It is a temporary hack to ease the transition
+ // from ext-*.js running in the parent to APIs running in a child process.
+ // This can be removed once there is a dedicated ExtensionContext with type
+ // "addon_child".
+ this.schemaApis.addon_parent.push({namespace, getAPI});
+ }
},
// Mash together all the APIs from apis into obj.
- generateAPIs(context, apis, obj, namespaces = null) {
+ generateAPIs(context, apis, obj) {
// Recursively copy properties from source to dest.
function copy(dest, source) {
for (let prop in source) {
let desc = Object.getOwnPropertyDescriptor(source, prop);
if (typeof(desc.value) == "object") {
if (!(prop in dest)) {
dest[prop] = {};
}
copy(dest[prop], source[prop]);
} else {
Object.defineProperty(dest, prop, desc);
}
}
}
for (let api of apis) {
- if (namespaces && !namespaces.includes(api.namespace)) {
- continue;
- }
if (api.permission) {
if (!context.extension.hasPermission(api.permission)) {
continue;
}
}
api = api.getAPI(context);
copy(obj, api);
@@ -224,17 +239,19 @@ var Management = {
// |params| is an object with the following properties:
// |type| is one of "background", "popup", or "tab".
// |contentWindow| is the DOM window the content runs in.
// |uri| is the URI of the content (optional).
// |docShell| is the docshell the content runs in (optional).
// |incognito| is the content running in a private context (default: false).
ExtensionContext = class extends BaseContext {
constructor(extension, params) {
- super(extension);
+ // TODO(robwu): This should be addon_child once all ext- files are split.
+ // There should be a new ProxyContext instance with the "addon_parent" type.
+ super("addon_parent", extension);
let {type, uri} = params;
this.type = type;
this.uri = uri || extension.baseURI;
this.incognito = params.incognito || false;
if (params.contentWindow) {
this.setContentWindow(params.contentWindow);
@@ -300,21 +317,24 @@ ExtensionContext = class extends BaseCon
};
class ProxyContext extends ExtensionContext {
constructor(extension, params, messageManager, principal) {
params.contentWindow = null;
params.uri = NetUtil.newURI(params.url);
super(extension, params);
+ // TODO(robwu): Get ProxyContext to inherit from BaseContext instead of
+ // ExtensionContext and let callers specify the environment type.
+ this.envType = "content_parent";
this.messageManager = messageManager;
this.principal_ = principal;
this.apiObj = {};
- GlobalManager.injectInObject(this, null, this.apiObj, ["storage", "test"]);
+ GlobalManager.injectInObject(this, null, this.apiObj);
this.listenerProxies = new Map();
this.sandbox = Cu.Sandbox(principal, {});
}
get principal() {
return this.principal_;
@@ -604,22 +624,22 @@ GlobalManager = {
this.initialized = false;
}
},
getExtension(extensionId) {
return this.extensionMap.get(extensionId);
},
- injectInObject(context, defaultCallback, dest, namespaces = null) {
+ injectInObject(context, defaultCallback, dest) {
let apis = {
extensionTypes: {},
};
- Management.generateAPIs(context, Management.schemaApis, apis, namespaces);
- Management.generateAPIs(context, context.extension.apis, apis, namespaces);
+ Management.generateAPIs(context, Management.schemaApis[context.envType], apis);
+ Management.generateAPIs(context, context.extension.apis, apis);
let schemaWrapper = {
get principal() {
return context.principal;
},
get cloneScope() {
return context.cloneScope;
@@ -651,19 +671,16 @@ GlobalManager = {
} catch (e) {
promise = Promise.reject(e);
}
return context.wrapPromise(promise || Promise.resolve(), callback);
},
shouldInject(namespace, name) {
- if (namespaces && !namespaces.includes(namespace)) {
- return false;
- }
return findPathInObject(apis, [namespace]) != null;
},
getProperty(pathObj, path, name) {
return findPathInObject(apis, path)[name];
},
setProperty(pathObj, path, name, value) {
--- a/toolkit/components/extensions/ExtensionContent.jsm
+++ b/toolkit/components/extensions/ExtensionContent.jsm
@@ -310,17 +310,17 @@ function getWindowMessageManager(content
var DocumentManager;
var ExtensionManager;
// Scope in which extension content script code can run. It uses
// Cu.Sandbox to run the code. There is a separate scope for each
// frame.
class ExtensionContext extends BaseContext {
constructor(extension, contentWindow, contextOptions = {}) {
- super(extension);
+ super("content_child", extension);
let {isExtensionPage} = contextOptions;
this.isExtensionPage = isExtensionPage;
this.setContentWindow(contentWindow);
let frameId = WebNavigationFrames.getFrameId(contentWindow);
--- a/toolkit/components/extensions/ExtensionUtils.jsm
+++ b/toolkit/components/extensions/ExtensionUtils.jsm
@@ -157,17 +157,18 @@ class SpreadArgs extends Array {
super();
this.push(...args);
}
}
let gContextId = 0;
class BaseContext {
- constructor(extension) {
+ constructor(envType, extension) {
+ this.envType = envType;
this.onClose = new Set();
this.checkedLastError = false;
this._lastError = null;
this.contextId = `${++gContextId}-${Services.appinfo.uniqueProcessID}`;
this.unloaded = false;
this.extension = extension;
this.jsonSandbox = null;
this.active = true;
--- a/toolkit/components/extensions/ext-alarms.js
+++ b/toolkit/components/extensions/ext-alarms.js
@@ -88,17 +88,17 @@ extensions.on("shutdown", (type, extensi
alarm.clear();
}
alarmsMap.delete(extension);
alarmCallbacksMap.delete(extension);
}
});
/* eslint-enable mozilla/balanced-listeners */
-extensions.registerSchemaAPI("alarms", context => {
+extensions.registerSchemaAPI("alarms", "addon_parent", context => {
let {extension} = context;
return {
alarms: {
create: function(name, alarmInfo) {
name = name || "";
let alarms = alarmsMap.get(extension);
if (alarms.has(name)) {
alarms.get(name).clear();
--- a/toolkit/components/extensions/ext-backgroundPage.js
+++ b/toolkit/components/extensions/ext-backgroundPage.js
@@ -138,17 +138,17 @@ extensions.on("manifest_background", (ty
extensions.on("shutdown", (type, extension) => {
if (backgroundPagesMap.has(extension)) {
backgroundPagesMap.get(extension).shutdown();
backgroundPagesMap.delete(extension);
}
});
/* eslint-enable mozilla/balanced-listeners */
-extensions.registerSchemaAPI("extension", context => {
+extensions.registerSchemaAPI("extension", "addon_parent", context => {
let {extension} = context;
return {
extension: {
getBackgroundPage: function() {
return backgroundPagesMap.get(extension).contentWindow;
},
},
--- a/toolkit/components/extensions/ext-cookies.js
+++ b/toolkit/components/extensions/ext-cookies.js
@@ -233,17 +233,17 @@ function* query(detailsIn, props, extens
while (enumerator.hasMoreElements()) {
let cookie = enumerator.getNext().QueryInterface(Ci.nsICookie2);
if (matches(cookie)) {
yield cookie;
}
}
}
-extensions.registerSchemaAPI("cookies", context => {
+extensions.registerSchemaAPI("cookies", "addon_parent", context => {
let {extension} = context;
let self = {
cookies: {
get: function(details) {
// FIXME: We don't sort by length of path and creation time.
for (let cookie of query(details, ["url", "name", "storeId"], extension)) {
return Promise.resolve(convert(cookie));
}
--- a/toolkit/components/extensions/ext-downloads.js
+++ b/toolkit/components/extensions/ext-downloads.js
@@ -381,17 +381,17 @@ function queryHelper(query) {
if (matchFn(download)) {
results.push(download);
}
}
return results;
});
}
-extensions.registerSchemaAPI("downloads", context => {
+extensions.registerSchemaAPI("downloads", "addon_parent", context => {
let {extension} = context;
return {
downloads: {
download(options) {
if (options.filename != null) {
if (options.filename.length == 0) {
return Promise.reject({message: "filename must not be empty"});
}
--- a/toolkit/components/extensions/ext-extension.js
+++ b/toolkit/components/extensions/ext-extension.js
@@ -1,11 +1,11 @@
"use strict";
-extensions.registerSchemaAPI("extension", context => {
+extensions.registerSchemaAPI("extension", "addon_parent", context => {
let {extension} = context;
return {
extension: {
getURL: function(url) {
return extension.baseURI.resolve(url);
},
getViews: function(fetchProperties) {
--- a/toolkit/components/extensions/ext-i18n.js
+++ b/toolkit/components/extensions/ext-i18n.js
@@ -2,17 +2,17 @@
var {classes: Cc, interfaces: Ci, utils: Cu} = Components;
Cu.import("resource://gre/modules/ExtensionUtils.jsm");
var {
detectLanguage,
} = ExtensionUtils;
-extensions.registerSchemaAPI("i18n", context => {
+extensions.registerSchemaAPI("i18n", "addon_parent", context => {
let {extension} = context;
return {
i18n: {
getMessage: function(messageName, substitutions) {
return extension.localizeMessage(messageName, substitutions, {cloneScope: context.cloneScope});
},
getAcceptLanguages: function() {
--- a/toolkit/components/extensions/ext-idle.js
+++ b/toolkit/components/extensions/ext-idle.js
@@ -1,11 +1,11 @@
"use strict";
-extensions.registerSchemaAPI("idle", context => {
+extensions.registerSchemaAPI("idle", "addon_parent", context => {
return {
idle: {
queryState: function(detectionIntervalInSeconds) {
return Promise.resolve("active");
},
},
};
});
--- a/toolkit/components/extensions/ext-management.js
+++ b/toolkit/components/extensions/ext-management.js
@@ -11,17 +11,17 @@ function installType(addon) {
} else if (addon.foreignInstall) {
return "sideload";
} else if (addon.isSystem) {
return "other";
}
return "normal";
}
-extensions.registerSchemaAPI("management", context => {
+extensions.registerSchemaAPI("management", "addon_parent", context => {
let {extension} = context;
return {
management: {
getSelf: function() {
return new Promise((resolve, reject) => AddonManager.getAddonByID(extension.id, addon => {
try {
let m = extension.manifest;
let extInfo = {
--- a/toolkit/components/extensions/ext-notifications.js
+++ b/toolkit/components/extensions/ext-notifications.js
@@ -87,17 +87,17 @@ extensions.on("shutdown", (type, extensi
}
notificationsMap.delete(extension);
}
});
/* eslint-enable mozilla/balanced-listeners */
var nextId = 0;
-extensions.registerSchemaAPI("notifications", context => {
+extensions.registerSchemaAPI("notifications", "addon_parent", context => {
let {extension} = context;
return {
notifications: {
create: function(notificationId, options) {
if (!notificationId) {
notificationId = String(nextId++);
}
--- a/toolkit/components/extensions/ext-runtime.js
+++ b/toolkit/components/extensions/ext-runtime.js
@@ -15,17 +15,17 @@ var {
EventManager,
SingletonEventManager,
ignoreEvent,
} = ExtensionUtils;
XPCOMUtils.defineLazyModuleGetter(this, "NativeApp",
"resource://gre/modules/NativeMessaging.jsm");
-extensions.registerSchemaAPI("runtime", context => {
+extensions.registerSchemaAPI("runtime", "addon_parent", context => {
let {extension} = context;
return {
runtime: {
onStartup: new EventManager(context, "runtime.onStartup", fire => {
extension.onStartup = fire;
return () => {
extension.onStartup = null;
};
--- a/toolkit/components/extensions/ext-storage.js
+++ b/toolkit/components/extensions/ext-storage.js
@@ -5,17 +5,17 @@ var {classes: Cc, interfaces: Ci, utils:
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionStorage",
"resource://gre/modules/ExtensionStorage.jsm");
Cu.import("resource://gre/modules/ExtensionUtils.jsm");
var {
EventManager,
} = ExtensionUtils;
-extensions.registerSchemaAPI("storage", context => {
+function storageApiFactory(context) {
let {extension} = context;
return {
storage: {
local: {
get: function(keys) {
return ExtensionStorage.get(extension.id, keys);
},
set: function(items) {
@@ -36,9 +36,11 @@ extensions.registerSchemaAPI("storage",
ExtensionStorage.addOnChangedListener(extension.id, listener);
return () => {
ExtensionStorage.removeOnChangedListener(extension.id, listener);
};
}).api(),
},
};
-});
+}
+extensions.registerSchemaAPI("storage", "addon_parent", storageApiFactory);
+extensions.registerSchemaAPI("storage", "content_parent", storageApiFactory);
--- a/toolkit/components/extensions/ext-test.js
+++ b/toolkit/components/extensions/ext-test.js
@@ -20,17 +20,17 @@ extensions.on("shutdown", (type, extensi
extensions.on("test-message", (type, extension, ...args) => {
let handlers = messageHandlers.get(extension);
for (let handler of handlers) {
handler(...args);
}
});
/* eslint-enable mozilla/balanced-listeners */
-extensions.registerSchemaAPI("test", context => {
+function testApiFactory(context) {
let {extension} = context;
return {
test: {
sendMessage: function(...args) {
extension.emit("test-message", ...args);
},
notifyPass: function(msg) {
@@ -70,9 +70,11 @@ extensions.registerSchemaAPI("test", con
handlers.add(fire);
return () => {
handlers.delete(fire);
};
}).api(),
},
};
-});
+}
+extensions.registerSchemaAPI("test", "addon_parent", testApiFactory);
+extensions.registerSchemaAPI("test", "content_parent", testApiFactory);
--- a/toolkit/components/extensions/ext-webNavigation.js
+++ b/toolkit/components/extensions/ext-webNavigation.js
@@ -153,17 +153,17 @@ function convertGetFrameResult(tabId, da
errorOccurred: data.errorOccurred,
url: data.url,
tabId,
frameId: ExtensionManagement.getFrameId(data.windowId),
parentFrameId: ExtensionManagement.getParentFrameId(data.parentWindowId, data.windowId),
};
}
-extensions.registerSchemaAPI("webNavigation", context => {
+extensions.registerSchemaAPI("webNavigation", "addon_parent", context => {
return {
webNavigation: {
onBeforeNavigate: new WebNavigationEventManager(context, "onBeforeNavigate").api(),
onCommitted: new WebNavigationEventManager(context, "onCommitted").api(),
onDOMContentLoaded: new WebNavigationEventManager(context, "onDOMContentLoaded").api(),
onCompleted: new WebNavigationEventManager(context, "onCompleted").api(),
onErrorOccurred: new WebNavigationEventManager(context, "onErrorOccurred").api(),
onReferenceFragmentUpdated: new WebNavigationEventManager(context, "onReferenceFragmentUpdated").api(),
--- a/toolkit/components/extensions/ext-webRequest.js
+++ b/toolkit/components/extensions/ext-webRequest.js
@@ -95,17 +95,17 @@ function WebRequestEventManager(context,
};
};
return SingletonEventManager.call(this, context, name, register);
}
WebRequestEventManager.prototype = Object.create(SingletonEventManager.prototype);
-extensions.registerSchemaAPI("webRequest", context => {
+extensions.registerSchemaAPI("webRequest", "addon_parent", context => {
return {
webRequest: {
onBeforeRequest: new WebRequestEventManager(context, "onBeforeRequest").api(),
onBeforeSendHeaders: new WebRequestEventManager(context, "onBeforeSendHeaders").api(),
onSendHeaders: new WebRequestEventManager(context, "onSendHeaders").api(),
onHeadersReceived: new WebRequestEventManager(context, "onHeadersReceived").api(),
onBeforeRedirect: new WebRequestEventManager(context, "onBeforeRedirect").api(),
onResponseStarted: new WebRequestEventManager(context, "onResponseStarted").api(),
--- a/toolkit/components/extensions/test/xpcshell/test_ext_contexts.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_contexts.js
@@ -9,17 +9,17 @@ var {
BaseContext,
EventManager,
SingletonEventManager,
} = ExtensionUtils;
class StubContext extends BaseContext {
constructor() {
let fakeExtension = {id: "test@web.extension"};
- super(fakeExtension);
+ super("testEnv", fakeExtension);
this.sandbox = Cu.Sandbox(global);
}
get cloneScope() {
return this.sandbox;
}
}
@@ -123,17 +123,17 @@ add_task(function* test_post_unload_list
// promise resolution, which means we're guaranteed to return after
// any micro-tasks that get enqueued by the resolution handlers above.
yield new Promise(resolve => setTimeout(resolve, 0));
});
class Context extends BaseContext {
constructor(principal) {
let fakeExtension = {id: "test@web.extension"};
- super(fakeExtension);
+ super("testEnv", fakeExtension);
Object.defineProperty(this, "principal", {
value: principal,
configurable: true,
});
this.sandbox = Cu.Sandbox(principal, {wantXrays: false});
}
get cloneScope() {
--- a/toolkit/components/extensions/test/xpcshell/test_ext_schemas_api_injection.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_schemas_api_injection.js
@@ -44,34 +44,34 @@ let nestedNamespaceJson = [
add_task(function* testSchemaAPIInjection() {
let url = "data:," + JSON.stringify(nestedNamespaceJson);
// Load the schema of the fake APIs.
yield Schemas.load(url);
// Register an API that will skip the background page.
- Management.registerSchemaAPI("noBackgroundAPI.testnamespace", context => {
+ Management.registerSchemaAPI("noBackgroundAPI.testnamespace", "addon_child", context => {
if (context.type !== "background") {
return {
noBackgroundAPI: {
testnamespace: {
create(title) {},
},
},
};
}
// This API should not be available in this context, return null so that
// the schema wrapper is removed as well.
return null;
});
// Register an API that will skip any but the background page.
- Management.registerSchemaAPI("backgroundAPI.testnamespace", context => {
+ Management.registerSchemaAPI("backgroundAPI.testnamespace", "addon_child", context => {
if (context.type === "background") {
return {
backgroundAPI: {
testnamespace: {
create(title) {
return title;
},
},