Bug 1034036 - Part 2: Test that we stored correct z-indices and windows creation order, ensure we restore windows in reversed z-index. r?mikedeboer draft
authorBeekill95 <nnn_bikiu0707@yahoo.com>
Tue, 25 Jul 2017 10:53:04 +0700
changeset 661463 eee267e2733cac80bba6d34ad1c0fe3944e07f16
parent 661462 216b0100975980c115f58d1570aa6a05c3cfef6f
child 661464 56f9eda830f5eca9ecf0a5c5a8d6b6175acf8635
push id78760
push userbmo:nnn_bikiu0707@yahoo.com
push dateFri, 08 Sep 2017 13:24:18 +0000
reviewersmikedeboer
bugs1034036
milestone57.0a1
Bug 1034036 - Part 2: Test that we stored correct z-indices and windows creation order, ensure we restore windows in reversed z-index. r?mikedeboer MozReview-Commit-ID: HlAL2e6o7xX
browser/components/sessionstore/test/browser.ini
browser/components/sessionstore/test/browser_restore_reversed_z_order.js
--- a/browser/components/sessionstore/test/browser.ini
+++ b/browser/components/sessionstore/test/browser.ini
@@ -260,9 +260,9 @@ skip-if = !e10s # GroupedSHistory is e10
 [browser_duplicate_history.js]
 [browser_tabicon_after_bg_tab_crash.js]
 skip-if = !crashreporter || !e10s # Tabs can't crash without e10s
 
 [browser_cookies.js]
 [browser_cookies_legacy.js]
 [browser_cookies_privacy.js]
 [browser_speculative_connect.js]
