gecko-dev/browser/components/sessionstore/test/browser_speculative_connect.js
Mike de Boer 781f548ab2 Bug 1034036 - Part 4: move away from keeping state on the living objects, like windows, tabs and browsers, but keep it truly privately stored in WeakMaps. r=dao
NOTE: The '__SSi' and '__SS_lastSessionWindowID' properties on windows are kept,
      because they are expected to stick around longer during application shutdown.

The benefits is are:
1. Cleaner code - Sessionstore implementation details are not leaked outside its
   module.
2. Observing the lifetime of objects becomes unnecessary, because the WeakMaps are
   cleaned up when objects are GC'd, making leakage of their references impossible
   and Sessionstore can't hold objects hostage anymore.
3. Simplification - all state is now maintained in SessionStore.jsm, which allows
   for additional refactoring later on to simplify the implementation further.

MozReview-Commit-ID: C1II8qHkQ6F

--HG--
extra : rebase_source : e5fc6984558bd455a33e275f7060d42c93c21720
2018-04-11 12:06:06 +02:00

102 lines
4 KiB
JavaScript

const TEST_URLS = [
"about:buildconfig",
"http://mochi.test:8888/browser/browser/components/sessionstore/test/browser_speculative_connect.html",
""
];
/**
* This will open tabs in browser. This will also make the last tab
* inserted to be the selected tab.
*/
async function openTabs(win) {
for (let i = 0; i < TEST_URLS.length; ++i) {
await BrowserTestUtils.openNewForegroundTab(win.gBrowser, TEST_URLS[i]);
}
}
add_task(async function speculative_connect_restore_on_demand() {
Services.prefs.setBoolPref("browser.sessionstore.restore_on_demand", true);
is(Services.prefs.getBoolPref("browser.sessionstore.restore_on_demand"), true, "We're restoring on demand");
forgetClosedWindows();
// Open a new window and populate with tabs.
let win = await promiseNewWindowLoaded();
await openTabs(win);
// Close the window.
await BrowserTestUtils.closeWindow(win);
// Reopen a window.
let newWin = undoCloseWindow(0);
// Make sure we wait until this window is restored.
await BrowserTestUtils.waitForEvent(newWin, "load");
let tabs = newWin.gBrowser.tabs;
is(tabs.length, TEST_URLS.length + 1, "Restored right number of tabs");
let e = new MouseEvent("mouseover");
// First tab should be ignored, since it's the default blank tab when we open a new window.
// Trigger a mouse enter on second tab.
tabs[1].dispatchEvent(e);
ok(!tabs[1].__test_connection_prepared, "Second tab doesn't have a connection prepared");
is(tabs[1].__test_connection_url, TEST_URLS[0], "Second tab has correct url");
ok(SessionStore.getLazyTabValue(tabs[1], "connectionPrepared"),
"Second tab should have connectionPrepared flag after hovered");
// Trigger a mouse enter on third tab.
tabs[2].dispatchEvent(e);
ok(tabs[2].__test_connection_prepared, "Third tab has a connection prepared");
is(tabs[2].__test_connection_url, TEST_URLS[1], "Third tab has correct url");
ok(SessionStore.getLazyTabValue(tabs[2], "connectionPrepared"),
"Third tab should have connectionPrepared flag after hovered");
// Last tab is the previously selected tab.
tabs[3].dispatchEvent(e);
is(SessionStore.getLazyTabValue(tabs[3], "connectionPrepared"), undefined,
"Previous selected tab shouldn't have connectionPrepared flag");
is(tabs[3].__test_connection_prepared, undefined,
"Previous selected tab should not have a connection prepared");
is(tabs[3].__test_connection_url, undefined,
"Previous selected tab should not have a connection prepared");
await BrowserTestUtils.closeWindow(newWin);
});
add_task(async function speculative_connect_restore_automatically() {
Services.prefs.setBoolPref("browser.sessionstore.restore_on_demand", false);
is(Services.prefs.getBoolPref("browser.sessionstore.restore_on_demand"), false, "We're restoring automatically");
forgetClosedWindows();
// Open a new window and populate with tabs.
let win = await promiseNewWindowLoaded();
await openTabs(win);
// Close the window.
await BrowserTestUtils.closeWindow(win);
// Reopen a window.
let newWin = undoCloseWindow(0);
// Make sure we wait until this window is restored.
await BrowserTestUtils.waitForEvent(newWin, "load");
let tabs = newWin.gBrowser.tabs;
is(tabs.length, TEST_URLS.length + 1, "Restored right number of tabs");
// First tab is ignored, since it's the default tab open when we open new window
// Second tab.
ok(!tabs[1].__test_connection_prepared, "Second tab doesn't have a connection prepared");
is(tabs[1].__test_connection_url, TEST_URLS[0], "Second tab has correct host url");
// Third tab.
ok(tabs[2].__test_connection_prepared, "Third tab has a connection prepared");
is(tabs[2].__test_connection_url, TEST_URLS[1], "Third tab has correct host url");
// Last tab is the previously selected tab.
is(tabs[3].__test_connection_prepared, undefined, "Selected tab should not have a connection prepared");
is(tabs[3].__test_connection_url, undefined, "Selected tab should not have a connection prepared");
await BrowserTestUtils.closeWindow(newWin);
});