summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/general/browser_windowactivation.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/test/general/browser_windowactivation.js')
-rw-r--r--browser/base/content/test/general/browser_windowactivation.js183
1 files changed, 183 insertions, 0 deletions
diff --git a/browser/base/content/test/general/browser_windowactivation.js b/browser/base/content/test/general/browser_windowactivation.js
new file mode 100644
index 000000000..ae4ba75dc
--- /dev/null
+++ b/browser/base/content/test/general/browser_windowactivation.js
@@ -0,0 +1,183 @@
+/*
+ * This test checks that window activation state is set properly with multiple tabs.
+ */
+
+var testPage = "data:text/html,<body><style>:-moz-window-inactive { background-color: red; }</style><div id='area'></div></body>";
+
+var colorChangeNotifications = 0;
+var otherWindow;
+
+var browser1, browser2;
+
+function test() {
+ waitForExplicitFinish();
+ waitForFocus(reallyRunTests);
+}
+
+function reallyRunTests() {
+
+ let tab1 = gBrowser.addTab();
+ let tab2 = gBrowser.addTab();
+ browser1 = gBrowser.getBrowserForTab(tab1);
+ browser2 = gBrowser.getBrowserForTab(tab2);
+
+ gURLBar.focus();
+
+ var loadCount = 0;
+ function check()
+ {
+ // wait for both tabs to load
+ if (++loadCount != 2) {
+ return;
+ }
+
+ browser1.removeEventListener("load", check, true);
+ browser2.removeEventListener("load", check, true);
+
+ sendGetBackgroundRequest(true);
+ }
+
+ // 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, "transparent", "first window initial");
+ break;
+ case 2:
+ is(message.data.color, "transparent", "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, "transparent", "first window raised");
+ break;
+ case 6:
+ is(message.data.color, "transparent", "second window raised");
+ gBrowser.selectedTab = tab2;
+ break;
+ case 7:
+ is(message.data.color, "transparent", "first window after tab switch");
+ break;
+ case 8:
+ is(message.data.color, "transparent", "second window after tab switch");
+ finishTest();
+ 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");
+ });
+
+ browser1.addEventListener("load", check, true);
+ browser2.addEventListener("load", check, true);
+ browser1.contentWindow.location = testPage;
+ browser2.contentWindow.location = testPage;
+
+ browser1.messageManager.loadFrameScript("data:,(" + childFunction.toString() + ")();", true);
+ browser2.messageManager.loadFrameScript("data:,(" + childFunction.toString() + ")();", true);
+
+ gBrowser.selectedTab = tab1;
+}
+
+function sendGetBackgroundRequest(ifChanged)
+{
+ browser1.messageManager.sendAsyncMessage("Test:GetBackgroundColor", { ifChanged: ifChanged });
+ browser2.messageManager.sendAsyncMessage("Test:GetBackgroundColor", { ifChanged: ifChanged });
+}
+
+function runOtherWindowTests() {
+ otherWindow = window.open("data:text/html,<body>Hi</body>", "", "chrome");
+ waitForFocus(function () {
+ sendGetBackgroundRequest(true);
+ }, otherWindow);
+}
+
+function finishTest()
+{
+ gBrowser.removeCurrentTab();
+ gBrowser.removeCurrentTab();
+ otherWindow = null;
+ finish();
+}
+
+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", { });
+ }, false);
+
+ 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: color });
+ }
+ }, 20);
+}