summaryrefslogtreecommitdiffstats
path: root/browser/components/sessionstore/test/browser_frame_history.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/sessionstore/test/browser_frame_history.js')
-rw-r--r--browser/components/sessionstore/test/browser_frame_history.js170
1 files changed, 170 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_frame_history.js b/browser/components/sessionstore/test/browser_frame_history.js
new file mode 100644
index 000000000..e0d152f77
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_frame_history.js
@@ -0,0 +1,170 @@
+/* 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/. */
+
+/**
+ Ensure that frameset history works properly when restoring a tab,
+ provided that the frameset is static.
+ */
+
+// Loading a toplevel frameset
+add_task(function() {
+ let testURL = getRootDirectory(gTestPath) + "browser_frame_history_index.html";
+ let tab = gBrowser.addTab(testURL);
+ gBrowser.selectedTab = tab;
+
+ info("Opening a page with three frames, 4 loads should take place");
+ yield waitForLoadsInBrowser(tab.linkedBrowser, 4);
+
+ let browser_b = tab.linkedBrowser.contentDocument.getElementsByTagName("frame")[1];
+ let document_b = browser_b.contentDocument;
+ let links = document_b.getElementsByTagName("a");
+
+ // We're going to click on the first link, so listen for another load event
+ info("Clicking on link 1, 1 load should take place");
+ let promise = waitForLoadsInBrowser(tab.linkedBrowser, 1);
+ EventUtils.sendMouseEvent({type:"click"}, links[0], browser_b.contentWindow);
+ yield promise;
+
+ info("Clicking on link 2, 1 load should take place");
+ promise = waitForLoadsInBrowser(tab.linkedBrowser, 1);
+ EventUtils.sendMouseEvent({type:"click"}, links[1], browser_b.contentWindow);
+ yield promise;
+
+ info("Close then un-close page, 4 loads should take place");
+ yield promiseRemoveTab(tab);
+ let newTab = ss.undoCloseTab(window, 0);
+ yield waitForLoadsInBrowser(newTab.linkedBrowser, 4);
+
+ info("Go back in time, 1 load should take place");
+ gBrowser.goBack();
+ yield waitForLoadsInBrowser(newTab.linkedBrowser, 1);
+
+ let expectedURLEnds = ["a.html", "b.html", "c1.html"];
+ let frames = newTab.linkedBrowser.contentDocument.getElementsByTagName("frame");
+ for (let i = 0; i < frames.length; i++) {
+ is(frames[i].contentDocument.location,
+ getRootDirectory(gTestPath) + "browser_frame_history_" + expectedURLEnds[i],
+ "frame " + i + " has the right url");
+ }
+ gBrowser.removeTab(newTab);
+});
+
+// Loading the frameset inside an iframe
+add_task(function() {
+ let testURL = getRootDirectory(gTestPath) + "browser_frame_history_index2.html";
+ let tab = gBrowser.addTab(testURL);
+ gBrowser.selectedTab = tab;
+
+ info("iframe: Opening a page with an iframe containing three frames, 5 loads should take place");
+ yield waitForLoadsInBrowser(tab.linkedBrowser, 5);
+
+ let browser_b = tab.linkedBrowser.contentDocument.
+ getElementById("iframe").contentDocument.
+ getElementsByTagName("frame")[1];
+ let document_b = browser_b.contentDocument;
+ let links = document_b.getElementsByTagName("a");
+
+ // We're going to click on the first link, so listen for another load event
+ info("iframe: Clicking on link 1, 1 load should take place");
+ let promise = waitForLoadsInBrowser(tab.linkedBrowser, 1);
+ EventUtils.sendMouseEvent({type:"click"}, links[0], browser_b.contentWindow);
+ yield promise;
+
+ info("iframe: Clicking on link 2, 1 load should take place");
+ promise = waitForLoadsInBrowser(tab.linkedBrowser, 1);
+ EventUtils.sendMouseEvent({type:"click"}, links[1], browser_b.contentWindow);
+ yield promise;
+
+ info("iframe: Close then un-close page, 5 loads should take place");
+ yield promiseRemoveTab(tab);
+ let newTab = ss.undoCloseTab(window, 0);
+ yield waitForLoadsInBrowser(newTab.linkedBrowser, 5);
+
+ info("iframe: Go back in time, 1 load should take place");
+ gBrowser.goBack();
+ yield waitForLoadsInBrowser(newTab.linkedBrowser, 1);
+
+ let expectedURLEnds = ["a.html", "b.html", "c1.html"];
+ let frames = newTab.linkedBrowser.contentDocument.
+ getElementById("iframe").contentDocument.
+ getElementsByTagName("frame");
+ for (let i = 0; i < frames.length; i++) {
+ is(frames[i].contentDocument.location,
+ getRootDirectory(gTestPath) + "browser_frame_history_" + expectedURLEnds[i],
+ "frame " + i + " has the right url");
+ }
+ gBrowser.removeTab(newTab);
+});
+
+// Now, test that we don't record history if the iframe is added dynamically
+add_task(function() {
+ // Start with an empty history
+ let blankState = JSON.stringify({
+ windows: [{
+ tabs: [{ entries: [{ url: "about:blank" }] }],
+ _closedTabs: []
+ }],
+ _closedWindows: []
+ });
+ ss.setBrowserState(blankState);
+
+ let testURL = getRootDirectory(gTestPath) + "browser_frame_history_index_blank.html";
+ let tab = gBrowser.addTab(testURL);
+ gBrowser.selectedTab = tab;
+ yield waitForLoadsInBrowser(tab.linkedBrowser, 1);
+
+ info("dynamic: Opening a page with an iframe containing three frames, 4 dynamic loads should take place");
+ let doc = tab.linkedBrowser.contentDocument;
+ let iframe = doc.createElement("iframe");
+ iframe.id = "iframe";
+ iframe.src="browser_frame_history_index.html";
+ doc.body.appendChild(iframe);
+ yield waitForLoadsInBrowser(tab.linkedBrowser, 4);
+
+ let browser_b = tab.linkedBrowser.contentDocument.
+ getElementById("iframe").contentDocument.
+ getElementsByTagName("frame")[1];
+ let document_b = browser_b.contentDocument;
+ let links = document_b.getElementsByTagName("a");
+
+ // We're going to click on the first link, so listen for another load event
+ info("dynamic: Clicking on link 1, 1 load should take place");
+ let promise = waitForLoadsInBrowser(tab.linkedBrowser, 1);
+ EventUtils.sendMouseEvent({type:"click"}, links[0], browser_b.contentWindow);
+ yield promise;
+
+ info("dynamic: Clicking on link 2, 1 load should take place");
+ promise = waitForLoadsInBrowser(tab.linkedBrowser, 1);
+ EventUtils.sendMouseEvent({type:"click"}, links[1], browser_b.contentWindow);
+ yield promise;
+
+ info("Check in the state that we have not stored this history");
+ let state = ss.getBrowserState();
+ info(JSON.stringify(JSON.parse(state), null, "\t"));
+ is(state.indexOf("c1.html"), -1, "History entry was not stored in the session state");;
+ gBrowser.removeTab(tab);
+});
+
+// helper functions
+function waitForLoadsInBrowser(aBrowser, aLoadCount) {
+ let deferred = Promise.defer();
+ let loadCount = 0;
+ aBrowser.addEventListener("load", function(aEvent) {
+ if (++loadCount < aLoadCount) {
+ info("Got " + loadCount + " loads, waiting until we have " + aLoadCount);
+ return;
+ }
+
+ aBrowser.removeEventListener("load", arguments.callee, true);
+ deferred.resolve();
+ }, true);
+ return deferred.promise;
+}
+
+function timeout(delay, task) {
+ let deferred = Promise.defer();
+ setTimeout(() => deferred.resolve(true), delay);
+ task.then(() => deferred.resolve(false), deferred.reject);
+ return deferred.promise;
+}