summaryrefslogtreecommitdiffstats
path: root/browser/components/sessionstore/test/browser_dynamic_frames.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/sessionstore/test/browser_dynamic_frames.js')
-rw-r--r--browser/components/sessionstore/test/browser_dynamic_frames.js87
1 files changed, 87 insertions, 0 deletions
diff --git a/browser/components/sessionstore/test/browser_dynamic_frames.js b/browser/components/sessionstore/test/browser_dynamic_frames.js
new file mode 100644
index 000000000..e4355fee3
--- /dev/null
+++ b/browser/components/sessionstore/test/browser_dynamic_frames.js
@@ -0,0 +1,87 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+/**
+ * Ensure that static frames of framesets are serialized but dynamically
+ * inserted iframes are ignored.
+ */
+add_task(function () {
+ // This URL has the following frames:
+ // + data:text/html,A (static)
+ // + data:text/html,B (static)
+ // + data:text/html,C (dynamic iframe)
+ const URL = "data:text/html;charset=utf-8," +
+ "<frameset cols=50%25,50%25><frame src='data:text/html,A'>" +
+ "<frame src='data:text/html,B'></frameset>" +
+ "<script>var i=document.createElement('iframe');" +
+ "i.setAttribute('src', 'data:text/html,C');" +
+ "document.body.appendChild(i);</script>";
+
+ // Add a new tab with two "static" and one "dynamic" frame.
+ let tab = gBrowser.addTab(URL);
+ let browser = tab.linkedBrowser;
+ yield promiseBrowserLoaded(browser);
+
+ yield TabStateFlusher.flush(browser);
+ let {entries} = JSON.parse(ss.getTabState(tab));
+
+ // Check URLs.
+ ok(entries[0].url.startsWith("data:text/html"), "correct root url");
+ is(entries[0].children[0].url, "data:text/html,A", "correct url for 1st frame");
+ is(entries[0].children[1].url, "data:text/html,B", "correct url for 2nd frame");
+
+ // Check the number of children.
+ is(entries.length, 1, "there is one root entry ...");
+ is(entries[0].children.length, 2, "... with two child entries");
+
+ // Cleanup.
+ gBrowser.removeTab(tab);
+});
+
+/**
+ * Ensure that iframes created by the network parser are serialized but
+ * dynamically inserted iframes are ignored. Navigating a subframe should
+ * create a second root entry that doesn't contain any dynamic children either.
+ */
+add_task(function () {
+ // This URL has the following frames:
+ // + data:text/html,A (static)
+ // + data:text/html,C (dynamic iframe)
+ const URL = "data:text/html;charset=utf-8," +
+ "<iframe name=t src='data:text/html,A'></iframe>" +
+ "<a id=lnk href='data:text/html,B' target=t>clickme</a>" +
+ "<script>var i=document.createElement('iframe');" +
+ "i.setAttribute('src', 'data:text/html,C');" +
+ "document.body.appendChild(i);</script>";
+
+ // Add a new tab with one "static" and one "dynamic" frame.
+ let tab = gBrowser.addTab(URL);
+ let browser = tab.linkedBrowser;
+ yield promiseBrowserLoaded(browser);
+
+ yield TabStateFlusher.flush(browser);
+ let {entries} = JSON.parse(ss.getTabState(tab));
+
+ // Check URLs.
+ ok(entries[0].url.startsWith("data:text/html"), "correct root url");
+ ok(!entries[0].children, "no children collected");
+
+ // Navigate the subframe.
+ browser.messageManager.sendAsyncMessage("ss-test:click", {id: "lnk"});
+ yield promiseBrowserLoaded(browser, false /* don't ignore subframes */);
+
+ yield TabStateFlusher.flush(browser);
+ ({entries} = JSON.parse(ss.getTabState(tab)));
+
+ // Check URLs.
+ ok(entries[0].url.startsWith("data:text/html"), "correct 1st root url");
+ ok(entries[1].url.startsWith("data:text/html"), "correct 2nd root url");
+ ok(!entries.children, "no children collected");
+ ok(!entries[0].children, "no children collected");
+ ok(!entries[1].children, "no children collected");
+
+ // Cleanup.
+ gBrowser.removeTab(tab);
+});