summaryrefslogtreecommitdiffstats
path: root/browser/components/sessionstore/test/browser_600545.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/sessionstore/test/browser_600545.js')
-rw-r--r--browser/components/sessionstore/test/browser_600545.js123
1 files changed, 123 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_600545.js b/browser/components/sessionstore/test/browser_600545.js
new file mode 100644
index 0000000000..f06142632c
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_600545.js
@@ -0,0 +1,123 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+requestLongerTimeout(2);
+
+var stateBackup = JSON.parse(ss.getBrowserState());
+
+function test() {
+ /** Test for Bug 600545 **/
+ waitForExplicitFinish();
+ testBug600545();
+}
+
+function testBug600545() {
+ // Set the pref to false to cause non-app tabs to be stripped out on a save
+ Services.prefs.setBoolPref("browser.sessionstore.resume_from_crash", false);
+ Services.prefs.setIntPref("browser.sessionstore.interval", 2000);
+
+ registerCleanupFunction(function() {
+ Services.prefs.clearUserPref("browser.sessionstore.resume_from_crash");
+ Services.prefs.clearUserPref("browser.sessionstore.interval");
+ });
+
+ // This tests the following use case: When multiple windows are open
+ // and browser.sessionstore.resume_from_crash preference is false,
+ // tab session data for non-active window is stripped for non-pinned
+ // tabs. This occurs after "sessionstore-state-write-complete"
+ // fires which will only fire in this case if there is at least one
+ // pinned tab.
+ let state = {
+ windows: [
+ {
+ tabs: [
+ {
+ entries: [
+ { url: "http://example.org#0", triggeringPrincipal_base64 },
+ ],
+ pinned: true,
+ },
+ {
+ entries: [
+ { url: "http://example.com#1", triggeringPrincipal_base64 },
+ ],
+ },
+ {
+ entries: [
+ { url: "http://example.com#2", triggeringPrincipal_base64 },
+ ],
+ },
+ ],
+ selected: 2,
+ },
+ {
+ tabs: [
+ {
+ entries: [
+ { url: "http://example.com#3", triggeringPrincipal_base64 },
+ ],
+ },
+ {
+ entries: [
+ { url: "http://example.com#4", triggeringPrincipal_base64 },
+ ],
+ },
+ {
+ entries: [
+ { url: "http://example.com#5", triggeringPrincipal_base64 },
+ ],
+ },
+ {
+ entries: [
+ { url: "http://example.com#6", triggeringPrincipal_base64 },
+ ],
+ },
+ ],
+ selected: 3,
+ },
+ ],
+ };
+
+ waitForBrowserState(state, function() {
+ // Need to wait for SessionStore's saveState function to be called
+ // so that non-pinned tabs will be stripped from non-active window
+ waitForSaveState(function() {
+ let expectedNumberOfTabs = getStateTabCount(state);
+ let retrievedState = JSON.parse(ss.getBrowserState());
+ let actualNumberOfTabs = getStateTabCount(retrievedState);
+
+ is(
+ actualNumberOfTabs,
+ expectedNumberOfTabs,
+ "Number of tabs in retreived session data, matches number of tabs set."
+ );
+
+ done();
+ });
+ });
+}
+
+function done() {
+ // Enumerate windows and close everything but our primary window. We can't
+ // use waitForFocus() because apparently it's buggy. See bug 599253.
+ let closeWinPromises = [];
+ for (let currentWindow of Services.wm.getEnumerator("navigator:browser")) {
+ if (currentWindow != window) {
+ closeWinPromises.push(BrowserTestUtils.closeWindow(currentWindow));
+ }
+ }
+
+ Promise.all(closeWinPromises).then(() => {
+ waitForBrowserState(stateBackup, finish);
+ });
+}
+
+// Count up the number of tabs in the state data
+function getStateTabCount(aState) {
+ let tabCount = 0;
+ for (let i in aState.windows) {
+ tabCount += aState.windows[i].tabs.length;
+ }
+ return tabCount;
+}