summaryrefslogtreecommitdiffstats
path: root/browser/components/sessionstore/test/browser_636279.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/sessionstore/test/browser_636279.js')
-rw-r--r--browser/components/sessionstore/test/browser_636279.js140
1 files changed, 140 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_636279.js b/browser/components/sessionstore/test/browser_636279.js
new file mode 100644
index 0000000000..ea116ee3f7
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_636279.js
@@ -0,0 +1,140 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+var stateBackup = ss.getBrowserState();
+
+var statePinned = {
+ windows: [
+ {
+ tabs: [
+ {
+ entries: [
+ { url: "http://example.com#1", triggeringPrincipal_base64 },
+ ],
+ pinned: true,
+ },
+ ],
+ },
+ ],
+};
+
+var state = {
+ windows: [
+ {
+ tabs: [
+ {
+ entries: [
+ { url: "http://example.com#1", triggeringPrincipal_base64 },
+ ],
+ },
+ {
+ entries: [
+ { url: "http://example.com#2", triggeringPrincipal_base64 },
+ ],
+ },
+ {
+ entries: [
+ { url: "http://example.com#3", triggeringPrincipal_base64 },
+ ],
+ },
+ {
+ entries: [
+ { url: "http://example.com#4", triggeringPrincipal_base64 },
+ ],
+ },
+ ],
+ },
+ ],
+};
+
+function test() {
+ waitForExplicitFinish();
+
+ registerCleanupFunction(function () {
+ TabsProgressListener.uninit();
+ ss.setBrowserState(stateBackup);
+ });
+
+ TabsProgressListener.init();
+
+ window.addEventListener(
+ "SSWindowStateReady",
+ function () {
+ let firstProgress = true;
+
+ TabsProgressListener.setCallback(function (needsRestore, isRestoring) {
+ if (firstProgress) {
+ firstProgress = false;
+ is(isRestoring, 3, "restoring 3 tabs concurrently");
+ } else {
+ ok(isRestoring <= 3, "restoring max. 2 tabs concurrently");
+ }
+
+ if (0 == needsRestore) {
+ TabsProgressListener.unsetCallback();
+ waitForFocus(finish);
+ }
+ });
+
+ ss.setBrowserState(JSON.stringify(state));
+ },
+ { once: true }
+ );
+
+ ss.setBrowserState(JSON.stringify(statePinned));
+}
+
+function countTabs() {
+ let needsRestore = 0,
+ isRestoring = 0;
+ for (let window of Services.wm.getEnumerator("navigator:browser")) {
+ if (window.closed) {
+ continue;
+ }
+
+ for (let i = 0; i < window.gBrowser.tabs.length; i++) {
+ let browserState = ss.getInternalObjectState(
+ window.gBrowser.tabs[i].linkedBrowser
+ );
+ if (browserState == TAB_STATE_RESTORING) {
+ isRestoring++;
+ } else if (browserState == TAB_STATE_NEEDS_RESTORE) {
+ needsRestore++;
+ }
+ }
+ }
+
+ return [needsRestore, isRestoring];
+}
+
+var TabsProgressListener = {
+ init() {
+ Services.obs.addObserver(this, "sessionstore-debug-tab-restored");
+ },
+
+ uninit() {
+ Services.obs.removeObserver(this, "sessionstore-debug-tab-restored");
+ this.unsetCallback();
+ },
+
+ setCallback(callback) {
+ this.callback = callback;
+ },
+
+ unsetCallback() {
+ delete this.callback;
+ },
+
+ observe(browser, topic, data) {
+ TabsProgressListener.onRestored(browser);
+ },
+
+ onRestored(browser) {
+ if (
+ this.callback &&
+ ss.getInternalObjectState(browser) == TAB_STATE_RESTORING
+ ) {
+ this.callback.apply(null, countTabs());
+ }
+ },
+};