-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Shared Storage: Add test for SSW fetch controlled by service worker
We add some web tests to show that `fetch()` requests from windows, with the `sharedStorageWritable` attribute set to true in the `RequestInit` dict, that are intercepted by service workers but fallback to network can write to shared storage via response headers. Bug: 1434529,1218540 Change-Id: Ib6a3c078fa6ae599754bc9ab3d7b3e3300bab2fc Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5112422 Reviewed-by: Yao Xiao <yaoxia@chromium.org> Commit-Queue: Cammie Smith Barnes <cammie@chromium.org> Cr-Commit-Position: refs/heads/main@{#1236475}
- Loading branch information
1 parent
b30ae01
commit f3342fe
Showing
2 changed files
with
125 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
109 changes: 109 additions & 0 deletions
109
shared-storage/shared-storage-writable-service-worker-fetch.tentative.https.sub.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
<!doctype html> | ||
<body> | ||
<script src=/resources/testharness.js></script> | ||
<script src=/resources/testharnessreport.js></script> | ||
<script src=/common/utils.js></script> | ||
<script src=/fenced-frame/resources/utils.js></script> | ||
<script src=/shared-storage/resources/util.js></script> | ||
<script src=/service-workers/service-worker/resources/test-helpers.sub.js></script> | ||
<script> | ||
const SCOPE = '/shared-storage/resources/' | ||
+ 'shared-storage-writable-fetch-request-fallback-to-network-iframe.https.html'; | ||
const SCRIPT = '/shared-storage/resources/' | ||
+ 'shared-storage-writable-fetch-request-fallback-to-network-worker.js'; | ||
const SAME_ORIGIN = new URL("", location.href).origin; | ||
const CROSS_ORIGIN = 'https://{{domains[www]}}:{{ports[https][0]}}'; | ||
|
||
async function fetchSharedStorageUrlInNewFrame(data) { | ||
let {test, key, value, hasSharedStorageWritableAttribute, isSameOrigin} | ||
= data; | ||
|
||
const framePromise = new Promise((resolve, reject) => { | ||
let frame = document.createElement('iframe'); | ||
frame.src = SCOPE; | ||
frame.onload = function() { | ||
resolve(frame); | ||
}; | ||
frame.onerror = function() { | ||
reject(new Error('Iframe load failed')); | ||
}; | ||
test.add_cleanup(function() { | ||
frame.remove(); | ||
}); | ||
document.body.appendChild(frame); | ||
}); | ||
let frame = await framePromise; | ||
|
||
let rawWriteHeader = `set;key=${key};value=${value}`; | ||
let writeHeader = encodeURIComponent(rawWriteHeader); | ||
const sameOriginSrc = `/shared-storage/resources/` + | ||
`shared-storage-write.py?write=${writeHeader}`; | ||
const src = isSameOrigin ? | ||
sameOriginSrc : | ||
CROSS_ORIGIN + sameOriginSrc; | ||
return { | ||
response: frame.contentWindow.fetchUrl(src, | ||
hasSharedStorageWritableAttribute), | ||
url: src, | ||
}; | ||
} | ||
|
||
promise_test(async t => { | ||
await service_worker_unregister(t, SCOPE); | ||
let reg = await navigator.serviceWorker.register(SCRIPT, | ||
{ scope: SCOPE }); | ||
t.add_cleanup(_ => reg.unregister()); | ||
let worker = reg.installing; | ||
await wait_for_state(t, worker, 'activated'); | ||
assert_not_equals(worker, null, 'worker is installing'); | ||
|
||
let {response, url} = await fetchSharedStorageUrlInNewFrame({ | ||
test: t, | ||
key: 'a', value: 'b', | ||
hasSharedStorageWritableAttribute: true, | ||
isSameOrigin: true, | ||
}); | ||
checkInterceptedUrls(worker, [ | ||
{"url": SAME_ORIGIN + SCOPE, "mode": "navigate", "SSWHeader": "null"}, | ||
{ | ||
"url": SAME_ORIGIN + "/resources/testharness.js", | ||
"mode": "no-cors", | ||
"SSWHeader": "null" | ||
}, | ||
{"url": SAME_ORIGIN + url, "mode": "cors", "SSWHeader": "null"}, | ||
]); | ||
await verifyKeyValueForOrigin('a', 'b', SAME_ORIGIN); | ||
await deleteKeyForOrigin('a', SAME_ORIGIN); | ||
}, 'test fetch(url, {sharedStorageWritable: true}) via JS from service ' | ||
+ 'worker for same origin fetch'); | ||
|
||
promise_test(async t => { | ||
await service_worker_unregister(t, SCOPE); | ||
let reg = await navigator.serviceWorker.register(SCRIPT, | ||
{ scope: SCOPE }); | ||
t.add_cleanup(_ => reg.unregister()); | ||
let worker = reg.installing; | ||
await wait_for_state(t, worker, 'activated'); | ||
assert_not_equals(worker, null, 'worker is installing'); | ||
|
||
let {response, url} = await fetchSharedStorageUrlInNewFrame({ | ||
test: t, | ||
key: 'c', value: 'd', | ||
hasSharedStorageWritableAttribute: true, | ||
isSameOrigin: false, | ||
}); | ||
checkInterceptedUrls(worker, [ | ||
{"url": SAME_ORIGIN + SCOPE, "mode": "navigate", "SSWHeader": "null"}, | ||
{ | ||
"url": SAME_ORIGIN + "/resources/testharness.js", | ||
"mode": "no-cors", | ||
"SSWHeader": "null" | ||
}, | ||
{"url": url, "mode": "cors", "SSWHeader": "null"}, | ||
]); | ||
await verifyKeyValueForOrigin('c', 'd', CROSS_ORIGIN); | ||
await deleteKeyForOrigin('c', CROSS_ORIGIN); | ||
}, 'test fetch(url, {sharedStorageWritable: true}) via JS from service ' | ||
+ 'worker for cross origin fetch'); | ||
</script> | ||
</body> |