Mypal68/browser/base/content/test/general/browser_windowactivation.js
2022-04-16 07:41:55 +03:00

197 lines
5.4 KiB
JavaScript

/*
* This test checks that window activation state is set properly with multiple tabs.
*/
/* eslint-env mozilla/frame-script */
const testPage = getRootDirectory(gTestPath) + "file_window_activation.html";
const testPage2 = getRootDirectory(gTestPath) + "file_window_activation2.html";
var colorChangeNotifications = 0;
var otherWindow;
var browser1, browser2;
add_task(async function reallyRunTests() {
let tab1 = await BrowserTestUtils.openNewForegroundTab(gBrowser, testPage);
browser1 = tab1.linkedBrowser;
// This can't use openNewForegroundTab because if we focus tab2 now, we
// won't send a focus event during test 6, further down in this file.
let tab2 = BrowserTestUtils.addTab(gBrowser, testPage);
browser2 = tab2.linkedBrowser;
await BrowserTestUtils.browserLoaded(browser2);
browser1.messageManager.loadFrameScript(
"data:,(" + childFunction.toString() + ")();",
true
);
browser2.messageManager.loadFrameScript(
"data:,(" + childFunction.toString() + ")();",
true
);
gURLBar.focus();
let testFinished = {};
testFinished.promise = new Promise(
resolve => (testFinished.resolve = resolve)
);
// The test performs four checks, using -moz-window-inactive on two child tabs.
// First, the initial state should be transparent. The second check is done
// while another window is focused. The third check is done after that window
// is closed and the main window focused again. The fourth check is done after
// switching to the second tab.
window.messageManager.addMessageListener(
"Test:BackgroundColorChanged",
function(message) {
colorChangeNotifications++;
switch (colorChangeNotifications) {
case 1:
is(message.data.color, "rgba(0, 0, 0, 0)", "first window initial");
break;
case 2:
is(message.data.color, "rgba(0, 0, 0, 0)", "second window initial");
runOtherWindowTests();
break;
case 3:
is(message.data.color, "rgb(255, 0, 0)", "first window lowered");
break;
case 4:
is(message.data.color, "rgb(255, 0, 0)", "second window lowered");
sendGetBackgroundRequest(true);
otherWindow.close();
break;
case 5:
is(message.data.color, "rgba(0, 0, 0, 0)", "first window raised");
break;
case 6:
is(message.data.color, "rgba(0, 0, 0, 0)", "second window raised");
gBrowser.selectedTab = tab2;
break;
case 7:
is(
message.data.color,
"rgba(0, 0, 0, 0)",
"first window after tab switch"
);
break;
case 8:
is(
message.data.color,
"rgba(0, 0, 0, 0)",
"second window after tab switch"
);
testFinished.resolve();
break;
case 9:
ok(false, "too many color change notifications");
break;
}
}
);
window.messageManager.addMessageListener("Test:FocusReceived", function(
message
) {
// No color change should occur after a tab switch.
if (colorChangeNotifications == 6) {
sendGetBackgroundRequest(false);
}
});
window.messageManager.addMessageListener("Test:ActivateEvent", function(
message
) {
ok(message.data.ok, "Test:ActivateEvent");
});
window.messageManager.addMessageListener("Test:DeactivateEvent", function(
message
) {
ok(message.data.ok, "Test:DeactivateEvent");
});
gBrowser.selectedTab = tab1;
// Start the test.
sendGetBackgroundRequest(true);
await testFinished.promise;
BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2);
otherWindow = null;
});
function sendGetBackgroundRequest(ifChanged) {
browser1.messageManager.sendAsyncMessage("Test:GetBackgroundColor", {
ifChanged,
});
browser2.messageManager.sendAsyncMessage("Test:GetBackgroundColor", {
ifChanged,
});
}
function runOtherWindowTests() {
otherWindow = window.open(testPage2, "", "chrome");
waitForFocus(function() {
sendGetBackgroundRequest(true);
}, otherWindow);
}
function childFunction() {
let oldColor = null;
let expectingResponse = false;
let ifChanged = true;
addMessageListener("Test:GetBackgroundColor", function(message) {
expectingResponse = true;
ifChanged = message.data.ifChanged;
});
content.addEventListener("focus", function() {
sendAsyncMessage("Test:FocusReceived", {});
});
var windowGotActivate = false;
var windowGotDeactivate = false;
addEventListener("activate", function() {
sendAsyncMessage("Test:ActivateEvent", { ok: !windowGotActivate });
windowGotActivate = false;
});
addEventListener("deactivate", function() {
sendAsyncMessage("Test:DeactivateEvent", { ok: !windowGotDeactivate });
windowGotDeactivate = false;
});
content.addEventListener("activate", function() {
windowGotActivate = true;
});
content.addEventListener("deactivate", function() {
windowGotDeactivate = true;
});
content.setInterval(function() {
if (!expectingResponse) {
return;
}
let area = content.document.getElementById("area");
if (!area) {
return; /* hasn't loaded yet */
}
let color = content.getComputedStyle(area).backgroundColor;
if (oldColor != color || !ifChanged) {
expectingResponse = false;
oldColor = color;
sendAsyncMessage("Test:BackgroundColorChanged", { color });
}
}, 20);
}