| <!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> |