blob: 36242f44f5f4d1251df0b40d871039ea76a85069 [file] [log] [blame] [edit]
<!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>