workers.https.html (4839B)
1 <!DOCTYPE html> 2 <title>Construction of Web Workers is deferred</title> 3 <meta name="timeout" content="long"> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script src="/common/utils.js"></script> 7 <script src="/common/dispatcher/dispatcher.js"></script> 8 <script src="../resources/utils.js"></script> 9 <script src="resources/utils.js"></script> 10 11 <body> 12 <script> 13 setup(() => assertSpeculationRulesIsSupported()); 14 15 promise_test(async t => { 16 const {exec, activate} = await create_prerendered_page(t); 17 const workerURL = new URL('resources/worker-post-timeOrigin.js', location.href).toString(); 18 await exec(workerURL => { 19 window.worker = new Worker(workerURL); 20 window.waitForWorker = new Promise(resolve => worker.addEventListener('message', e => { 21 resolve({ 22 prerendering: document.prerendering, 23 activationStart: performance.getEntriesByType('navigation')[0].activationStart, 24 workerLoad: performance.getEntriesByName(workerURL)[0].startTime, 25 workerStart: e.data}); 26 }), workerURL); 27 }, [workerURL]); 28 29 // We want to prevent false success by waiting for enough time to make sure the worker is not 30 // yet initialized 31 await new Promise(resolve => t.step_timeout(resolve, 500)); 32 await activate(); 33 const {workerStart, activationStart, workerLoad, prerendering} = await exec(() => window.waitForWorker); 34 assert_false(prerendering, "DedicatedWorker should be suspended until activated"); 35 assert_greater_than(activationStart, workerLoad, "Loading the worker script should not be delayed"); 36 assert_greater_than(workerStart, activationStart, "Starting the worker should be delayed"); 37 }, "Dedicated workers should be loaded in suspended state until activated"); 38 39 promise_test(async t => { 40 const {exec, activate} = await create_prerendered_page(t); 41 const workerURL = new URL(`resources/shared-worker.py?id=${token()}`, location.href).toString(); 42 await exec(workerURL => { 43 window.worker = new SharedWorker(workerURL, 'dummy'); 44 window.worker.port.start(); 45 window.waitForSharedWorkerLoadingReport = 46 fetch(workerURL + "&check=true") 47 .then(r => t.text()) 48 .then(text => text === 'ok' && document.prerendering); 49 window.waitForWorker = new Promise(resolve => worker.port.addEventListener('message', e => { 50 resolve({ 51 prerendering: document.prerendering, 52 activationStart: performance.getEntriesByType('navigation')[0].activationStart, 53 workerLoad: performance.getEntriesByName(workerURL)[0]?.startTime, 54 workerStart: e.data}); 55 }), workerURL); 56 }, [workerURL]); 57 58 await new Promise(resolve => t.step_timeout(resolve, 300)); 59 await activate(); 60 const {workerStart, activationStart, workerLoad, prerendering} = await exec(() => window.waitForWorker); 61 assert_false(prerendering, "SharedWorker should be suspended until activated"); 62 assert_greater_than(activationStart, workerLoad, "Loading the worker script should not be delayed"); 63 assert_greater_than(workerStart, activationStart, "Starting the worker should be delayed"); 64 }, "Shared workers should be loaded in suspended state until activated"); 65 66 promise_test(async t => { 67 const {exec, activate} = await create_prerendered_page(t); 68 const workerURL = new URL(`resources/shared-worker.py?id=${token()}`, location.href).toString(); 69 const workerStartTime1 = await new Promise(resolve => { 70 const worker = new SharedWorker(workerURL, 'worker'); 71 worker.port.start(); 72 worker.port.addEventListener('message', e => resolve(e.data)); 73 }); 74 75 await exec(workerURL => { 76 window.worker = new SharedWorker(workerURL, 'worker'); 77 window.worker.port.start(); 78 window.waitForWorker = new Promise(resolve => worker.port.addEventListener('message', e => { 79 resolve({ 80 prerendering: document.prerendering, 81 activationStart: performance.getEntriesByType('navigation')[0].activationStart, 82 workerLoad: performance.getEntriesByName(workerURL)[0]?.startTime, 83 workerStartTime2: e.data}); 84 }), workerURL); 85 }, [workerURL]); 86 87 await new Promise(resolve => t.step_timeout(resolve, 300)); 88 await activate(); 89 const {workerStartTime2, activationStart, workerLoad, prerendering} = await exec(() => window.waitForWorker); 90 assert_true(prerendering, "An existing SharedWorker should be accessible while prerendering"); 91 assert_greater_than(activationStart, workerLoad, "Loading the worker script should not be delayed"); 92 assert_equals(workerStartTime1, workerStartTime2, "The prerendered page should connect to the existing worker"); 93 assert_greater_than(activationStart, workerStartTime2, "Starting the worker should be done before activation"); 94 }, "Existing shared workers should be accessible before activation"); 95 </script>