browser_586068-window_state.js (3170B)
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 = state1.windows[0].tabs.length + 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 ss.setWindowState(window, JSON.stringify(state2), false); 89 } 90 91 if (loadCount < numTabs) { 92 return; 93 } 94 95 // We don't actually care about load order in this test, just that they all 96 // do load. 97 is( 98 loadCount, 99 numTabs, 100 "test_setWindowStateNoOverwrite: all tabs were restored" 101 ); 102 is(aNeedRestore, 0, "there are no tabs left needing restore"); 103 104 gProgressListener.unsetCallback(); 105 resolve(); 106 }); 107 }); 108 109 let backupState = ss.getBrowserState(); 110 ss.setWindowState(window, JSON.stringify(state1), true); 111 await promiseRestoringTabs; 112 113 // Cleanup. 114 await promiseBrowserState(backupState); 115 });