Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* Any copyright is dedicated to the Public Domain.
"use strict";
/* import-globals-from helper-addons.js */
Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-addons.js", this);
// There are shutdown issues for which multiple rejections are left uncaught.
// See bug 1018184 for resolving these issues.
const { PromiseTestUtils } = ChromeUtils.importESModule(
);
PromiseTestUtils.allowMatchingRejectionsGlobally(/File closed/);
const ADDON_ID = "test-devtools-webextension@mozilla.org";
const ADDON_NAME = "test-devtools-webextension";
/**
* This test file ensures that the webextension addon developer toolbox:
* - always on top is enabled by default and can be toggled off
*/
add_task(async function testWebExtensionsToolbox() {
await enableExtensionDebugging();
const { document, tab, window } = await openAboutDebugging();
await selectThisFirefoxPage(document, window.AboutDebugging.store);
await installTemporaryExtensionFromXPI(
{
background() {
document.body.innerText = "Background Page Body Test Content";
},
id: ADDON_ID,
name: ADDON_NAME,
},
document
);
info("Open a toolbox to debug the addon");
const { devtoolsWindow } = await openAboutDevtoolsToolbox(
document,
tab,
window,
ADDON_NAME
);
const toolbox = getToolbox(devtoolsWindow);
ok(
isWindowAlwaysOnTop(devtoolsWindow),
"The toolbox window is always on top"
);
const toggleButton = toolbox.doc.querySelector(".toolbox-always-on-top");
ok(!!toggleButton, "The always on top toggle button is visible");
ok(
toggleButton.classList.contains("checked"),
"The button is highlighted to report that always on top is enabled"
);
// When running the test, the devtools window might not be focused, while it does IRL.
// Force it to be focused to better reflect the default behavior.
info("Force focusing the devtools window");
devtoolsWindow.focus();
// As we update the button with a debounce, we have to wait for it to updates
await waitFor(
() => toggleButton.classList.contains("toolbox-is-focused"),
"Wait for the button to be highlighting that the toolbox is focused (the button isn't highlighted)"
);
ok(true, "Expected class is added when toolbox is focused");
info("Focus the browser window");
window.focus();
await waitFor(
() => !toggleButton.classList.contains("toolbox-is-focused"),
"Wait for the button to be highlighting that the toolbox is no longer focused (the button is highlighted)"
);
ok(true, "Focused class is removed when browser window gets focused");
info("Re-focus the DevTools window");
devtoolsWindow.focus();
await waitFor(
() => toggleButton.classList.contains("toolbox-is-focused"),
"Wait for the button to be re-highlighting that the toolbox is focused"
);
const onToolboxReady = gDevTools.once("toolbox-ready");
info("Click on the button");
toggleButton.click();
info("Wait for a new toolbox to be created");
const secondToolbox = await onToolboxReady;
ok(
!isWindowAlwaysOnTop(secondToolbox.win),
"The toolbox window is no longer always on top"
);
const secondToggleButton = secondToolbox.doc.querySelector(
".toolbox-always-on-top"
);
ok(!!secondToggleButton, "The always on top toggle button is still visible");
ok(
!secondToggleButton.classList.contains("checked"),
"The button is no longer highlighted to report that always on top is disabled"
);
await closeWebExtAboutDevtoolsToolbox(secondToolbox.win, window);
await removeTemporaryExtension(ADDON_NAME, document);
await removeTab(tab);
});
// Check if the window has the "alwaysontop" chrome flag
function isWindowAlwaysOnTop(window) {
return (
window.docShell.treeOwner
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIAppWindow).chromeFlags &
Ci.nsIWebBrowserChrome.CHROME_ALWAYS_ON_TOP
);
}