| <!DOCTYPE html> |
| <title>Subframe loading from Web Bundles</title> |
| <link |
| rel="help" |
| href="https://github.com/WICG/webpackage/blob/main/explainers/subresource-loading.md" |
| /> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="../resources/test-helpers.js"></script> |
| <body> |
| <script> |
| setup(() => { |
| assert_true(HTMLScriptElement.supports("webbundle")); |
| }); |
| |
| promise_test(async (t) => { |
| const bundle_url = "../resources/wbn/urn-uuid.wbn"; |
| const frame_url = "urn:uuid:429fcc4e-0696-4bad-b099-ee9175f023ae"; |
| const iframe = await createWebBundleElementAndIframe( |
| t, |
| bundle_url, |
| frame_url |
| ); |
| // The iframe is cross-origin. So accessing iframe.contentWindow.location |
| // should throw a SecurityError. |
| assert_throws_dom("SecurityError", () => { |
| iframe.contentWindow.location.href; |
| }); |
| }, "The urn:uuid URL iframe must be cross-origin."); |
| |
| promise_test(async (t) => { |
| const bundle_url = "../resources/wbn/uuid-in-package.wbn"; |
| const frame_url = "uuid-in-package:429fcc4e-0696-4bad-b099-ee9175f023ae"; |
| const iframe = await createWebBundleElementAndIframe( |
| t, |
| bundle_url, |
| frame_url |
| ); |
| // The iframe is cross-origin. So accessing iframe.contentWindow.location |
| // should throw a SecurityError. |
| assert_throws_dom("SecurityError", () => { |
| iframe.contentWindow.location.href; |
| }); |
| }, "The uuid-in-package: URL iframe must be cross-origin."); |
| |
| uuid_iframe_test( |
| "location.href", |
| [ |
| "urn:uuid:429fcc4e-0696-4bad-b099-ee9175f023ae", |
| "uuid-in-package:429fcc4e-0696-4bad-b099-ee9175f023ae", |
| ], |
| "location.href in opaque-origin iframe." |
| ); |
| |
| uuid_iframe_test( |
| "(" + |
| (() => { |
| try { |
| let result = window.localStorage; |
| return "no error"; |
| } catch (e) { |
| return e.name; |
| } |
| }).toString() + |
| ")()", |
| "SecurityError", |
| "Accesing window.localStorage should throw a SecurityError." |
| ); |
| |
| uuid_iframe_test( |
| "(" + |
| (() => { |
| try { |
| let result = window.sessionStorage; |
| return "no error"; |
| } catch (e) { |
| return e.name; |
| } |
| }).toString() + |
| ")()", |
| "SecurityError", |
| "Accesing window.sessionStorage should throw a SecurityError." |
| ); |
| |
| uuid_iframe_test( |
| "(" + |
| (() => { |
| try { |
| let result = document.cookie; |
| return "no error"; |
| } catch (e) { |
| return e.name; |
| } |
| }).toString() + |
| ")()", |
| "SecurityError", |
| "Accesing document.cookie should throw a SecurityError." |
| ); |
| |
| uuid_iframe_test( |
| "(" + |
| (() => { |
| try { |
| let request = window.indexedDB.open("db"); |
| return "no error"; |
| } catch (e) { |
| return e.name; |
| } |
| }).toString() + |
| ")()", |
| "SecurityError", |
| "Opening an indexedDB should throw a SecurityError." |
| ); |
| |
| uuid_iframe_test( |
| "window.caches === undefined", |
| true, |
| "window.caches should be undefined." |
| ); |
| |
| function uuid_iframe_test(code, expected, name) { |
| if (!Array.isArray(expected)) { |
| expected = [expected, expected]; |
| } |
| promise_test(async (t) => { |
| const bundle_url = "../resources/wbn/urn-uuid.wbn"; |
| const frame_url = "urn:uuid:429fcc4e-0696-4bad-b099-ee9175f023ae"; |
| const iframe = await createWebBundleElementAndIframe( |
| t, |
| bundle_url, |
| frame_url |
| ); |
| assert_equals(await evalInIframe(iframe, code), expected[0]); |
| }, name + "(urn:uuid)"); |
| |
| promise_test(async (t) => { |
| const bundle_url = "../resources/wbn/uuid-in-package.wbn"; |
| const frame_url = |
| "uuid-in-package:429fcc4e-0696-4bad-b099-ee9175f023ae"; |
| const iframe = await createWebBundleElementAndIframe( |
| t, |
| bundle_url, |
| frame_url |
| ); |
| assert_equals(await evalInIframe(iframe, code), expected[1]); |
| }, name + "uuid-in-package"); |
| } |
| |
| async function createWebBundleElementAndIframe(t, bundle_url, frame_url) { |
| const element = createWebBundleElement(bundle_url, [frame_url]); |
| document.body.appendChild(element); |
| const iframe = document.createElement("iframe"); |
| t.add_cleanup(() => { |
| document.body.removeChild(element); |
| document.body.removeChild(iframe); |
| }); |
| iframe.src = frame_url; |
| const load_promise = new Promise((resolve) => { |
| iframe.addEventListener("load", resolve); |
| }); |
| document.body.appendChild(iframe); |
| await load_promise; |
| return iframe; |
| } |
| </script> |
| </body> |