browser_595601-restore_hidden.js (4334B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 var windowState = { 5 windows: [ 6 { 7 tabs: [ 8 { 9 entries: [ 10 { url: "http://example.com#1", triggeringPrincipal_base64 }, 11 ], 12 }, 13 { 14 entries: [ 15 { url: "http://example.com#2", triggeringPrincipal_base64 }, 16 ], 17 }, 18 { 19 entries: [ 20 { url: "http://example.com#3", triggeringPrincipal_base64 }, 21 ], 22 }, 23 { 24 entries: [ 25 { url: "http://example.com#4", triggeringPrincipal_base64 }, 26 ], 27 }, 28 { 29 entries: [ 30 { url: "http://example.com#5", triggeringPrincipal_base64 }, 31 ], 32 hidden: true, 33 }, 34 { 35 entries: [ 36 { url: "http://example.com#6", triggeringPrincipal_base64 }, 37 ], 38 hidden: true, 39 }, 40 { 41 entries: [ 42 { url: "http://example.com#7", triggeringPrincipal_base64 }, 43 ], 44 hidden: true, 45 }, 46 { 47 entries: [ 48 { url: "http://example.com#8", triggeringPrincipal_base64 }, 49 ], 50 hidden: true, 51 }, 52 ], 53 }, 54 ], 55 }; 56 57 function test() { 58 waitForExplicitFinish(); 59 requestLongerTimeout(2); 60 61 registerCleanupFunction(function () { 62 Services.prefs.clearUserPref("browser.sessionstore.restore_hidden_tabs"); 63 }); 64 65 // First stage: restoreHiddenTabs = true 66 // Second stage: restoreHiddenTabs = false 67 test_loadTabs(true, function () { 68 test_loadTabs(false, finish); 69 }); 70 } 71 72 function test_loadTabs(restoreHiddenTabs, callback) { 73 Services.prefs.setBoolPref( 74 "browser.sessionstore.restore_hidden_tabs", 75 restoreHiddenTabs 76 ); 77 78 let expectedTabs = restoreHiddenTabs ? 8 : 4; 79 let firstProgress = true; 80 81 newWindowWithState(windowState, function (win, needsRestore, isRestoring) { 82 if (firstProgress) { 83 firstProgress = false; 84 is(isRestoring, 3, "restoring 3 tabs concurrently"); 85 } else { 86 Assert.less(isRestoring, 4, "restoring max. 3 tabs concurrently"); 87 } 88 89 // We're explicity checking for (isRestoring == 1) here because the test 90 // progress listener is called before the session store one. So when we're 91 // called with one tab left to restore we know that the last tab has 92 // finished restoring and will soon be handled by the SS listener. 93 let tabsNeedingRestore = win.gBrowser.tabs.length - needsRestore; 94 if (isRestoring == 1 && tabsNeedingRestore == expectedTabs) { 95 is(win.gBrowser.visibleTabs.length, 4, "only 4 visible tabs"); 96 97 TabsProgressListener.uninit(); 98 executeSoon(callback); 99 } 100 }); 101 } 102 103 var TabsProgressListener = { 104 init(win) { 105 this.window = win; 106 Services.obs.addObserver(this, "sessionstore-debug-tab-restored"); 107 }, 108 109 uninit() { 110 Services.obs.removeObserver(this, "sessionstore-debug-tab-restored"); 111 112 delete this.window; 113 delete this.callback; 114 }, 115 116 setCallback(callback) { 117 this.callback = callback; 118 }, 119 120 observe(browser) { 121 TabsProgressListener.onRestored(browser); 122 }, 123 124 onRestored(browser) { 125 if ( 126 this.callback && 127 ss.getInternalObjectState(browser) == TAB_STATE_RESTORING 128 ) { 129 this.callback.apply(null, [this.window].concat(this.countTabs())); 130 } 131 }, 132 133 countTabs() { 134 let needsRestore = 0, 135 isRestoring = 0; 136 137 for (let i = 0; i < this.window.gBrowser.tabs.length; i++) { 138 let state = ss.getInternalObjectState( 139 this.window.gBrowser.tabs[i].linkedBrowser 140 ); 141 if (state == TAB_STATE_RESTORING) { 142 isRestoring++; 143 } else if (state == TAB_STATE_NEEDS_RESTORE) { 144 needsRestore++; 145 } 146 } 147 148 return [needsRestore, isRestoring]; 149 }, 150 }; 151 152 // ---------- 153 function newWindowWithState(state, callback) { 154 let opts = "chrome,all,dialog=no,height=800,width=800"; 155 let win = window.openDialog(AppConstants.BROWSER_CHROME_URL, "_blank", opts); 156 157 registerCleanupFunction(() => BrowserTestUtils.closeWindow(win)); 158 159 whenWindowLoaded(win, function onWindowLoaded(aWin) { 160 TabsProgressListener.init(aWin); 161 TabsProgressListener.setCallback(callback); 162 163 ss.setWindowState(aWin, JSON.stringify(state), true); 164 }); 165 }