Bug 1332273 - Lock registered content scripts API method behind a preference. draft
authorLuca Greco <lgreco@mozilla.com>
Sun, 03 Sep 2017 21:14:08 +0200
changeset 658712 1d5dbf28d8f1e7ff0824014f314b53042458ab1a
parent 658711 127124cdfcf7f87267645edfe1b07c1b0bde2eda
child 729728 76523ec5fef1257c2d2a4faf29015d56b668e414
push id77846
push userluca.greco@alcacoop.it
push dateMon, 04 Sep 2017 15:06:35 +0000
bugs1332273
milestone56.0a1
Bug 1332273 - Lock registered content scripts API method behind a preference. MozReview-Commit-ID: DnGlyV3CsZw
toolkit/components/extensions/ext-registerContentScript.js
toolkit/components/extensions/test/xpcshell/test_ext_contentscript_registering.js
--- a/toolkit/components/extensions/ext-registerContentScript.js
+++ b/toolkit/components/extensions/ext-registerContentScript.js
@@ -10,16 +10,21 @@ Cu.import("resource://gre/modules/Extens
 var {
   DefaultWeakMap,
 } = ExtensionUtils;
 
 XPCOMUtils.defineLazyServiceGetter(this, "uuidGen",
                                    "@mozilla.org/uuid-generator;1",
                                    "nsIUUIDGenerator");
 
+XPCOMUtils.defineLazyPreferenceGetter(
+  this, "registeredContentScriptsEnabled",
+  "extensions.webextensions.experimental.registeredContentScripts"
+);
+
 function generateRegisteredScriptId() {
   let uuid = uuidGen.generateUUID().number;
   uuid = uuid.slice(1, -1); // Strip { and } off the UUID.
 
   return uuid;
 }
 
 class RegisteredContentScript {
@@ -148,16 +153,22 @@ function initRegisteredContentScript(con
 
         contextScriptIds.clear();
       },
     });
   }
 }
 
 global.registerContentScript = async function(context, options) {
+  if (!registeredContentScriptsEnabled) {
+    return Promise.reject({
+      message: "registerContentScript has not been enabled in the user preferences",
+    });
+  }
+
   initRegisteredContentScript(context);
 
   const {extension} = context;
 
   for (let origin of options.matches) {
     if (!context.extension.whiteListedHosts.subsumes(new MatchPattern(origin))) {
       return Promise.reject({
         message: `Cannot register a content script for ${origin}`,
@@ -175,16 +186,22 @@ global.registerContentScript = async fun
   contextScriptIds.add(scriptId);
 
   extension.broadcast("Extension:RegisterContentScript", contentScript.serialize());
 
   return scriptId;
 };
 
 global.unregisterContentScript = async function(context, scriptId) {
+  if (!registeredContentScriptsEnabled) {
+    return Promise.reject({
+      message: "registerContentScript has not been enabled in the user preferences",
+    });
+  }
+
   initRegisteredContentScript(context);
 
   const {extension} = context;
 
   const extensionRegisteredScripts = registeredContentScripts.get(extension);
   const contextScriptIds = contextRegisteredScriptIds.get(context);
 
   if (!contextScriptIds.has(scriptId)) {
--- a/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_registering.js
+++ b/toolkit/components/extensions/test/xpcshell/test_ext_contentscript_registering.js
@@ -8,16 +8,20 @@ AddonTestUtils.init(this);
 
 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "49");
 
 const server = createHttpServer();
 server.registerDirectory("/data/", do_get_file("data"));
 
 const BASE_URL = `http://localhost:${server.identity.primaryPort}/data`;
 
+add_task(function() {
+  Services.prefs.setBoolPref("extensions.webextensions.experimental.registeredContentScripts", true);
+});
+
 add_task(async function test_registeredContentscripts() {
   async function background() {
     browser.runtime.onMessage.addListener(([msg, expectedStates, readyState], sender) => {
       if (msg == "chrome-namespace-ok") {
         browser.test.sendMessage(msg);
         return;
       }
 
@@ -291,8 +295,12 @@ add_task(async function test_registeredC
   equal(unregisteredBlobStylesResults.registeredExtensionUrlStyleBG, "rgba(0, 0, 0, 0)",
         "The expected style has been applied once extension url style has been unregistered");
   equal(unregisteredBlobStylesResults.registeredExtensionBlobStyleBG, "rgba(0, 0, 0, 0)",
         "The expected style has been applied once extension blob style has been unregistered");
 
   await contentPage.close();
   await extension.unload();
 });
+
+add_task(function() {
+  Services.prefs.clearUserPref("extension.webextensions.experimental.registerContentScript");
+});