summaryrefslogtreecommitdiffstats
path: root/dom/broadcastchannel/tests/test_bfcache.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/broadcastchannel/tests/test_bfcache.html')
-rw-r--r--dom/broadcastchannel/tests/test_bfcache.html120
1 files changed, 120 insertions, 0 deletions
diff --git a/dom/broadcastchannel/tests/test_bfcache.html b/dom/broadcastchannel/tests/test_bfcache.html
new file mode 100644
index 0000000000..0197f343e2
--- /dev/null
+++ b/dom/broadcastchannel/tests/test_bfcache.html
@@ -0,0 +1,120 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Test for bfcache and BroadcastChannel</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+ <script type="application/javascript">
+
+ /*
+ * The test opens a new window. Then a message 'load' is sent there to load
+ * another page. If expectedPersisted is false, a dummy message is sent
+ * through a BroadcastChannel which the first has registered to use.
+ * That should evict the page from bfcache.
+ * 'back' message is sent to call history.back().
+ * The page which is loaded from session history should be persisted if
+ * expectedPersisted is true.
+ */
+
+ SimpleTest.waitForExplicitFinish();
+ var testUrl1 = "testUrl1_bfcache.html";
+
+
+ function executeTest() {
+ var bc1 = new BroadcastChannel("testUrl1_bfcache");
+ var bc2 = new BroadcastChannel("testUrl2_bfcache");
+ bc1.onmessage = function(event) {
+ if (event.data == "closed") {
+ info("Closed");
+ runTest();
+ return;
+ }
+ page1Shown(event.data);
+ };
+ bc2.onmessage = function(event) { page2Shown(event.data); };
+
+ var counter = 0;
+ var expectedPersisted = false;
+ var bc = new BroadcastChannel("a");
+
+ function page1Shown(e) {
+ if (counter == 0) {
+ ok(!e.persisted, "test page should have been persisted initially");
+ bc1.postMessage("load");
+ } else {
+ is(e.persisted, expectedPersisted, "test page should have been persisted in pageshow");
+ bc1.postMessage("close");
+ }
+
+ counter++;
+ }
+
+ function page2Shown(e) {
+ if (!expectedPersisted) {
+ SimpleTest.executeSoon(function() {
+ info("Posting a message.");
+ bc.postMessage(42);
+ });
+ }
+
+ SimpleTest.executeSoon(function() {
+ info("Going back");
+ bc2.postMessage("back");
+ });
+ }
+
+ var tests = [
+ { expectedPersisted: true },
+ { expectedPersisted: false },
+ ];
+
+ function runTest() {
+ if (!tests.length) {
+ bc.close();
+ bc1.close();
+ bc2.close();
+ SimpleTest.finish();
+ return;
+ }
+
+ var test = tests.shift();
+
+ counter = 0;
+ expectedPersisted = test.expectedPersisted;
+ window.open(testUrl1, "", "noopener");
+ }
+
+
+ // If Fission is disabled, the pref is no-op.
+ SpecialPowers.pushPrefEnv({set: [["fission.bfcacheInParent", true]]}, () => {
+ runTest();
+ });
+
+ }
+
+ if (isXOrigin) {
+ // Bug 1746646: Make mochitests work with TCP enabled (cookieBehavior = 5)
+ // Acquire storage access permission here so that the BroadcastChannel used to
+ // communicate with the opened windows works in xorigin tests. Otherwise,
+ // the iframe containing this page is isolated from first-party storage access,
+ // which isolates BroadcastChannel communication.
+ SpecialPowers.wrap(document).notifyUserGestureActivation();
+ SpecialPowers.addPermission("storageAccessAPI", true, window.location.href).then(() => {
+ SpecialPowers.wrap(document).requestStorageAccess().then(() => {
+ SpecialPowers.pushPrefEnv({
+ set: [["privacy.partition.always_partition_third_party_non_cookie_storage", false]]
+ }).then(() => {
+ executeTest();
+ });
+ });
+ });
+ } else {
+ executeTest();
+ }
+
+ </script>
+</body>
+</html>