shared-storage-writable-service-worker-fetch.tentative.https.sub.html (4266B)
1 <!doctype html> 2 <body> 3 <script src=/resources/testharness.js></script> 4 <script src=/resources/testharnessreport.js></script> 5 <script src=/common/utils.js></script> 6 <script src=/fenced-frame/resources/utils.js></script> 7 <script src=/shared-storage/resources/util.js></script> 8 <script src=/service-workers/service-worker/resources/test-helpers.sub.js></script> 9 <script> 10 const SCOPE = '/shared-storage/resources/' 11 + 'shared-storage-writable-fetch-request-fallback-to-network-iframe.https.html'; 12 const SCRIPT = '/shared-storage/resources/' 13 + 'shared-storage-writable-fetch-request-fallback-to-network-worker.js'; 14 const SAME_ORIGIN = new URL("", location.href).origin; 15 const CROSS_ORIGIN = 'https://{{domains[www]}}:{{ports[https][0]}}'; 16 17 async function fetchSharedStorageUrlInNewFrame(data) { 18 let {test, key, value, hasSharedStorageWritableAttribute, isSameOrigin} 19 = data; 20 21 const framePromise = new Promise((resolve, reject) => { 22 let frame = document.createElement('iframe'); 23 frame.src = SCOPE; 24 frame.onload = function() { 25 resolve(frame); 26 }; 27 frame.onerror = function() { 28 reject(new Error('Iframe load failed')); 29 }; 30 test.add_cleanup(function() { 31 frame.remove(); 32 }); 33 document.body.appendChild(frame); 34 }); 35 let frame = await framePromise; 36 37 let rawWriteHeader = `set;key=${key};value=${value}`; 38 let writeHeader = encodeURIComponent(rawWriteHeader); 39 const sameOriginSrc = `/shared-storage/resources/` + 40 `shared-storage-write.py?write=${writeHeader}`; 41 const src = isSameOrigin ? 42 sameOriginSrc : 43 CROSS_ORIGIN + sameOriginSrc; 44 return { 45 response: frame.contentWindow.fetchUrl(src, 46 hasSharedStorageWritableAttribute), 47 url: src, 48 }; 49 } 50 51 promise_test(async t => { 52 await service_worker_unregister(t, SCOPE); 53 let reg = await navigator.serviceWorker.register(SCRIPT, 54 { scope: SCOPE }); 55 t.add_cleanup(_ => reg.unregister()); 56 let worker = reg.installing; 57 await wait_for_state(t, worker, 'activated'); 58 assert_not_equals(worker, null, 'worker is installing'); 59 60 let {response, url} = await fetchSharedStorageUrlInNewFrame({ 61 test: t, 62 key: 'a', value: 'b', 63 hasSharedStorageWritableAttribute: true, 64 isSameOrigin: true, 65 }); 66 checkInterceptedUrls(worker, [ 67 {"url": SAME_ORIGIN + SCOPE, "mode": "navigate", "SSWHeader": "null"}, 68 { 69 "url": SAME_ORIGIN + "/resources/testharness.js", 70 "mode": "no-cors", 71 "SSWHeader": "null" 72 }, 73 {"url": SAME_ORIGIN + url, "mode": "cors", "SSWHeader": "null"}, 74 ]); 75 await verifyKeyValueForOrigin('a', 'b', SAME_ORIGIN); 76 await deleteKeyForOrigin('a', SAME_ORIGIN); 77 }, 'test fetch(url, {sharedStorageWritable: true}) via JS from service ' 78 + 'worker for same origin fetch'); 79 80 promise_test(async t => { 81 await service_worker_unregister(t, SCOPE); 82 let reg = await navigator.serviceWorker.register(SCRIPT, 83 { scope: SCOPE }); 84 t.add_cleanup(_ => reg.unregister()); 85 let worker = reg.installing; 86 await wait_for_state(t, worker, 'activated'); 87 assert_not_equals(worker, null, 'worker is installing'); 88 89 let {response, url} = await fetchSharedStorageUrlInNewFrame({ 90 test: t, 91 key: 'c', value: 'd', 92 hasSharedStorageWritableAttribute: true, 93 isSameOrigin: false, 94 }); 95 checkInterceptedUrls(worker, [ 96 {"url": SAME_ORIGIN + SCOPE, "mode": "navigate", "SSWHeader": "null"}, 97 { 98 "url": SAME_ORIGIN + "/resources/testharness.js", 99 "mode": "no-cors", 100 "SSWHeader": "null" 101 }, 102 {"url": url, "mode": "cors", "SSWHeader": "null"}, 103 ]); 104 await verifyKeyValueForOrigin('c', 'd', CROSS_ORIGIN); 105 await deleteKeyForOrigin('c', CROSS_ORIGIN); 106 }, 'test fetch(url, {sharedStorageWritable: true}) via JS from service ' 107 + 'worker for cross origin fetch'); 108 </script> 109 </body>