summaryrefslogtreecommitdiffstats
path: root/devtools/startup/tests/browser/browser_shim_disable_devtools.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/startup/tests/browser/browser_shim_disable_devtools.js')
-rw-r--r--devtools/startup/tests/browser/browser_shim_disable_devtools.js165
1 files changed, 165 insertions, 0 deletions
diff --git a/devtools/startup/tests/browser/browser_shim_disable_devtools.js b/devtools/startup/tests/browser/browser_shim_disable_devtools.js
new file mode 100644
index 0000000000..1a16902099
--- /dev/null
+++ b/devtools/startup/tests/browser/browser_shim_disable_devtools.js
@@ -0,0 +1,165 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/* eslint-env browser */
+
+const { require } = ChromeUtils.importESModule(
+ "resource://devtools/shared/loader/Loader.sys.mjs"
+);
+
+const { gDevTools } = require("devtools/client/framework/devtools");
+
+async function simulateMenuOpen(menu) {
+ return new Promise(resolve => {
+ menu.addEventListener("popupshown", resolve, { once: true });
+ menu.dispatchEvent(new MouseEvent("popupshowing"));
+ menu.dispatchEvent(new MouseEvent("popupshown"));
+ });
+}
+
+async function simulateMenuClosed(menu) {
+ return new Promise(resolve => {
+ menu.addEventListener("popuphidden", resolve, { once: true });
+ menu.dispatchEvent(new MouseEvent("popuphiding"));
+ menu.dispatchEvent(new MouseEvent("popuphidden"));
+ });
+}
+
+/**
+ * Test that the preference devtools.policy.disabled disables entry points for devtools.
+ */
+add_task(async function () {
+ info(
+ "Disable DevTools entry points (does not apply to the already created window"
+ );
+ await new Promise(resolve => {
+ const options = { set: [["devtools.policy.disabled", true]] };
+ SpecialPowers.pushPrefEnv(options, resolve);
+ });
+
+ // In DEV_EDITION the browser starts with the developer-button in the toolbar. This
+ // applies to all new windows and forces creating keyboard shortcuts. The preference
+ // tested should not change without restart, but for the needs of the test, remove the
+ // developer-button from the UI before opening a new window.
+ if (AppConstants.MOZ_DEV_EDITION) {
+ CustomizableUI.removeWidgetFromArea("developer-button");
+ }
+
+ info(
+ "Open a new window, all window-specific hooks for DevTools will be disabled."
+ );
+ const win = OpenBrowserWindow({ private: false });
+ await waitForDelayedStartupFinished(win);
+
+ info(
+ "Open a new tab on the new window to ensure the focus is on the new window"
+ );
+ const tab = BrowserTestUtils.addTab(
+ win.gBrowser,
+ "data:text/html;charset=utf-8,<title>foo</title>"
+ );
+ await BrowserTestUtils.browserLoaded(win.gBrowser.getBrowserForTab(tab));
+
+ info(
+ "Synthesize a DevTools shortcut, the toolbox should not open on this new window."
+ );
+ synthesizeToggleToolboxKey(win);
+
+ // There is no event to wait for here as this shortcut should have no effect.
+ /* eslint-disable mozilla/no-arbitrary-setTimeout */
+ await new Promise(r => setTimeout(r, 1000));
+
+ is(gDevTools._toolboxesPerCommands.size, 0, "No toolbox has been opened");
+
+ info("Open the context menu for the content page.");
+ const contextMenu = win.document.getElementById("contentAreaContextMenu");
+ const popupShownPromise = BrowserTestUtils.waitForEvent(
+ contextMenu,
+ "popupshown"
+ );
+ EventUtils.synthesizeMouseAtCenter(
+ win.document.documentElement,
+ { type: "contextmenu", button: 2 },
+ win
+ );
+ await popupShownPromise;
+
+ const inspectElementItem = contextMenu.querySelector(`#context-inspect`);
+ ok(
+ inspectElementItem.hidden,
+ "The inspect element item is hidden in the context menu"
+ );
+
+ info("Close the context menu");
+ const onContextMenuHidden = BrowserTestUtils.waitForEvent(
+ contextMenu,
+ "popuphidden"
+ );
+ contextMenu.hidePopup();
+ await onContextMenuHidden;
+
+ info("Open the menubar Tools menu");
+ const toolsMenuPopup = win.document.getElementById("menu_ToolsPopup");
+ const browserToolsMenu = win.document.getElementById("browserToolsMenu");
+ ok(
+ !browserToolsMenu.hidden,
+ "The Browser Tools item of the tools menu is visible"
+ );
+
+ await simulateMenuOpen(toolsMenuPopup);
+ const subMenu = win.document.getElementById("menuWebDeveloperPopup");
+
+ info("Open the Browser Tools sub-menu");
+ await simulateMenuOpen(subMenu);
+
+ const visibleMenuItems = Array.from(
+ subMenu.querySelectorAll("menuitem")
+ ).filter(item => !item.hidden);
+
+ const { menuitems } = require("devtools/client/menus");
+ for (const devtoolsItem of menuitems) {
+ ok(
+ !visibleMenuItems.some(item => item.id === devtoolsItem.id),
+ "DevTools menu item is not visible in the Browser Tools menu"
+ );
+ }
+
+ info("Close out the menu popups");
+ await simulateMenuClosed(subMenu);
+ await simulateMenuClosed(toolsMenuPopup);
+
+ win.gBrowser.removeTab(tab);
+
+ info("Close the test window");
+ const winClosed = BrowserTestUtils.windowClosed(win);
+ win.BrowserTryToCloseWindow();
+ await winClosed;
+});
+
+function waitForDelayedStartupFinished(win) {
+ return new Promise(resolve => {
+ Services.obs.addObserver(function observer(subject, topic) {
+ if (win == subject) {
+ Services.obs.removeObserver(
+ observer,
+ "browser-delayed-startup-finished"
+ );
+ resolve();
+ }
+ }, "browser-delayed-startup-finished");
+ });
+}
+
+/**
+ * Helper to call the toggle devtools shortcut.
+ */
+function synthesizeToggleToolboxKey(win) {
+ info("Trigger the toogle toolbox shortcut");
+ if (Services.appinfo.OS == "Darwin") {
+ EventUtils.synthesizeKey("i", { accelKey: true, altKey: true }, win);
+ } else {
+ EventUtils.synthesizeKey("i", { accelKey: true, shiftKey: true }, win);
+ }
+}