test_subworkers_suspended.html (5163B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>Test for sub workers+bfcache behavior</title> 6 <script src="/tests/SimpleTest/SimpleTest.js"></script> 7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 8 </head> 9 <body> 10 <script type="application/javascript"> 11 12 13 14 /** 15 * - main page opens testUrl1 16 * - testUrl1 ---"onpageshow"---> to main page 17 * - main page ---"startWorker"---> testUrl1 18 * - testUrl1 starts workers, also ---"verifyCacheData"---> main page 19 * - main page ---"changeLocation"---> testUrl1 20 * - testUrl1 navigated to testUrl2 21 * - testUrl2 ---"onpageshow"---> to main page 22 * - main page ---"startWorker"---> testUrl2 23 * - testUrl2 starts workers, also ---"verifyCacheData"---> main page 24 * - main page ---"goBack"---> testUrl2 25 * - testUrl2 navigates back to testUrl1 26 * - testUrl1 ---"onpageshow"---> to main page 27 * - main page checks cache data and ---"finish"---> testUrl2 28 * - testUrl1 ---"finished"---> to main page 29 */ 30 var testUrl1 = "window_suspended.html?page1Shown"; 31 var counter = 0; 32 const SUB_WORKERS = 3; 33 34 function cacheData() { 35 return caches.open("test") 36 .then(function(cache) { 37 return cache.match("http://mochi.test:888/foo"); 38 }) 39 .then(function(response) { 40 return response.text(); 41 }); 42 } 43 44 function runTest() { 45 var bc1 = new BroadcastChannel("page1Shown"); 46 bc1.onmessage = async (msgEvent) => { 47 var msg = msgEvent.data; 48 var command = msg.command; 49 info(`Main page, received command=${command}`); 50 if (command == "onpageshow") { 51 info("Page1Shown: " + msg.location); 52 // First time this page is shown. 53 if (counter == 0) { 54 ok(!msg.persisted, "test page should have been persisted initially"); 55 var workerMessage = { type: "page1", count: SUB_WORKERS }; 56 bc1.postMessage({command: "startWorker", workerMessage}); 57 } else { 58 is(msg.persisted, true, "test page should have been persisted in pageshow"); 59 var promise = new Promise((resolve, reject) => { 60 info("Waiting a few seconds..."); 61 setTimeout(resolve, 10000); 62 }); 63 64 promise.then(function() { 65 info("Retrieving data from cache..."); 66 return cacheData(); 67 }) 68 69 .then(function(content) { 70 is(content.indexOf("page1-"), 0, "We have data from the worker"); 71 }) 72 .then(function() { 73 bc1.postMessage({command: "finish"}); 74 }); 75 } 76 counter++; 77 } else if (command == "workerMessage") { 78 is(msg.workerMessage, "ready", "We want to receive: -ready-"); 79 } else if (command == "verifyCacheData") { 80 var content = await cacheData(); 81 is(content.indexOf("page1-"), 0, "We have data from the worker"); 82 bc1.postMessage({command: "changeLocation"}); 83 } else if (command == "finished") { 84 bc1.close(); 85 bc2.close(); 86 SimpleTest.finish(); 87 } 88 } 89 var bc2 = new BroadcastChannel("page2Shown"); 90 bc2.onmessage = async (msgEvent) => { 91 var msg = msgEvent.data; 92 var command = msg.command; 93 if (command == "onpageshow") { 94 info("Page1Shown: " + msg.location); 95 var workerMessage = { type: "page2" }; 96 bc2.postMessage({command: "startWorker", workerMessage}); 97 } else if (command == "workerMessage") { 98 is(msg.workerMessage, "ready", "We want to receive: -ready-"); 99 } else if (command == "verifyCacheData") { 100 var content = await cacheData(); 101 is(content, "page2-0", "We have data from the second worker"); 102 bc2.postMessage({command: "goBack"}); 103 } 104 } 105 106 SpecialPowers.pushPrefEnv({ set: [ 107 ["dom.caches.testing.enabled", true], 108 // If Fission is disabled, the pref is no-op. 109 ["fission.bfcacheInParent", true], 110 ] }, 111 function() { 112 window.open(testUrl1, "", "noopener"); 113 }); 114 115 } 116 117 if (isXOrigin) { 118 // Bug 1746646: Make mochitests work with TCP enabled (cookieBehavior = 5) 119 // Acquire storage access permission here so that the BroadcastChannel used to 120 // communicate with the opened windows works in xorigin tests. Otherwise, 121 // the iframe containing this page is isolated from first-party storage access, 122 // which isolates BroadcastChannel communication. 123 SpecialPowers.wrap(document).notifyUserGestureActivation(); 124 SpecialPowers.pushPrefEnv({ 125 set: [["privacy.partition.always_partition_third_party_non_cookie_storage", false]], 126 }).then(() => { 127 SpecialPowers.pushPermissions([{'type': 'storageAccessAPI', 'allow': 1, 'context': document}], () =>{ 128 SpecialPowers.wrap(document).requestStorageAccess().then(() => { 129 runTest(); 130 }).then(() => { 131 SpecialPowers.removePermission("3rdPartyStorage^http://mochi.test:8888", "http://mochi.xorigin-test:8888"); 132 }); 133 }); 134 }); 135 } else { 136 runTest(); 137 } 138 139 SimpleTest.waitForExplicitFinish(); 140 SimpleTest.requestFlakyTimeout("untriaged"); 141 142 </script> 143 </body> 144 </html>