-
+[browser_restore_reversed_z_order.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_restore_reversed_z_order.js
@@ -0,0 +1,155 @@
+const TEST_URLS_MAP = {
+  "about:about": "About About",
+  "about:license": "Licenses",
+  "about:profiles": "About Profiles",
+  "about:mozilla": "The Book of Mozilla, 15:1"
+};
+const TEST_URLS = Object.keys(TEST_URLS_MAP);
+const TEST_LABELS = Object.values(TEST_URLS_MAP);
+
+const Paths = SessionFile.Paths;
+const BROKEN_WM_Z_ORDER = AppConstants.platform != "macosx" && AppConstants.platform != "win";
+
+let source;
+let state;
+
+function promiseProvideWindow(url, features) {
+  return new Promise(resolve => provideWindow(resolve, url, features));
+}
+
+add_task(async function init() {
+  // Make sure that we start with only primary window.
+  await promiseAllButPrimaryWindowClosed();
+
+  let promises = [];
+  for (let i = 0; i < 4; ++i) {
+    let url = Object.keys(TEST_URLS_MAP)[i];
+    let window = await promiseProvideWindow();
+    BrowserTestUtils.loadURI(window.gBrowser, url);
+    if (i == 2) {
+      window.minimize();
+    }
+    // We want to get the lastest state from each window.
+    await BrowserTestUtils.waitForLocationChange(window.gBrowser, url);
+    await BrowserTestUtils.browserStopped(window.gBrowser.selectedBrowser, url);
+    promises.push(TabStateFlusher.flushWindow(window));
+  }
+
+  // Wait until we get the lastest history from all windows.
+  await Promise.all(promises);
+
+  // Force save state and read the written state.
+  source = await promiseRecoveryFileContents();
+  state = JSON.parse(source);
+
+  // Close all windows as we don't need them.
+  await promiseAllButPrimaryWindowClosed();
+});
+
+add_task(async function test_z_indices_are_saved_correctly() {
+  is(state.windows.length, 4, "Correct number of windows saved");
+
+  // Check if we saved state in correct order of creation.
+  for (let i = 0; i < TEST_URLS.length; ++i) {
+    is(state.windows[i].tabs[0].entries[0].url, TEST_URLS[i],
+       `Window #${i} is stored in correct creation order`);
+  }
+
+  // Check if we saved a valid zIndex (no null, no undefined or no 0).
+  for (let win of state.windows) {
+    ok(win.zIndex, "A valid zIndex is stored");
+  }
+
+  if (BROKEN_WM_Z_ORDER) {
+    // Last window should have zIndex of 2.
+    is(state.windows[3].zIndex, 2, "Currently using window has correct z-index");
+
+    // Other windows should have zIndex of 1.
+    is(state.windows[0].zIndex, 1, "Window #1 has correct z-index");
+    is(state.windows[1].zIndex, 1, "Window #2 has correct z-index");
+
+    // Minimized window should have zIndex of -1.
+    is(state.windows[2].zIndex, -1, "Minimized window has correct z-index");
+  } else {
+    is(state.windows[2].zIndex, -1, "Minimzed window has correct z-index");
+    ok(state.windows[0].zIndex != -1, "Window #1 shouldn't has z-index -1");
+    ok(state.windows[1].zIndex > state.windows[0].zIndex, "Window #2 has correct z-index");
+    ok(state.windows[3].zIndex > state.windows[1].zIndex, "Currently using window has correct z-index");
+  }
+});
+
+add_task(async function test_windows_are_restored_in_reversed_z_index() {
+  let windowsOpened = 1;
+  let windows = [window];
+  let windowsRestored = 0;
+  let tabsRestoredLabels = [];
+
+  // A defer promise that will be resolved once
+  // we restored all tabs.
+  let defer = {};
+  defer.promise = new Promise((resolve, reject) => {
+    defer.resolve = resolve;
+    defer.reject = reject;
+  });
+
+  function allTabsRestored() {
+    is(tabsRestoredLabels[0], TEST_LABELS[3], "First restored tab should be previous used tab");
+    // We don't care about restoration order of windows in between the first and last window
+    // when the OS has broken vm z-order.
+    if (!BROKEN_WM_Z_ORDER) {
+      is(tabsRestoredLabels[1], TEST_LABELS[1], "Second restored tab is correct");
+      is(tabsRestoredLabels[2], TEST_LABELS[0], "Third restored tab is correct");
+    }
+    is(tabsRestoredLabels[3], TEST_LABELS[2], "Last restored tab should be in minimized window");
+
+    // Finish the test.
+    defer.resolve();
+  }
+
+  function onSSWindowRestored(aEvent) {
+    if (++windowsRestored == 4) {
+      // Remove the event listener from each window
+      windows.forEach(function(win) {
+        win.removeEventListener("SSWindowRestored", onSSWindowRestored, true);
+      });
+      executeSoon(allTabsRestored);
+    }
+    tabsRestoredLabels.push(aEvent.target.gBrowser.tabs[0].label);
+  }
+
+  // Used to add our listener to further windows so we can catch SSWindowRestored
+  // coming from them when creating a multi-window state.
+  function windowObserver(aSubject, aTopic, aData) {
+    if (aTopic == "domwindowopened") {
+      let newWindow = aSubject.QueryInterface(Ci.nsIDOMWindow);
+      newWindow.addEventListener("load", function() {
+        if (++windowsOpened == 3) {
+          Services.ww.unregisterNotification(windowObserver);
+        }
+
+        // Track this window so we can remove the progress listener later.
+        windows.push(newWindow);
+        // Add the progress listener.
+        newWindow.addEventListener("SSWindowRestored", onSSWindowRestored, true);
+      }, { once: true });
+    }
+  }
+
+  Services.ww.registerNotification(windowObserver);
+  registerCleanupFunction(function() {
+    windows.forEach(function(win) {
+      win.removeEventListener("SSWindowRestored", onSSWindowRestored, true);
+      if (win !== window) {
+        BrowserTestUtils.closeWindow(win);
+      }
+    });
+  });
+
+  window.addEventListener("SSWindowRestored", onSSWindowRestored, true);
+
+  // Restore states.
+  ss.setBrowserState(source);
+
+  await defer.promise;
+});
+