Bug 1429185 - Implement policy for disabling devtools;r=Felipe draft
authorJulian Descottes <jdescottes@mozilla.com>
Fri, 23 Feb 2018 18:55:53 +0100
changeset 760088 78f5b5caa90c4586266b8a086344c7bce1544e74
parent 759848 1ceab46ff89f0330aa4a492b6b064501d74da180
child 760089 cf52daf3d5ec89b4b4b6925f78ea45254953dd76
push id100536
push userjdescottes@mozilla.com
push dateMon, 26 Feb 2018 21:31:17 +0000
reviewersFelipe
bugs1429185
milestone60.0a1
Bug 1429185 - Implement policy for disabling devtools;r=Felipe MozReview-Commit-ID: D6ZvP7vWg4O
browser/components/enterprisepolicies/Policies.jsm
browser/components/enterprisepolicies/schemas/policies-schema.json
browser/components/enterprisepolicies/tests/browser/disable_developer_tools/browser.ini
browser/components/enterprisepolicies/tests/browser/disable_developer_tools/browser_policy_disable_developer_tools.js
browser/components/enterprisepolicies/tests/browser/disable_developer_tools/config_disable_developer_tools.json
browser/components/enterprisepolicies/tests/moz.build
--- a/browser/components/enterprisepolicies/Policies.jsm
+++ b/browser/components/enterprisepolicies/Policies.jsm
@@ -86,16 +86,30 @@ this.Policies = {
   "DisableAppUpdate": {
     onBeforeAddons(manager, param) {
       if (param) {
         manager.disallowFeature("appUpdate");
       }
     }
   },
 
+  "DisableDeveloperTools": {
+    onBeforeAddons(manager, param) {
+      if (param) {
+        setAndLockPref("devtools.policy.disabled", true);
+        setAndLockPref("devtools.chrome.enabled", false);
+
+        manager.disallowFeature("devtools");
+        manager.disallowFeature("about:devtools");
+        manager.disallowFeature("about:debugging");
+        manager.disallowFeature("about:devtools-toolbox");
+      }
+    }
+  },
+
   "DisableFirefoxScreenshots": {
     onBeforeAddons(manager, param) {
       if (param) {
         setAndLockPref("extensions.screenshots.disabled", true);
       }
     }
   },
 
--- a/browser/components/enterprisepolicies/schemas/policies-schema.json
+++ b/browser/components/enterprisepolicies/schemas/policies-schema.json
@@ -76,16 +76,23 @@
       "description": "Prevent the browser from updating.",
       "first_available": "60.0",
       "enterprise_only": true,
 
       "type": "boolean",
       "enum": [true]
     },
 
+    "DisableDeveloperTools": {
+      "description": "Prevents access to developer tools.",
+      "first_available": "60.0",
+
+      "type": "boolean"
+    },
+
     "DisableFirefoxScreenshots": {
       "description": "Prevents usage of the Firefox Screenshots feature.",
       "first_available": "60.0",
 
       "type": "boolean",
       "enum": [true]
     },
 
new file mode 100644
--- /dev/null
+++ b/browser/components/enterprisepolicies/tests/browser/disable_developer_tools/browser.ini
@@ -0,0 +1,8 @@
+[DEFAULT]
+prefs =
+  browser.policies.enabled=true
+  browser.policies.alternatePath='<test-root>/browser/components/enterprisepolicies/tests/browser/disable_developer_tools/config_disable_developer_tools.json'
+support-files =
+  config_disable_developer_tools.json
+
+[browser_policy_disable_developer_tools.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/enterprisepolicies/tests/browser/disable_developer_tools/browser_policy_disable_developer_tools.js
@@ -0,0 +1,44 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+var updateService = Cc["@mozilla.org/updates/update-service;1"].
+                    getService(Ci.nsIApplicationUpdateService);
+
+add_task(async function test_updates_post_policy() {
+  is(Services.policies.isAllowed("devtools"), false,
+     "devtools should be disabled by policy.");
+
+  is(Services.prefs.getBoolPref("devtools.policy.disabled"), true,
+     "devtools dedicated disabled pref is set to true");
+
+  Services.prefs.setBoolPref("devtools.policy.disabled", false);
+
+  is(Services.prefs.getBoolPref("devtools.policy.disabled"), true,
+     "devtools dedicated disabled pref can not be updated");
+
+  await expectErrorPage("about:devtools");
+  await expectErrorPage("about:devtools-toolbox");
+  await expectErrorPage("about:debugging");
+
+  let testURL = "data:text/html;charset=utf-8,test";
+  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, testURL, false);
+
+  info("Check that devtools menu items are hidden");
+  let toolsMenu = window.document.getElementById("webDeveloperMenu");
+  ok(toolsMenu.hidden, "The Web Developer item of the tools menu is hidden");
+  let hamburgerMenu = window.document.getElementById("appMenu-developer-button");
+  ok(hamburgerMenu.hidden, "The Web Developer item of the hamburger menu is hidden");
+
+  await BrowserTestUtils.removeTab(tab);
+});
+
+const expectErrorPage = async function(url) {
+  info(`Wait for ${url} to open the net error page`);
+  let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url, false);
+  await ContentTask.spawn(tab.linkedBrowser, null, async function() {
+    ok(content.document.documentURI.startsWith("about:neterror"),
+       "DevTools about: page should display the net error page");
+  });
+  await BrowserTestUtils.removeTab(tab);
+};
new file mode 100644
--- /dev/null
+++ b/browser/components/enterprisepolicies/tests/browser/disable_developer_tools/config_disable_developer_tools.json
@@ -0,0 +1,5 @@
+{
+  "policies": {
+    "DisableDeveloperTools": true
+  }
+}
--- a/browser/components/enterprisepolicies/tests/moz.build
+++ b/browser/components/enterprisepolicies/tests/moz.build
@@ -4,10 +4,11 @@
 # 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/.
 
 with Files("**"):
     BUG_COMPONENT = ("Firefox", "General")
 
 BROWSER_CHROME_MANIFESTS += [
     'browser/browser.ini',
-    'browser/disable_app_update/browser.ini'
+    'browser/disable_app_update/browser.ini',
+    'browser/disable_developer_tools/browser.ini',
 ]