browser_586068-window_state_override.js (3115B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 const PREF_RESTORE_ON_DEMAND = "browser.sessionstore.restore_on_demand"; 6 7 add_task(async function test() { 8 Services.prefs.setBoolPref(PREF_RESTORE_ON_DEMAND, false); 9 registerCleanupFunction(function () { 10 Services.prefs.clearUserPref(PREF_RESTORE_ON_DEMAND); 11 }); 12 13 // We'll use 2 states so that we can make sure calling setWindowState doesn't 14 // wipe out currently restoring data. 15 let state1 = { 16 windows: [ 17 { 18 tabs: [ 19 { 20 entries: [ 21 { url: "http://example.com#1", triggeringPrincipal_base64 }, 22 ], 23 }, 24 { 25 entries: [ 26 { url: "http://example.com#2", triggeringPrincipal_base64 }, 27 ], 28 }, 29 { 30 entries: [ 31 { url: "http://example.com#3", triggeringPrincipal_base64 }, 32 ], 33 }, 34 { 35 entries: [ 36 { url: "http://example.com#4", triggeringPrincipal_base64 }, 37 ], 38 }, 39 { 40 entries: [ 41 { url: "http://example.com#5", triggeringPrincipal_base64 }, 42 ], 43 }, 44 ], 45 }, 46 ], 47 }; 48 let state2 = { 49 windows: [ 50 { 51 tabs: [ 52 { 53 entries: [ 54 { url: "http://example.org#1", triggeringPrincipal_base64 }, 55 ], 56 }, 57 { 58 entries: [ 59 { url: "http://example.org#2", triggeringPrincipal_base64 }, 60 ], 61 }, 62 { 63 entries: [ 64 { url: "http://example.org#3", triggeringPrincipal_base64 }, 65 ], 66 }, 67 { 68 entries: [ 69 { url: "http://example.org#4", triggeringPrincipal_base64 }, 70 ], 71 }, 72 { 73 entries: [ 74 { url: "http://example.org#5", triggeringPrincipal_base64 }, 75 ], 76 }, 77 ], 78 }, 79 ], 80 }; 81 let numTabs = 2 + state2.windows[0].tabs.length; 82 83 let loadCount = 0; 84 let promiseRestoringTabs = new Promise(resolve => { 85 gProgressListener.setCallback(function (aBrowser, aNeedRestore) { 86 // When loadCount == 2, we'll also restore state2 into the window 87 if (++loadCount == 2) { 88 executeSoon(() => 89 ss.setWindowState(window, JSON.stringify(state2), true) 90 ); 91 } 92 93 if (loadCount < numTabs) { 94 return; 95 } 96 97 // We don't actually care about load order in this test, just that they all 98 // do load. 99 is(loadCount, numTabs, "all tabs were restored"); 100 is(aNeedRestore, 0, "there are no tabs left needing restore"); 101 102 gProgressListener.unsetCallback(); 103 resolve(); 104 }); 105 }); 106 107 let backupState = ss.getBrowserState(); 108 ss.setWindowState(window, JSON.stringify(state1), true); 109 await promiseRestoringTabs; 110 111 // Cleanup. 112 await promiseBrowserState(backupState); 113 });