browser_636279.js (3078B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 var stateBackup = ss.getBrowserState(); 5 6 var statePinned = { 7 windows: [ 8 { 9 tabs: [ 10 { 11 entries: [ 12 { url: "http://example.com#1", triggeringPrincipal_base64 }, 13 ], 14 pinned: true, 15 }, 16 ], 17 }, 18 ], 19 }; 20 21 var state = { 22 windows: [ 23 { 24 tabs: [ 25 { 26 entries: [ 27 { url: "http://example.com#1", triggeringPrincipal_base64 }, 28 ], 29 }, 30 { 31 entries: [ 32 { url: "http://example.com#2", triggeringPrincipal_base64 }, 33 ], 34 }, 35 { 36 entries: [ 37 { url: "http://example.com#3", triggeringPrincipal_base64 }, 38 ], 39 }, 40 { 41 entries: [ 42 { url: "http://example.com#4", triggeringPrincipal_base64 }, 43 ], 44 }, 45 ], 46 }, 47 ], 48 }; 49 50 function test() { 51 waitForExplicitFinish(); 52 53 registerCleanupFunction(function () { 54 TabsProgressListener.uninit(); 55 ss.setBrowserState(stateBackup); 56 }); 57 58 TabsProgressListener.init(); 59 60 window.addEventListener( 61 "SSWindowStateReady", 62 function () { 63 let firstProgress = true; 64 65 TabsProgressListener.setCallback(function (needsRestore, isRestoring) { 66 if (firstProgress) { 67 firstProgress = false; 68 is(isRestoring, 3, "restoring 3 tabs concurrently"); 69 } else { 70 Assert.lessOrEqual( 71 isRestoring, 72 3, 73 "restoring max. 2 tabs concurrently" 74 ); 75 } 76 77 if (0 == needsRestore) { 78 TabsProgressListener.unsetCallback(); 79 waitForFocus(finish); 80 } 81 }); 82 83 ss.setBrowserState(JSON.stringify(state)); 84 }, 85 { once: true } 86 ); 87 88 ss.setBrowserState(JSON.stringify(statePinned)); 89 } 90 91 function countTabs() { 92 let needsRestore = 0, 93 isRestoring = 0; 94 for (let window of Services.wm.getEnumerator("navigator:browser")) { 95 if (window.closed) { 96 continue; 97 } 98 99 for (let i = 0; i < window.gBrowser.tabs.length; i++) { 100 let browserState = ss.getInternalObjectState( 101 window.gBrowser.tabs[i].linkedBrowser 102 ); 103 if (browserState == TAB_STATE_RESTORING) { 104 isRestoring++; 105 } else if (browserState == TAB_STATE_NEEDS_RESTORE) { 106 needsRestore++; 107 } 108 } 109 } 110 111 return [needsRestore, isRestoring]; 112 } 113 114 var TabsProgressListener = { 115 init() { 116 Services.obs.addObserver(this, "sessionstore-debug-tab-restored"); 117 }, 118 119 uninit() { 120 Services.obs.removeObserver(this, "sessionstore-debug-tab-restored"); 121 this.unsetCallback(); 122 }, 123 124 setCallback(callback) { 125 this.callback = callback; 126 }, 127 128 unsetCallback() { 129 delete this.callback; 130 }, 131 132 observe(browser) { 133 TabsProgressListener.onRestored(browser); 134 }, 135 136 onRestored(browser) { 137 if ( 138 this.callback && 139 ss.getInternalObjectState(browser) == TAB_STATE_RESTORING 140 ) { 141 this.callback.apply(null, countTabs()); 142 } 143 }, 144 };