Bug 1234150 - Support chrome_url_overrides field in WebExtension manifests. r=K-9, aswan
MozReview-Commit-ID: 9OSIVy6p2eN
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/ext-url-overrides.js
@@ -0,0 +1,40 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
+ "@mozilla.org/browser/aboutnewtab-service;1",
+ "nsIAboutNewTabService");
+
+let previousOverrides = {
+ newtab: [],
+};
+
+/* eslint-disable mozilla/balanced-listeners */
+extensions.on("manifest_chrome_url_overrides", (type, directive, extension, manifest) => {
+ let newtabOverride = extension.baseURI.resolve(manifest.chrome_url_overrides.newtab);
+
+ if (!newtabOverride) {
+ return;
+ }
+
+ if (!extension.isExtensionURL(newtabOverride)) {
+ return;
+ }
+
+ previousOverrides.newtab.push(aboutNewTabService.newTabURL);
+
+ aboutNewTabService.newTabURL = newtabOverride;
+});
+
+extensions.on("shutdown", (type, extension) => {
+ let lastIndex = previousOverrides.newtab.length - 1;
+ let lastOverride = previousOverrides.newtab[lastIndex];
+ aboutNewTabService.newTabURL = lastOverride;
+
+ previousOverrides.newtab.pop();
+});
+/* eslint-enable mozilla/balanced-listeners */
--- a/browser/components/extensions/extensions-browser.manifest
+++ b/browser/components/extensions/extensions-browser.manifest
@@ -3,16 +3,17 @@ category webextension-scripts bookmarks
category webextension-scripts browserAction chrome://browser/content/ext-browserAction.js
category webextension-scripts commands chrome://browser/content/ext-commands.js
category webextension-scripts contextMenus chrome://browser/content/ext-contextMenus.js
category webextension-scripts desktop-runtime chrome://browser/content/ext-desktop-runtime.js
category webextension-scripts history chrome://browser/content/ext-history.js
category webextension-scripts pageAction chrome://browser/content/ext-pageAction.js
category webextension-scripts sessions chrome://browser/content/ext-sessions.js
category webextension-scripts tabs chrome://browser/content/ext-tabs.js
+category webextension-scripts url-overrides chrome://browser/content/ext-url-overrides.js
category webextension-scripts utils chrome://browser/content/ext-utils.js
category webextension-scripts windows chrome://browser/content/ext-windows.js
# scripts that must run in the same process as addon code.
category webextension-scripts-addon contextMenus chrome://browser/content/ext-c-contextMenus.js
category webextension-scripts-addon tabs chrome://browser/content/ext-c-tabs.js
# schemas
--- a/browser/components/extensions/jar.mn
+++ b/browser/components/extensions/jar.mn
@@ -16,12 +16,13 @@ browser.jar:
content/browser/ext-browserAction.js
content/browser/ext-commands.js
content/browser/ext-contextMenus.js
content/browser/ext-desktop-runtime.js
content/browser/ext-history.js
content/browser/ext-pageAction.js
content/browser/ext-sessions.js
content/browser/ext-tabs.js
+ content/browser/ext-url-overrides.js
content/browser/ext-utils.js
content/browser/ext-windows.js
content/browser/ext-c-contextMenus.js
content/browser/ext-c-tabs.js
--- a/browser/components/extensions/test/browser/browser.ini
+++ b/browser/components/extensions/test/browser/browser.ini
@@ -88,16 +88,17 @@ tags = webextensions
[browser_ext_tabs_reload.js]
[browser_ext_tabs_reload_bypass_cache.js]
[browser_ext_tabs_sendMessage.js]
[browser_ext_tabs_cookieStoreId.js]
[browser_ext_tabs_update.js]
[browser_ext_tabs_zoom.js]
[browser_ext_tabs_update_url.js]
[browser_ext_topwindowid.js]
+[browser_ext_url_overrides.js]
[browser_ext_webNavigation_frameId0.js]
[browser_ext_webNavigation_getFrames.js]
[browser_ext_webNavigation_urlbar_transitions.js]
[browser_ext_windows.js]
[browser_ext_windows_allowScriptsToClose.js]
[browser_ext_windows_create.js]
tags = fullscreen
[browser_ext_windows_create_params.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_url_overrides.js
@@ -0,0 +1,32 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+XPCOMUtils.defineLazyServiceGetter(this, "aboutNewTabService",
+ "@mozilla.org/browser/aboutnewtab-service;1",
+ "nsIAboutNewTabService");
+const NEWTAB_URI = "webext-newtab.html";
+add_task(function* () {
+ is(aboutNewTabService.newTabURL, "about:newtab",
+ "Default newtab url should be about:newtab");
+
+ let extension = ExtensionTestUtils.loadExtension({
+ manifest: {
+ "chrome_url_overrides": {
+ newtab: NEWTAB_URI,
+ },
+ },
+ files: {
+ [NEWTAB_URI]: "This is my fancy custom new tab page",
+ },
+ });
+
+ yield extension.startup();
+
+ ok(aboutNewTabService.newTabURL.endsWith(NEWTAB_URI),
+ "Newtab url should be overriden by the extension.");
+ yield extension.unload();
+
+ is(aboutNewTabService.newTabURL, "about:newtab",
+ "Newtab url should be reset to about:newtab");
+});