Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os != 'win'
- Manifest: toolkit/components/windowwatcher/test/chrome.toml
<!DOCTYPE HTML>
<html>
<!--
Tests the alwaysOnTop window feature for the Windows OS.
-->
<head>
<meta charset="utf-8">
<title>Test an alwaysOnTop window on Windows</title>
<script type="application/javascript">
const {BrowserTestUtils} = ChromeUtils.importESModule(
);
const {ctypes} = ChromeUtils.importESModule(
"resource://gre/modules/ctypes.sys.mjs"
);
function assertAlwaysOnTop(win, expected) {
let docShell = win.docShell;
let chromeFlags = docShell.treeOwner
.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIAppWindow)
.chromeFlags;
let hasFlag = !!(chromeFlags & Ci.nsIWebBrowserChrome.CHROME_ALWAYS_ON_TOP);
is(hasFlag, expected, "Window should have CHROME_ALWAYS_ON_TOP flag.");
const hWND = Number(win.docShell.treeOwner.nsIBaseWindow.nativeHandle);
const WS_EX_TOPMOST = 0x00000008;
const GWL_EXSTYLE = -20;
let lib = ctypes.open("user32.dll");
// On 32-bit systems, the function we need to call is GetWindowLongW. On
// 64-bit systems, the function is GetWindowLongPtrW. Interestingly,
// the MSDN page[1] for GetWindowLongPtrW claims that calling it should work
// on both 32-bit and 64-bit, but that didn't appear to be the case here
// with local testing, hence the conditional.
//
let GetWindowFuncSymbol = Services.appinfo.is64Bit ? "GetWindowLongPtrW"
: "GetWindowLongW";
let GetWindowFunc = lib.declare(GetWindowFuncSymbol, ctypes.winapi_abi,
ctypes.intptr_t, ctypes.uintptr_t,
ctypes.int);
let styles = GetWindowFunc(hWND, GWL_EXSTYLE);
let isAlwaysOnTop = !!(styles & WS_EX_TOPMOST);
is(isAlwaysOnTop, expected, "Window should be always on top.");
lib.close();
}
if (Services.appinfo.OS != "WINNT") {
ok(false, "This test is only designed to run on Windows.");
} else {
add_task(async function() {
let normalWinOpened = BrowserTestUtils.domWindowOpenedAndLoaded();
window.openDialog("about:blank",
"_blank", "chrome,width=100,height=100,noopener", null);
let normalWin = await normalWinOpened;
ok(normalWin, "Normal window opened");
assertAlwaysOnTop(normalWin, false);
await BrowserTestUtils.closeWindow(normalWin);
let alwaysOnTopWinOpened = BrowserTestUtils.domWindowOpenedAndLoaded();
window.openDialog("about:blank",
"_blank", "chrome,width=100,height=100,alwaysOnTop,noopener", null);
let alwaysOnTopWin = await alwaysOnTopWinOpened;
ok(alwaysOnTopWin, "AlwaysOnTop window opened");
assertAlwaysOnTop(alwaysOnTopWin, true);
await BrowserTestUtils.closeWindow(alwaysOnTopWin);
});
}
</script>
</head>
<body>
<p id="display"></p>
<div id="content" style="display: none">
</div>
<pre id="test">
</pre>
</body>
</html>