summaryrefslogtreecommitdiffstats
path: root/dom/workers/test/test_subworkers_suspended.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/workers/test/test_subworkers_suspended.html')
-rw-r--r--dom/workers/test/test_subworkers_suspended.html145
1 files changed, 145 insertions, 0 deletions
diff --git a/dom/workers/test/test_subworkers_suspended.html b/dom/workers/test/test_subworkers_suspended.html
new file mode 100644
index 0000000000..d5c62a28d0
--- /dev/null
+++ b/dom/workers/test/test_subworkers_suspended.html
@@ -0,0 +1,145 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>Test for sub workers+bfcache behavior</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">
+
+
+
+ /**
+ * - main page opens testUrl1
+ * - testUrl1 ---"onpageshow"---> to main page
+ * - main page ---"startWorker"---> testUrl1
+ * - testUrl1 starts workers, also ---"verifyCacheData"---> main page
+ * - main page ---"changeLocation"---> testUrl1
+ * - testUrl1 navigated to testUrl2
+ * - testUrl2 ---"onpageshow"---> to main page
+ * - main page ---"startWorker"---> testUrl2
+ * - testUrl2 starts workers, also ---"verifyCacheData"---> main page
+ * - main page ---"goBack"---> testUrl2
+ * - testUrl2 navigates back to testUrl1
+ * - testUrl1 ---"onpageshow"---> to main page
+ * - main page checks cache data and ---"finish"---> testUrl2
+ * - testUrl1 ---"finished"---> to main page
+ */
+ var testUrl1 = "window_suspended.html?page1Shown";
+ var counter = 0;
+ const SUB_WORKERS = 3;
+
+ function cacheData() {
+ return caches.open("test")
+ .then(function(cache) {
+ return cache.match("http://mochi.test:888/foo");
+ })
+ .then(function(response) {
+ return response.text();
+ });
+ }
+
+ function runTest() {
+ var bc1 = new BroadcastChannel("page1Shown");
+ bc1.onmessage = async (msgEvent) => {
+ var msg = msgEvent.data;
+ var command = msg.command;
+ info(`Main page, received command=${command}`);
+ if (command == "onpageshow") {
+ info("Page1Shown: " + msg.location);
+ // First time this page is shown.
+ if (counter == 0) {
+ ok(!msg.persisted, "test page should have been persisted initially");
+ var workerMessage = { type: "page1", count: SUB_WORKERS };
+ bc1.postMessage({command: "startWorker", workerMessage});
+ } else {
+ is(msg.persisted, true, "test page should have been persisted in pageshow");
+ var promise = new Promise((resolve, reject) => {
+ info("Waiting a few seconds...");
+ setTimeout(resolve, 10000);
+ });
+
+ promise.then(function() {
+ info("Retrieving data from cache...");
+ return cacheData();
+ })
+
+ .then(function(content) {
+ is(content.indexOf("page1-"), 0, "We have data from the worker");
+ })
+ .then(function() {
+ bc1.postMessage({command: "finish"});
+ });
+ }
+ counter++;
+ } else if (command == "workerMessage") {
+ is(msg.workerMessage, "ready", "We want to receive: -ready-");
+ } else if (command == "verifyCacheData") {
+ var content = await cacheData();
+ is(content.indexOf("page1-"), 0, "We have data from the worker");
+ bc1.postMessage({command: "changeLocation"});
+ } else if (command == "finished") {
+ bc1.close();
+ bc2.close();
+ SimpleTest.finish();
+ }
+ }
+ var bc2 = new BroadcastChannel("page2Shown");
+ bc2.onmessage = async (msgEvent) => {
+ var msg = msgEvent.data;
+ var command = msg.command;
+ if (command == "onpageshow") {
+ info("Page1Shown: " + msg.location);
+ var workerMessage = { type: "page2" };
+ bc2.postMessage({command: "startWorker", workerMessage});
+ } else if (command == "workerMessage") {
+ is(msg.workerMessage, "ready", "We want to receive: -ready-");
+ } else if (command == "verifyCacheData") {
+ var content = await cacheData();
+ is(content, "page2-0", "We have data from the second worker");
+ bc2.postMessage({command: "goBack"});
+ }
+ }
+
+ SpecialPowers.pushPrefEnv({ set: [
+ ["dom.caches.enabled", true],
+ ["dom.caches.testing.enabled", true],
+ // If Fission is disabled, the pref is no-op.
+ ["fission.bfcacheInParent", true],
+ ] },
+ function() {
+ window.open(testUrl1, "", "noopener");
+ });
+
+ }
+
+ 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.pushPrefEnv({
+ set: [["privacy.partition.always_partition_third_party_non_cookie_storage", false]],
+ }).then(() => {
+ SpecialPowers.pushPermissions([{'type': 'storageAccessAPI', 'allow': 1, 'context': document}], () =>{
+ SpecialPowers.wrap(document).requestStorageAccess().then(() => {
+ runTest();
+ }).then(() => {
+ SpecialPowers.removePermission("3rdPartyStorage^http://mochi.test:8888", "http://mochi.xorigin-test:8888");
+ });
+ });
+ });
+ } else {
+ runTest();
+ }
+
+ SimpleTest.waitForExplicitFinish();
+ SimpleTest.requestFlakyTimeout("untriaged");
+
+ </script>
+</body>
+</html>