/* Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/ */ const TEST_STATE = { windows: [ { tabs: [ { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, { entries: [{ url: "http://example.com", triggeringPrincipal_base64 }], }, ], }, ], }; const TEST_STATE_2 = { windows: [ { tabs: [ { entries: [{ url: "about:robots", triggeringPrincipal_base64 }] }, { entries: [], userTypedValue: "http://example.com", userTypedClear: 1, }, ], }, ], }; function countNonLazyTabs(win) { win = win || window; let count = 0; for (let browser of win.gBrowser.browsers) { if (browser.isConnected) { count++; } } return count; } /** * Test that lazy browsers do not get prematurely inserted by * code accessing browser bound properties on the unbound browser. */ add_task(async function test() { await SpecialPowers.pushPrefEnv({ set: [ ["browser.sessionstore.restore_on_demand", true], ["browser.sessionstore.restore_tabs_lazily", true], ], }); let backupState = SessionStore.getBrowserState(); await promiseBrowserState(TEST_STATE); info( "Check that no lazy browsers get unnecessarily inserted after session restore" ); is(countNonLazyTabs(), 1, "Window has only 1 non-lazy tab"); await TestUtils.topicObserved("sessionstore-state-write-complete"); // When sessionstore write occurs, tabs are checked for state changes. // Make sure none of them insert their browsers when this happens. info("Check that no lazy browsers get inserted after sessionstore write"); is(countNonLazyTabs(), 1, "Window has only 1 non-lazy tab"); info("Check that lazy browser gets inserted properly"); ok( !gBrowser.browsers[1].isConnected, "The browser that we're attempting to insert is indeed lazy" ); gBrowser._insertBrowser(gBrowser.tabs[1]); is(countNonLazyTabs(), 2, "Window now has 2 non-lazy tabs"); // Check if any lazy tabs got inserted when window closes. let newWindow = await promiseNewWindowLoaded(); SessionStore.setWindowState(newWindow, JSON.stringify(TEST_STATE)); await new Promise(resolve => { newWindow.addEventListener( "unload", () => { info("Check that no lazy browsers get inserted when window closes"); is(countNonLazyTabs(newWindow), 1, "Window has only 1 non-lazy tab"); info( "Check that it is not possible to insert a lazy browser after the window closed" ); ok( !newWindow.gBrowser.browsers[1].isConnected, "The browser that we're attempting to insert is indeed lazy" ); newWindow.gBrowser._insertBrowser(newWindow.gBrowser.tabs[1]); is( countNonLazyTabs(newWindow), 1, "Window still has only 1 non-lazy tab" ); resolve(); }, { once: true } ); newWindow.close(); }); // Bug 1365933. info( "Check that session with tab having empty entries array gets restored properly" ); await promiseBrowserState(TEST_STATE_2); is(gBrowser.tabs.length, 2, "Window has 2 tabs"); is( gBrowser.selectedBrowser.currentURI.spec, "about:robots", "Tab has the expected URL" ); gBrowser.selectedTab = gBrowser.tabs[1]; await BrowserTestUtils.browserLoaded(gBrowser.selectedBrowser); is( gBrowser.selectedBrowser.currentURI.spec, "http://example.com/", "Tab has the expected URL" ); // Cleanup. await promiseBrowserState(backupState); });