mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-11 21:58:41 +02:00
Backed out changeset 4b3345b2e33b (bug 1602318) Backed out changeset 7240b27afe28 (bug 1602318) Backed out changeset a7091729d8c9 (bug 1602318) Backed out changeset e496ab6c0857 (bug 1602318) Backed out changeset 184da6309f0c (bug 1602318) Backed out changeset 79b540f8619d (bug 1602318) Backed out changeset b298015ee960 (bug 1602318) Backed out changeset 6d0783cd5e01 (bug 1602318) Backed out changeset cbc308486b17 (bug 1602318) Backed out changeset 94142944fb54 (bug 1602318) Backed out changeset 7c1eeb299b78 (bug 1602318) Backed out changeset 0fc27502503a (bug 1602318) Backed out changeset 0fc27c2e09d9 (bug 1602318) Backed out changeset b5e2aa4741b2 (bug 1602318) Backed out changeset 57d568114c5a (bug 1602318) Backed out changeset 8f7360d827dc (bug 1602318) Backed out changeset 78930a97c2df (bug 1602318) Backed out changeset 8015780587cd (bug 1602318) Backed out changeset bc9da03cb3a3 (bug 1602318)
160 lines
4.3 KiB
JavaScript
160 lines
4.3 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const INITIAL_VALUE = "browser_broadcast.js-initial-value-" + Date.now();
|
|
|
|
/**
|
|
* This test ensures we won't lose tab data queued in the content script when
|
|
* closing a tab.
|
|
*/
|
|
add_task(async function flush_on_tabclose() {
|
|
let tab = await createTabWithStorageData(["http://example.com"]);
|
|
let browser = tab.linkedBrowser;
|
|
|
|
await modifySessionStorage(browser, { test: "on-tab-close" });
|
|
await promiseRemoveTabAndSessionState(tab);
|
|
|
|
let [
|
|
{
|
|
state: { storage },
|
|
},
|
|
] = JSON.parse(ss.getClosedTabData(window));
|
|
is(
|
|
storage["http://example.com"].test,
|
|
"on-tab-close",
|
|
"sessionStorage data has been flushed on TabClose"
|
|
);
|
|
});
|
|
|
|
/**
|
|
* This test ensures we won't lose tab data queued in the content script when
|
|
* duplicating a tab.
|
|
*/
|
|
add_task(async function flush_on_duplicate() {
|
|
let tab = await createTabWithStorageData(["http://example.com"]);
|
|
let browser = tab.linkedBrowser;
|
|
|
|
await modifySessionStorage(browser, { test: "on-duplicate" });
|
|
let tab2 = ss.duplicateTab(window, tab);
|
|
await promiseTabRestored(tab2);
|
|
|
|
await promiseRemoveTabAndSessionState(tab2);
|
|
let [
|
|
{
|
|
state: { storage },
|
|
},
|
|
] = JSON.parse(ss.getClosedTabData(window));
|
|
is(
|
|
storage["http://example.com"].test,
|
|
"on-duplicate",
|
|
"sessionStorage data has been flushed when duplicating tabs"
|
|
);
|
|
|
|
gBrowser.removeTab(tab);
|
|
});
|
|
|
|
/**
|
|
* This test ensures we won't lose tab data queued in the content script when
|
|
* a window is closed.
|
|
*/
|
|
add_task(async function flush_on_windowclose() {
|
|
let win = await promiseNewWindow();
|
|
let tab = await createTabWithStorageData(["http://example.com"], win);
|
|
let browser = tab.linkedBrowser;
|
|
|
|
await modifySessionStorage(browser, { test: "on-window-close" });
|
|
await BrowserTestUtils.closeWindow(win);
|
|
|
|
let [
|
|
{
|
|
tabs: [, { storage }],
|
|
},
|
|
] = JSON.parse(ss.getClosedWindowData());
|
|
is(
|
|
storage["http://example.com"].test,
|
|
"on-window-close",
|
|
"sessionStorage data has been flushed when closing a window"
|
|
);
|
|
});
|
|
|
|
/**
|
|
* This test ensures that stale tab data is ignored when reusing a tab
|
|
* (via e.g. setTabState) and does not overwrite the new data.
|
|
*/
|
|
add_task(async function flush_on_settabstate() {
|
|
let tab = await createTabWithStorageData(["http://example.com"]);
|
|
let browser = tab.linkedBrowser;
|
|
|
|
// Flush to make sure our tab state is up-to-date.
|
|
await TabStateFlusher.flush(browser);
|
|
|
|
let state = ss.getTabState(tab);
|
|
await modifySessionStorage(browser, { test: "on-set-tab-state" });
|
|
|
|
// Flush all data contained in the content script but send it using
|
|
// asynchronous messages.
|
|
TabStateFlusher.flush(browser);
|
|
|
|
await promiseTabState(tab, state);
|
|
|
|
let { storage } = JSON.parse(ss.getTabState(tab));
|
|
is(
|
|
storage["http://example.com"].test,
|
|
INITIAL_VALUE,
|
|
"sessionStorage data has not been overwritten"
|
|
);
|
|
|
|
gBrowser.removeTab(tab);
|
|
});
|
|
|
|
/**
|
|
* This test ensures that we won't lose tab data that has been sent
|
|
* asynchronously just before closing a tab. Flushing must re-send all data
|
|
* that hasn't been received by chrome, yet.
|
|
*/
|
|
add_task(async function flush_on_tabclose_racy() {
|
|
let tab = await createTabWithStorageData(["http://example.com"]);
|
|
let browser = tab.linkedBrowser;
|
|
|
|
// Flush to make sure we start with an empty queue.
|
|
await TabStateFlusher.flush(browser);
|
|
|
|
await modifySessionStorage(browser, { test: "on-tab-close-racy" });
|
|
|
|
// Flush all data contained in the content script but send it using
|
|
// asynchronous messages.
|
|
TabStateFlusher.flush(browser);
|
|
await promiseRemoveTabAndSessionState(tab);
|
|
|
|
let [
|
|
{
|
|
state: { storage },
|
|
},
|
|
] = JSON.parse(ss.getClosedTabData(window));
|
|
is(
|
|
storage["http://example.com"].test,
|
|
"on-tab-close-racy",
|
|
"sessionStorage data has been merged correctly to prevent data loss"
|
|
);
|
|
});
|
|
|
|
function promiseNewWindow() {
|
|
return new Promise(resolve => {
|
|
whenNewWindowLoaded({ private: false }, resolve);
|
|
});
|
|
}
|
|
|
|
async function createTabWithStorageData(urls, win = window) {
|
|
let tab = BrowserTestUtils.addTab(win.gBrowser);
|
|
let browser = tab.linkedBrowser;
|
|
|
|
for (let url of urls) {
|
|
BrowserTestUtils.loadURI(browser, url);
|
|
await promiseBrowserLoaded(browser);
|
|
await modifySessionStorage(browser, { test: INITIAL_VALUE });
|
|
}
|
|
|
|
return tab;
|
|
}
|