86 lines
3.2 KiB
HTML
86 lines
3.2 KiB
HTML
<!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>
|
|
async function
|
|
test_shared_storage_writable_fetch_request_in_sandboxed_iframe(
|
|
test, key, value, sandbox_flags, expect_success) {
|
|
// Create sandboxed iframe.
|
|
let frame = document.createElement('iframe');
|
|
frame.sandbox = sandbox_flags;
|
|
let url = new URL(
|
|
'/shared-storage/resources/'
|
|
+ 'shared-storage-writable-fetch-request-in-sandboxed-iframe-'
|
|
+ 'inner.https.sub.html',
|
|
location.href);
|
|
url = appendExpectedKeyAndValue(url, key, value);
|
|
frame.src = url;
|
|
|
|
// We expect a message to bubble up via the sandboxed iframe.
|
|
const promise = new Promise((resolve, reject) => {
|
|
window.addEventListener('message', async function handler(evt) {
|
|
if (evt.source === frame.contentWindow &&
|
|
evt.data.sharedStorageFetchStatus) {
|
|
if (expect_success) {
|
|
assert_true(!!evt.data.sharedStorageWritableHeader,
|
|
"sharedStorageWritableHeader expected in event data");
|
|
assert_equals(evt.data.sharedStorageWritableHeader, '?1');
|
|
assert_equals(evt.data.sharedStorageFetchStatus, "success");
|
|
} else {
|
|
assert_equals(evt.data.sharedStorageFetchStatus.toString(),
|
|
"TypeError: Failed to execute 'fetch' on 'Window':"
|
|
+ " sharedStorageWritable: sharedStorage operations"
|
|
+ " are not available for opaque origins.");
|
|
}
|
|
document.body.removeChild(frame);
|
|
window.removeEventListener('message', handler);
|
|
resolve();
|
|
}
|
|
});
|
|
window.addEventListener('error', () => {
|
|
reject(new Error('Navigation error'));
|
|
});
|
|
});
|
|
|
|
// Navigate and wait for notification.
|
|
document.body.appendChild(frame);
|
|
await promise;
|
|
|
|
if (expect_success) {
|
|
// Verify that the value has been set.
|
|
await verifyKeyValueForOrigin(key, value, location.origin);
|
|
} else {
|
|
// Verify that the value has not been set.
|
|
await verifyKeyNotFoundForOrigin(key, location.origin);
|
|
}
|
|
|
|
// Clean up and finish.
|
|
await sharedStorage.delete(key);
|
|
test.done();
|
|
}
|
|
|
|
async_test(t => {
|
|
test_shared_storage_writable_fetch_request_in_sandboxed_iframe(
|
|
t,
|
|
/*key=*/'a',
|
|
/*value=*/'b',
|
|
/*sandbox_flags=*/'allow-scripts allow-same-origin',
|
|
/*expect_success=*/true);
|
|
}, 'test sharedStorageWritable fetch request in sandboxed iframe with '
|
|
+ '"allow-same-origin"');
|
|
|
|
async_test(t => {
|
|
test_shared_storage_writable_fetch_request_in_sandboxed_iframe(
|
|
t,
|
|
/*key=*/'c',
|
|
/*value=*/'d',
|
|
/*sandbox_flags=*/'allow-scripts',
|
|
/*expect_success=*/true);
|
|
}, 'test sharedStorageWritable fetch request in sandboxed iframe without '
|
|
+ '"allow-same-origin"');
|
|
</script>
|
|
</body>
|