/* 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,foo" ); 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) { 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); } }