Bug 819510 - Quitting from a Private Browsing window makes Restore Previous Session fail once; r=ttaubert
authorBellindira Castillo [:bellindira] <bellindira@appcoast.com>
Fri, 14 Dec 2012 14:06:45 -0600
changeset 125247 e28f0f4b25a4e76ab368a88b12fd67a29c9faefd
parent 125246 c6e671c2f43c14fd7f26eb1824bbdb6e38500dc0
child 125248 e570d3a26106cc0050daf1781ed0455798facf72
push id2151
push userlsblakk@mozilla.com
push dateTue, 19 Feb 2013 18:06:57 +0000
treeherdermozilla-beta@4952e88741ec [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersttaubert
bugs819510
milestone20.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 819510 - Quitting from a Private Browsing window makes Restore Previous Session fail once; r=ttaubert
browser/components/sessionstore/src/SessionStore.jsm
browser/components/sessionstore/test/Makefile.in
browser/components/sessionstore/test/browser_819510_perwindowpb.js
--- a/browser/components/sessionstore/src/SessionStore.jsm
+++ b/browser/components/sessionstore/src/SessionStore.jsm
@@ -3706,16 +3706,19 @@ let SessionStoreInternal = {
       return;
     }
 
 #ifdef MOZ_PER_WINDOW_PRIVATE_BROWSING
     // Forget about private windows.
     for (let i = oState.windows.length - 1; i >= 0; i--) {
       if (oState.windows[i].isPrivate) {
         oState.windows.splice(i, 1);
+        if (oState.selectedWindow >= i) {
+          oState.selectedWindow--;
+        }
       }
     }
     for (let i = oState._closedWindows.length - 1; i >= 0; i--) {
       if (oState._closedWindows[i].isPrivate) {
         oState._closedWindows.splice(i, 1);
       }
     }
 #endif
--- a/browser/components/sessionstore/test/Makefile.in
+++ b/browser/components/sessionstore/test/Makefile.in
@@ -132,16 +132,17 @@ MOCHITEST_BROWSER_FILES = \
 	$(filter disabled-for-intermittent-failures--bug-766044, browser_459906_sample.html) \
 	$(filter disabled-for-intermittent-failures--bug-765389, browser_461743_sample.html) \
 	$(NULL)
 
 ifdef MOZ_PER_WINDOW_PRIVATE_BROWSING
 MOCHITEST_BROWSER_FILES += \
 	browser_354894_perwindowpb.js \
 	browser_394759_perwindowpb.js \
+	browser_819510_perwindowpb.js \
 	$(NULL)
 else
 MOCHITEST_BROWSER_FILES += \
 	browser_248970_a.js \
 	browser_248970_b.js \
 	browser_354894.js \
 	browser_394759_privatebrowsing.js \
 	$(NULL)
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_819510_perwindowpb.js
@@ -0,0 +1,171 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+const originalState = ss.getBrowserState();
+
+/** Private Browsing Test for Bug 819510 **/
+function test() {
+  waitForExplicitFinish();
+
+  registerCleanupFunction(function() {
+    Services.prefs.clearUserPref("browser.sessionstore.interval");
+    ss.setBrowserState(originalState);
+  });
+
+  runNextTest();
+}
+
+let tests = [
+  test_1,
+  test_2,
+  test_3,
+];
+
+const testState = {
+  windows: [{
+    tabs: [
+      { entries: [{ url: "about:blank" }] },
+    ]
+  }]
+};
+
+function runNextTest() {
+  // Set an empty state
+  let windowsEnum = Services.wm.getEnumerator("navigator:browser");
+  while (windowsEnum.hasMoreElements()) {
+    let currentWindow = windowsEnum.getNext();
+    if (currentWindow != window) {
+      currentWindow.close();
+    }
+  }
+
+  // Run the next test, or finish
+  if (tests.length) {
+    let currentTest = tests.shift();
+    waitForBrowserState(testState, currentTest);
+  }
+  else {
+    Services.prefs.clearUserPref("browser.sessionstore.interval");
+    ss.setBrowserState(originalState);
+    finish();
+  }
+}
+
+// Test opening default mochitest-normal-private-normal-private windows
+// (saving the state with last window being private)
+function test_1() {
+  testOnWindow(false, function(aWindow) {
+    aWindow.gBrowser.addTab("http://www.example.com/1");
+    testOnWindow(true, function(aWindow) {
+      aWindow.gBrowser.addTab("http://www.example.com/2");
+      testOnWindow(false, function(aWindow) {
+        aWindow.gBrowser.addTab("http://www.example.com/3");
+        testOnWindow(true, function(aWindow) {
+          aWindow.gBrowser.addTab("http://www.example.com/4");
+
+          let curState = JSON.parse(ss.getBrowserState());
+          is (curState.windows.length, 5, "Browser has opened 5 windows");
+          is (curState.windows[2].isPrivate, true, "Window is private");
+          is (curState.windows[4].isPrivate, true, "Last window is private");
+          is (curState.selectedWindow, 5, "Last window opened is the one selected");
+
+          Services.obs.addObserver(function observe(aSubject, aTopic, aData) {
+            Services.obs.removeObserver(observe, aTopic);
+            aSubject.QueryInterface(Ci.nsISupportsString);
+            let state = JSON.parse(aSubject.data);
+            is(state.windows.length, 3,
+              "sessionstore state: 3 windows in data being writted to disk");
+            is (state.selectedWindow, 3,
+              "Selected window is updated to match one of the saved windows");
+            state.windows.forEach(function(win) {
+              is(!win.isPrivate, true, "Saved window is not private");
+            });
+            is(state._closedWindows.length, 0,
+              "sessionstore state: no closed windows in data being writted to disk");
+            runNextTest();
+          }, "sessionstore-state-write", false);
+
+          Services.prefs.setIntPref("browser.sessionstore.interval", 0);
+        });
+      });
+    });
+  });
+}
+
+// Test opening default mochitest window + 2 private windows
+function test_2() {
+testOnWindow(true, function(aWindow) {
+  aWindow.gBrowser.addTab("http://www.example.com/1");
+    testOnWindow(true, function(aWindow) {
+      aWindow.gBrowser.addTab("http://www.example.com/2");
+
+      let curState = JSON.parse(ss.getBrowserState());
+      is (curState.windows.length, 3, "Browser has opened 3 windows");
+      is (curState.windows[1].isPrivate, true, "Window 1 is private");
+      is (curState.windows[2].isPrivate, true, "Window 2 is private");
+      is (curState.selectedWindow, 3, "Last window opened is the one selected");
+
+      Services.obs.addObserver(function observe(aSubject, aTopic, aData) {
+        Services.obs.removeObserver(observe, aTopic);
+        aSubject.QueryInterface(Ci.nsISupportsString);
+        let state = JSON.parse(aSubject.data);
+        is(state.windows.length, 1,
+          "sessionstore state: 1 windows in data being writted to disk");
+        is (state.selectedWindow, 1,
+          "Selected window is updated to match one of the saved windows");
+        is(state._closedWindows.length, 0,
+          "sessionstore state: no closed windows in data being writted to disk");
+        runNextTest();
+      }, "sessionstore-state-write", false);
+      Services.prefs.setIntPref("browser.sessionstore.interval", 0);
+  });
+});
+}
+
+// Test opening default-normal-private-normal windows and closing a normal window
+function test_3() {
+  testOnWindow(false, function(normalWindow) {
+    normalWindow.gBrowser.addTab("http://www.example.com/1");
+    testOnWindow(true, function(aWindow) {
+      aWindow.gBrowser.addTab("http://www.example.com/2");
+      testOnWindow(false, function(aWindow) {
+        aWindow.gBrowser.addTab("http://www.example.com/3");
+
+        let curState = JSON.parse(ss.getBrowserState());
+        is (curState.windows.length, 4, "Browser has opened 4 windows");
+        is (curState.windows[2].isPrivate, true, "Window 2 is private");
+        is (curState.selectedWindow, 4, "Last window opened is the one selected");
+
+        normalWindow.close();
+        Services.obs.addObserver(function observe(aSubject, aTopic, aData) {
+          Services.obs.removeObserver(observe, aTopic);
+          aSubject.QueryInterface(Ci.nsISupportsString);
+          let state = JSON.parse(aSubject.data);
+          is(state.windows.length, 2,
+            "sessionstore state: 2 windows in data being writted to disk");
+          is (state.selectedWindow, 2,
+            "Selected window is updated to match one of the saved windows");
+          state.windows.forEach(function(win) {
+            is(!win.isPrivate, true, "Saved window is not private");
+          });
+          is(state._closedWindows.length, 1,
+            "sessionstore state: 1 closed window in data being writted to disk");
+          state._closedWindows.forEach(function(win) {
+            is(!win.isPrivate, true, "Closed window is not private");
+          });
+          runNextTest();
+        }, "sessionstore-state-write", false);
+
+        Services.prefs.setIntPref("browser.sessionstore.interval", 0);
+      });
+    });
+  });
+}
+
+function testOnWindow(aIsPrivate, aCallback) {
+  let win = OpenBrowserWindow({private: aIsPrivate});
+  win.addEventListener("load", function onLoad() {
+    win.removeEventListener("load", onLoad, false);
+    executeSoon(function() { aCallback(win); });
+  }, false);
+}