diff --git a/browser/components/sessionstore/test/browser.ini b/browser/components/sessionstore/test/browser.ini
index ec2f719e986..e772b687ddf 100644
--- a/browser/components/sessionstore/test/browser.ini
+++ b/browser/components/sessionstore/test/browser.ini
@@ -64,13 +64,12 @@ support-files =
[browser_global_store.js]
[browser_label_and_icon.js]
[browser_merge_closed_tabs.js]
-[browser_pageshow.js]
[browser_pageStyle.js]
[browser_privatetabs.js]
[browser_scrollPositions.js]
+[browser_sessionHistory.js]
[browser_sessionStorage.js]
[browser_swapDocShells.js]
-[browser_tabStateCache.js]
[browser_telemetry.js]
[browser_upgrade_backup.js]
[browser_windowRestore_perwindowpb.js]
@@ -149,7 +148,6 @@ skip-if = true
[browser_618151.js]
[browser_623779.js]
[browser_624727.js]
-[browser_625257.js]
[browser_628270.js]
[browser_635418.js]
[browser_636279.js]
diff --git a/browser/components/sessionstore/test/browser_393716.js b/browser/components/sessionstore/test/browser_393716.js
index 096a439d4b5..be3b0b7d5ff 100644
--- a/browser/components/sessionstore/test/browser_393716.js
+++ b/browser/components/sessionstore/test/browser_393716.js
@@ -18,6 +18,7 @@ add_task(function test_set_tabstate() {
yield promiseBrowserLoaded(tab.linkedBrowser);
// get the tab's state
+ SyncHandlers.get(tab.linkedBrowser).flush();
let state = ss.getTabState(tab);
ok(state, "get the tab's state");
diff --git a/browser/components/sessionstore/test/browser_423132.js b/browser/components/sessionstore/test/browser_423132.js
index 7e1c97c4551..00973c930e9 100644
--- a/browser/components/sessionstore/test/browser_423132.js
+++ b/browser/components/sessionstore/test/browser_423132.js
@@ -29,6 +29,7 @@ function test() {
whenBrowserLoaded(newWin.gBrowser.selectedBrowser, function() {
// get the sessionstore state for the window
+ SyncHandlers.get(newWin.gBrowser.selectedBrowser).flush();
let state = ss.getWindowState(newWin);
// verify our cookie got set during pageload
diff --git a/browser/components/sessionstore/test/browser_447951.js b/browser/components/sessionstore/test/browser_447951.js
index 6037e5111dc..e4b4c68a534 100644
--- a/browser/components/sessionstore/test/browser_447951.js
+++ b/browser/components/sessionstore/test/browser_447951.js
@@ -18,18 +18,16 @@ function test() {
ss.setTabState(tab, JSON.stringify(tabState));
whenTabRestored(tab, function() {
+ SyncHandlers.get(tab.linkedBrowser).flush();
tabState = JSON.parse(ss.getTabState(tab));
is(tabState.entries.length, max_entries, "session history filled to the limit");
is(tabState.entries[0].url, baseURL + 0, "... but not more");
// visit yet another anchor (appending it to session history)
- let doc = tab.linkedBrowser.contentDocument;
- let event = doc.createEvent("MouseEvents");
- event.initMouseEvent("click", true, true, doc.defaultView, 1,
- 0, 0, 0, 0, false, false, false, false, 0, null);
- doc.querySelector("a").dispatchEvent(event);
+ tab.linkedBrowser.contentDocument.querySelector("a").click();
function check() {
+ SyncHandlers.get(tab.linkedBrowser).flush();
tabState = JSON.parse(ss.getTabState(tab));
if (tabState.entries[tabState.entries.length - 1].url != baseURL + "end") {
// It may take a few passes through the event loop before we
diff --git a/browser/components/sessionstore/test/browser_500328.js b/browser/components/sessionstore/test/browser_500328.js
index 6bd60175699..15a0361647c 100644
--- a/browser/components/sessionstore/test/browser_500328.js
+++ b/browser/components/sessionstore/test/browser_500328.js
@@ -89,6 +89,7 @@ function test() {
history.pushState({obj2:2}, "title-obj2", "?page2");
history.replaceState({obj3:/^a$/}, "title-obj3");
+ SyncHandlers.get(tab.linkedBrowser).flush();
let state = ss.getTabState(tab);
gBrowser.removeTab(tab);
diff --git a/browser/components/sessionstore/test/browser_625257.js b/browser/components/sessionstore/test/browser_625257.js
deleted file mode 100644
index 63e59718593..00000000000
--- a/browser/components/sessionstore/test/browser_625257.js
+++ /dev/null
@@ -1,79 +0,0 @@
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-let Scope = {};
-Cu.import("resource://gre/modules/Task.jsm", Scope);
-Cu.import("resource://gre/modules/Promise.jsm", Scope);
-let {Task, Promise} = Scope;
-
-
-// This tests that a tab which is closed while loading is not lost.
-// Specifically, that session store does not rely on an invalid cache when
-// constructing data for a tab which is loading.
-
-// This test steps through the following parts:
-// 1. Tab has been created is loading URI_TO_LOAD.
-// 2. Before URI_TO_LOAD finishes loading, browser.currentURI has changed and
-// tab is scheduled to be removed.
-// 3. After the tab has been closed, undoCloseTab() has been called and the tab
-// should fully load.
-const URI_TO_LOAD = "about:mozilla";
-
-function waitForLoadStarted(aTab) {
- return promiseContentMessage(aTab.linkedBrowser, "SessionStore:loadStart");
-}
-
-function waitForTabLoaded(aTab) {
- let deferred = Promise.defer();
- whenBrowserLoaded(aTab.linkedBrowser, deferred.resolve);
- return deferred.promise;
-}
-
-function waitForTabClosed() {
- let deferred = Promise.defer();
- let observer = function() {
- gBrowser.tabContainer.removeEventListener("TabClose", observer, true);
- deferred.resolve();
- };
- gBrowser.tabContainer.addEventListener("TabClose", observer, true);
- return deferred.promise;
-}
-
-function test() {
- waitForExplicitFinish();
-
- Task.spawn(function() {
- try {
- // Open a new tab
- let tab = gBrowser.addTab("about:blank");
- yield waitForTabLoaded(tab);
-
- // Trigger a save state, to initialize any caches
- ss.getBrowserState();
-
- is(gBrowser.tabs[1], tab, "newly created tab should exist by now");
-
- // Start a load and interrupt it by closing the tab
- tab.linkedBrowser.loadURI(URI_TO_LOAD);
- yield waitForLoadStarted(tab);
-
- let tabClosing = waitForTabClosed();
- gBrowser.removeTab(tab);
- info("Now waiting for TabClose to close");
- yield tabClosing;
-
- // Undo the tab, ensure that it proceeds with loading
- tab = ss.undoCloseTab(window, 0);
- yield waitForTabLoaded(tab);
- is(tab.linkedBrowser.currentURI.spec, URI_TO_LOAD, "loading proceeded as expected");
-
- gBrowser.removeTab(tab);
-
- executeSoon(finish);
- } catch (ex) {
- ok(false, ex);
- info(ex.stack);
- }
- });
-}
diff --git a/browser/components/sessionstore/test/browser_705597.js b/browser/components/sessionstore/test/browser_705597.js
index 8810c88e624..45a83449409 100644
--- a/browser/components/sessionstore/test/browser_705597.js
+++ b/browser/components/sessionstore/test/browser_705597.js
@@ -27,6 +27,7 @@ function test() {
whenChildCount(entry, 1, function () {
whenChildCount(entry, 2, function () {
whenBrowserLoaded(browser, function () {
+ SyncHandlers.get(browser).flush();
let {entries} = JSON.parse(ss.getTabState(tab));
is(entries.length, 1, "tab has one history entry");
ok(!entries[0].children, "history entry has no subframes");
diff --git a/browser/components/sessionstore/test/browser_dying_cache.js b/browser/components/sessionstore/test/browser_dying_cache.js
index 169a07539ab..0196194008e 100644
--- a/browser/components/sessionstore/test/browser_dying_cache.js
+++ b/browser/components/sessionstore/test/browser_dying_cache.js
@@ -24,6 +24,7 @@ function runTests() {
// Open a second tab and close the first one.
let tab = win.gBrowser.addTab("about:mozilla");
yield whenBrowserLoaded(tab.linkedBrowser);
+ SyncHandlers.get(tab.linkedBrowser).flush();
win.gBrowser.removeTab(win.gBrowser.tabs[0]);
// Make sure our window is still tracked by sessionstore
diff --git a/browser/components/sessionstore/test/browser_pageshow.js b/browser/components/sessionstore/test/browser_pageshow.js
deleted file mode 100644
index 3560b61af59..00000000000
--- a/browser/components/sessionstore/test/browser_pageshow.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- * http://creativecommons.org/publicdomain/zero/1.0/ */
-
-function test() {
- TestRunner.run();
-}
-
-/**
- * This test ensures that loading a page from bfcache (by going back or forward
- * in history) marks the window as dirty and causes data about the tab that
- * changed to be re-collected.
- *
- * We will do this by creating a tab with two history entries and going back
- * to the first. When we now request the current browser state from the
- * session store service the first history entry must be selected.
- */
-
-const URL = "data:text/html,
first
";
-const URL2 = "data:text/html,second
";
-
-function runTests() {
- // Create a dummy window that is regarded as active. We need to do this
- // because we always collect data for tabs of active windows no matter if
- // the window is dirty or not.
- let win = OpenBrowserWindow();
- yield whenDelayedStartupFinished(win, next);
-
- // Create a tab with two history entries.
- let tab = gBrowser.selectedTab = gBrowser.addTab("about:blank");
- yield loadURI(URL);
- yield loadURI(URL2);
-
- // All windows currently marked as dirty will be written to disk
- // and thus marked clean afterwards.
- yield forceWriteState();
-
- // Go back to 'about:robots' - which is loaded from the bfcache and thus
- // will not fire a 'load' event but a 'pageshow' event with persisted=true.
- waitForPageShow();
- yield gBrowser.selectedBrowser.goBack();
- is(tab.linkedBrowser.currentURI.spec, URL, "correct url after going back");
-
- // If by receiving the 'pageshow' event the first window has correctly
- // been marked as dirty, getBrowserState() should return the tab we created
- // with the right history entry (about:robots) selected.
- let state = JSON.parse(ss.getBrowserState());
- is(state.windows[0].tabs[1].index, 1, "first history entry is selected");
-
- // Clean up after ourselves.
- gBrowser.removeTab(tab);
- win.close();
-}
-
-function forceWriteState() {
- const PREF = "browser.sessionstore.interval";
- const TOPIC = "sessionstore-state-write";
-
- Services.obs.addObserver(function observe() {
- Services.obs.removeObserver(observe, TOPIC);
- Services.prefs.clearUserPref(PREF);
- executeSoon(next);
- }, TOPIC, false);
-
- Services.prefs.setIntPref(PREF, 0);
-}
-
-function loadURI(aURI) {
- let browser = gBrowser.selectedBrowser;
- waitForLoad(browser);
- browser.loadURI(aURI);
-}
-
-function waitForLoad(aElement) {
- aElement.addEventListener("load", function onLoad() {
- aElement.removeEventListener("load", onLoad, true);
- executeSoon(next);
- }, true);
-}
-
-function waitForPageShow() {
- let mm = gBrowser.selectedBrowser.messageManager;
-
- mm.addMessageListener("SessionStore:pageshow", function onPageShow() {
- mm.removeMessageListener("SessionStore:pageshow", onPageShow);
- executeSoon(next);
- });
-}
diff --git a/browser/components/sessionstore/test/browser_privatetabs.js b/browser/components/sessionstore/test/browser_privatetabs.js
index 1f80a633361..67b4cb7bd5a 100644
--- a/browser/components/sessionstore/test/browser_privatetabs.js
+++ b/browser/components/sessionstore/test/browser_privatetabs.js
@@ -30,6 +30,7 @@ add_task(function() {
yield promiseBrowserLoaded(tab2.linkedBrowser);
info("Flush to make sure chrome received all data.");
+ SyncHandlers.get(tab1.linkedBrowser).flush();
SyncHandlers.get(tab2.linkedBrowser).flush();
info("Checking out state");
diff --git a/browser/components/sessionstore/test/browser_sessionHistory.js b/browser/components/sessionstore/test/browser_sessionHistory.js
new file mode 100644
index 00000000000..cd4f5b5ced3
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_sessionHistory.js
@@ -0,0 +1,167 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Ensure that starting a load invalidates shistory.
+ */
+add_task(function test_load_start() {
+ // Create a new tab.
+ let tab = gBrowser.addTab("about:blank");
+ let browser = tab.linkedBrowser;
+ yield promiseBrowserLoaded(browser);
+
+ // Load a new URI but remove the tab before it has finished loading.
+ browser.loadURI("about:mozilla");
+ yield promiseContentMessage(browser, "ss-test:onFrameTreeReset");
+ gBrowser.removeTab(tab);
+
+ // Undo close the tab.
+ tab = ss.undoCloseTab(window, 0);
+ browser = tab.linkedBrowser;
+ yield promiseBrowserLoaded(browser);
+
+ // Check that the correct URL was restored.
+ is(browser.currentURI.spec, "about:mozilla", "url is correct");
+
+ // Cleanup.
+ gBrowser.removeTab(tab);
+});
+
+/**
+ * Ensure that purging shistory invalidates.
+ */
+add_task(function test_purge() {
+ // Create a new tab.
+ let tab = gBrowser.addTab("about:mozilla");
+ let browser = tab.linkedBrowser;
+ yield promiseBrowserLoaded(browser);
+
+ // Create a second shistory entry.
+ browser.loadURI("about:robots");
+ yield promiseBrowserLoaded(browser);
+
+ // Check that we now have two shistory entries.
+ SyncHandlers.get(browser).flush();
+ let {entries} = JSON.parse(ss.getTabState(tab));
+ is(entries.length, 2, "there are two shistory entries");
+
+ // Purge session history.
+ yield sendMessage(browser, "ss-test:purgeSessionHistory");
+
+ // Check that we are left with a single shistory entry.
+ SyncHandlers.get(browser).flush();
+ let {entries} = JSON.parse(ss.getTabState(tab));
+ is(entries.length, 1, "there is one shistory entry");
+
+ // Cleanup.
+ gBrowser.removeTab(tab);
+});
+
+/**
+ * Ensure that anchor navigation invalidates shistory.
+ */
+add_task(function test_hashchange() {
+ const URL = "data:text/html;charset=utf-8,clickme";
+
+ // Create a new tab.
+ let tab = gBrowser.addTab(URL);
+ let browser = tab.linkedBrowser;
+ yield promiseBrowserLoaded(browser);
+
+ // Check that we start with a single shistory entry.
+ SyncHandlers.get(browser).flush();
+ let {entries} = JSON.parse(ss.getTabState(tab));
+ is(entries.length, 1, "there is one shistory entry");
+
+ // Click the link and wait for a hashchange event.
+ browser.messageManager.sendAsyncMessage("ss-test:click", {id: "a"});
+ yield promiseContentMessage(browser, "ss-test:hashchange");
+
+ // Check that we now have two shistory entries.
+ SyncHandlers.get(browser).flush();
+ let {entries} = JSON.parse(ss.getTabState(tab));
+ is(entries.length, 2, "there are two shistory entries");
+
+ // Cleanup.
+ gBrowser.removeTab(tab);
+});
+
+/**
+ * Ensure that loading pages from the bfcache invalidates shistory.
+ */
+add_task(function test_pageshow() {
+ const URL = "data:text/html;charset=utf-8,first
";
+ const URL2 = "data:text/html;charset=utf-8,second
";
+
+ // Create a new tab.
+ let tab = gBrowser.addTab(URL);
+ let browser = tab.linkedBrowser;
+ yield promiseBrowserLoaded(browser);
+
+ // Create a second shistory entry.
+ browser.loadURI(URL2);
+ yield promiseBrowserLoaded(browser);
+
+ // Go back to the previous url which is loaded from the bfcache.
+ browser.goBack();
+ yield promiseContentMessage(browser, "ss-test:onFrameTreeCollected");
+ is(browser.currentURI.spec, URL, "correct url after going back");
+
+ // Check that loading from bfcache did invalidate shistory.
+ SyncHandlers.get(browser).flush();
+ let {index} = JSON.parse(ss.getTabState(tab));
+ is(index, 1, "first history entry is selected");
+
+ // Cleanup.
+ gBrowser.removeTab(tab);
+});
+
+/**
+ * Ensure that subframe navigation invalidates shistory.
+ */
+add_task(function test_subframes() {
+ const URL = "data:text/html;charset=utf-8," +
+ "" +
+ "clickme" +
+ "clickme";
+
+ // Create a new tab.
+ let tab = gBrowser.addTab(URL);
+ let browser = tab.linkedBrowser;
+ yield promiseBrowserLoaded(browser);
+
+ // Check that we have a single shistory entry.
+ SyncHandlers.get(browser).flush();
+ let {entries} = JSON.parse(ss.getTabState(tab));
+ is(entries.length, 1, "there is one shistory entry");
+ is(entries[0].children.length, 1, "the entry has one child");
+
+ // Navigate the subframe.
+ browser.messageManager.sendAsyncMessage("ss-test:click", {id: "a1"});
+ yield promiseBrowserLoaded(browser, false /* don't ignore subframes */);
+
+ // Check shistory.
+ SyncHandlers.get(browser).flush();
+ let {entries} = JSON.parse(ss.getTabState(tab));
+ is(entries.length, 2, "there now are two shistory entries");
+ is(entries[1].children.length, 1, "the second entry has one child");
+
+ // Go back in history.
+ browser.goBack();
+ yield promiseBrowserLoaded(browser, false /* don't ignore subframes */);
+
+ // Navigate the subframe again.
+ browser.messageManager.sendAsyncMessage("ss-test:click", {id: "a2"});
+ yield promiseContentMessage(browser, "ss-test:hashchange");
+
+ // Check shistory.
+ SyncHandlers.get(browser).flush();
+ let {entries} = JSON.parse(ss.getTabState(tab));
+ is(entries.length, 2, "there now are two shistory entries");
+ is(entries[1].children.length, 1, "the second entry has one child");
+
+ // Cleanup.
+ gBrowser.removeTab(tab);
+});
diff --git a/browser/components/sessionstore/test/browser_tabStateCache.js b/browser/components/sessionstore/test/browser_tabStateCache.js
deleted file mode 100644
index 8ccb39db537..00000000000
--- a/browser/components/sessionstore/test/browser_tabStateCache.js
+++ /dev/null
@@ -1,139 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
- http://creativecommons.org/publicdomain/zero/1.0/ */
-
-"use strict";
-
-let wrapper = {};
-Cu.import("resource:///modules/sessionstore/TabStateCache.jsm", wrapper);
-let {TabStateCache} = wrapper;
-
-// The number of tabs that are present in the browser but that we're not dealing
-// with. This should be one (for an empty about:blank), but let's not make this
-// a magic number.
-let numberOfUntrackedTabs;
-
-// Arbitrary URL prefix, used to generate the URL of pages we visit
-const URL_PREFIX = "http://example.org:80/";
-
-/**
- * Check tab state cache telemetry statistics before and after an operation.
- *
- * @param {function} f The operation being measured. If it returns a promise,
- * we wait until the promise is resolved before proceeding.
- * @return {promise}
- */
-function getTelemetryDelta(f) {
- return Task.spawn(function() {
- let KEYS = ["hits", "misses", "clears"];
- let old = {};
- for (let key of KEYS) {
- old[key] = TabStateCache[key];
- }
- yield f();
- let result = {};
- for (let key of KEYS) {
- result[key] = TabStateCache[key] - old[key];
- }
- ok(result.hits >= 0, "Sanity check: hits have not decreased");
- ok(result.misses >= 0, "Sanity check: misses have not decreased");
- ok(result.clears >= 0, "Sanity check: clears have not decreased");
- throw new Task.Result(result);
- });
-}
-
-add_task(function init() {
- // Start with an empty cache
- closeAllButPrimaryWindow();
- TabStateCache.clear();
- numberOfUntrackedTabs = gBrowser.tabs.length;
- info("Starting with " + numberOfUntrackedTabs + " tabs");
-});
-
-add_task(function add_remove() {
- info("Adding the first tab");
- // Initialize one tab, save to initialize cache
- let tab1 = gBrowser.addTab(URL_PREFIX + "?tab1");
- yield promiseBrowserLoaded(tab1.linkedBrowser);
- yield getTelemetryDelta(forceSaveState);
-
- // Save/collect again a few times, ensure that we always hit
- info("Save/collect a few times with one tab");
- for (let collector of [forceSaveState, ss.getBrowserState]) {
- for (let i = 0; i < 5; ++i) {
- let PREFIX = "Trivial test " + i + " using " + collector.name + ": ";
- let delta = yield getTelemetryDelta(collector);
- is(delta.hits, numberOfUntrackedTabs + 1, PREFIX + " has at least one hit " + delta.hits);
- is(delta.misses, 0, PREFIX + " has no miss");
- is(delta.clears, 0, PREFIX + " has no clear");
- }
- }
-
- // Add a second tab, ensure that we have both hits and misses
- info("Adding the second tab");
- let tab2 = gBrowser.addTab(URL_PREFIX + "?tab2");
- yield promiseBrowserLoaded(tab2.linkedBrowser);
-
- let PREFIX = "Adding second tab: ";
- ok(!TabStateCache.has(tab2), PREFIX + " starts out of the cache");
- let delta = yield getTelemetryDelta(forceSaveState);
- is(delta.hits, numberOfUntrackedTabs + 2, PREFIX + " we hit all tabs, thanks to prefetching");
- is(delta.misses, 0, PREFIX + " we missed no tabs, thanks to prefetching");
- is(delta.clears, 0, PREFIX + " has no clear");
-
- // Save/collect again a few times, ensure that we always hit
- info("Save/collect a few times with two tabs");
- for (let collector of [forceSaveState, ss.getBrowserState]) {
- for (let i = 0; i < 5; ++i) {
- let PREFIX = "With two tabs " + i + " using " + collector.name + ": ";
- let delta = yield getTelemetryDelta(collector);
- is(delta.hits, numberOfUntrackedTabs + 2, PREFIX + " both tabs hit");
- is(delta.misses, 0, PREFIX + " has no miss");
- is(delta.clears, 0, PREFIX + " has no clear");
- }
- }
-
- info("Removing second tab");
- gBrowser.removeTab(tab2);
- PREFIX = "Removing second tab: ";
- delta = yield getTelemetryDelta(forceSaveState);
- is(delta.hits, numberOfUntrackedTabs + 1, PREFIX + " we hit for one tab");
- is(delta.misses, 0, PREFIX + " has no miss");
- is(delta.clears, 0, PREFIX + " has no clear");
-
- info("Removing first tab");
- gBrowser.removeTab(tab1);
-});
-
-add_task(function browsing() {
- info("Opening first browsing tab");
- let tab1 = gBrowser.addTab(URL_PREFIX + "?do_not_move_from_here");
- let browser1 = tab1.linkedBrowser;
- yield promiseBrowserLoaded(browser1);
- yield forceSaveState();
-
- info("Opening second browsing tab");
- let tab2 = gBrowser.addTab(URL_PREFIX + "?start_browsing_from_here");
- let browser2 = tab2.linkedBrowser;
- yield promiseBrowserLoaded(browser2);
-
- for (let i = 0; i < 4; ++i) {
- let url = URL_PREFIX + "?browsing" + i; // Arbitrary url, easy to recognize
- let PREFIX = "Browsing to " + url;
- info(PREFIX);
- let delta = yield getTelemetryDelta(function() {
- return Task.spawn(function() {
- // Move to new URI then save session
- let promise = promiseBrowserLoaded(browser2);
- browser2.loadURI(url);
- yield promise;
- ok(!TabStateCache.has(browser2), PREFIX + " starts out of the cache");
- yield forceSaveState();
- });
- });
- is(delta.hits, numberOfUntrackedTabs + 2, PREFIX + " has all hits, thanks to prefetching");
- is(delta.misses, 0, PREFIX + " has no miss, thanks to prefetching");
- is(delta.clears, 0, PREFIX + " has no clear");
- }
- gBrowser.removeTab(tab2);
- gBrowser.removeTab(tab1);
-});
diff --git a/browser/components/sessionstore/test/browser_telemetry.js b/browser/components/sessionstore/test/browser_telemetry.js
index 186f09d547c..7029c038e3c 100644
--- a/browser/components/sessionstore/test/browser_telemetry.js
+++ b/browser/components/sessionstore/test/browser_telemetry.js
@@ -4,8 +4,7 @@
let tmp = {};
Cu.import("resource:///modules/sessionstore/SessionFile.jsm", tmp);
-Cu.import("resource:///modules/sessionstore/TabStateCache.jsm", tmp);
-let {SessionFile, TabStateCache} = tmp;
+let {SessionFile} = tmp;
// Shortcuts for histogram names
let Keys = {};
@@ -63,7 +62,8 @@ add_task(function history() {
let statistics = yield promiseStats();
info("Now changing history");
- tab.linkedBrowser.contentWindow.history.pushState({foo:1}, "ref");
+ tab.linkedBrowser.loadURI("http://example.org:80/1");
+ yield promiseBrowserLoaded(tab.linkedBrowser);
SyncHandlers.get(tab.linkedBrowser).flush();
let statistics2 = yield promiseStats();
@@ -224,7 +224,6 @@ add_task(function formdata() {
yield setInputValue(tab.linkedBrowser, {id: "input", value: "This is some form data"});
SyncHandlers.get(tab.linkedBrowser).flush();
- TabStateCache.delete(tab.linkedBrowser);
let statistics2 = yield promiseStats();
diff --git a/browser/components/sessionstore/test/content.js b/browser/components/sessionstore/test/content.js
index 01a8a4d4255..9bf305c6329 100644
--- a/browser/components/sessionstore/test/content.js
+++ b/browser/components/sessionstore/test/content.js
@@ -25,6 +25,10 @@ gFrameTree.addObserver({
* to modify and query docShell data when running with multiple processes.
*/
+addEventListener("hashchange", function () {
+ sendAsyncMessage("ss-test:hashchange");
+});
+
addEventListener("MozStorageChanged", function () {
sendSyncMessage("ss-test:MozStorageChanged");
});
@@ -46,6 +50,11 @@ addMessageListener("ss-test:purgeDomainData", function ({data: domain}) {
content.setTimeout(() => sendAsyncMessage("ss-test:purgeDomainData"));
});
+addMessageListener("ss-test:purgeSessionHistory", function () {
+ Services.obs.notifyObservers(null, "browser:purge-session-history", "");
+ content.setTimeout(() => sendAsyncMessage("ss-test:purgeSessionHistory"));
+});
+
addMessageListener("ss-test:getStyleSheets", function (msg) {
let sheets = content.document.styleSheets;
let titles = Array.map(sheets, ss => [ss.title, ss.disabled]);
@@ -149,3 +158,8 @@ addMessageListener("ss-test:mapFrameTree", function (msg) {
let result = gFrameTree.map(frame => ({href: frame.location.href}));
sendAsyncMessage("ss-test:mapFrameTree", result);
});
+
+addMessageListener("ss-test:click", function ({data}) {
+ content.document.getElementById(data.id).click();
+ sendAsyncMessage("ss-test:click");
+});
diff --git a/browser/components/sessionstore/test/head.js b/browser/components/sessionstore/test/head.js
index c91de6708ca..f07f03e3285 100644
--- a/browser/components/sessionstore/test/head.js
+++ b/browser/components/sessionstore/test/head.js
@@ -288,17 +288,17 @@ function forceSaveState() {
);
}
-function whenBrowserLoaded(aBrowser, aCallback = next) {
+function whenBrowserLoaded(aBrowser, aCallback = next, ignoreSubFrames = true) {
aBrowser.addEventListener("load", function onLoad(event) {
- if (event.target == aBrowser.contentDocument) {
+ if (!ignoreSubFrames || event.target == aBrowser.contentDocument) {
aBrowser.removeEventListener("load", onLoad, true);
executeSoon(aCallback);
}
}, true);
}
-function promiseBrowserLoaded(aBrowser) {
+function promiseBrowserLoaded(aBrowser, ignoreSubFrames = true) {
let deferred = Promise.defer();
- whenBrowserLoaded(aBrowser, deferred.resolve);
+ whenBrowserLoaded(aBrowser, deferred.resolve, ignoreSubFrames);
return deferred.promise;
}
function whenBrowserUnloaded(aBrowser, aContainer, aCallback = next) {