summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/web-bundle/subresource-loading/service-worker-controlled.https.tentative.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/web-bundle/subresource-loading/service-worker-controlled.https.tentative.html')
-rw-r--r--testing/web-platform/tests/web-bundle/subresource-loading/service-worker-controlled.https.tentative.html138
1 files changed, 138 insertions, 0 deletions
diff --git a/testing/web-platform/tests/web-bundle/subresource-loading/service-worker-controlled.https.tentative.html b/testing/web-platform/tests/web-bundle/subresource-loading/service-worker-controlled.https.tentative.html
new file mode 100644
index 0000000000..d5c2a06837
--- /dev/null
+++ b/testing/web-platform/tests/web-bundle/subresource-loading/service-worker-controlled.https.tentative.html
@@ -0,0 +1,138 @@
+<!DOCTYPE html>
+<title>
+ Web Bundle fetching and the inner resouirce fetching should skip service
+ worker
+</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"));
+ });
+
+ async function registerServiceWorkerAndReturnActiveWorker(
+ t,
+ script,
+ scope
+ ) {
+ const reg = await navigator.serviceWorker.register(script, {
+ scope: scope,
+ });
+ t.add_cleanup(() => reg.unregister());
+ if (reg.active) return reg.active;
+ const worker = reg.installing || reg.waiting;
+ await new Promise((resolve) => {
+ worker.addEventListener("statechange", (event) => {
+ if (event.target.state == "activated") resolve();
+ });
+ });
+ return worker;
+ }
+
+ async function getRequestedUrls(worker) {
+ return new Promise((resolve) => {
+ navigator.serviceWorker.addEventListener(
+ "message",
+ (e) => {
+ resolve(e.data);
+ },
+ { once: true }
+ );
+ worker.postMessage(null);
+ });
+ }
+
+ promise_test(async (t) => {
+ const iframe_path = "./resources/service-worker-controlled-iframe.html";
+ const iframe_url = new URL(iframe_path, location).href;
+
+ // Register a service worker.
+ const worker = await registerServiceWorkerAndReturnActiveWorker(
+ t,
+ "./resources/service-worker-for-request-monitor.js",
+ iframe_path
+ );
+
+ // Load an iframe which is controlled by the service worker.
+ const iframe = await new Promise((resolve) => {
+ const frame = document.createElement("iframe");
+ t.add_cleanup(() => frame.remove());
+ frame.src = iframe_url;
+ frame.onload = () => {
+ resolve(frame);
+ };
+ document.body.appendChild(frame);
+ });
+ // The iframe request should be intercepted by the service worker.
+ assert_array_equals(await getRequestedUrls(worker), [iframe_url]);
+
+ // Add a web bundle element in the service worker controlled iframe.
+ const frame_id = "uuid-in-package:429fcc4e-0696-4bad-b099-ee9175f023ae";
+ const script_id = "uuid-in-package:020111b3-437a-4c5c-ae07-adb6bbffb720";
+
+ const element = createWebBundleElement(
+ "../../resources/wbn/uuid-in-package.wbn",
+ /*resources=*/ [frame_id, script_id]
+ );
+
+ const element_load_promise = new Promise((resolve) => {
+ element.addEventListener("load", () => {
+ resolve();
+ });
+ });
+ iframe.contentDocument.body.appendChild(element);
+ await element_load_promise;
+ // The web bundle request should not be intercepted by the service worker.
+ assert_array_equals(await getRequestedUrls(worker), []);
+
+ // Add a uuid-in-package URL script element in the service worker
+ // controlled iframe.
+ const result_promise = new Promise((resolve) => {
+ // window.report_result() method will be called by the injected script.
+ iframe.contentWindow.report_result = resolve;
+ });
+ const script = iframe.contentDocument.createElement("script");
+ script.src = script_id;
+ iframe.contentDocument.body.appendChild(script);
+ assert_equals(await result_promise, "OK");
+ // The urn uuld URL script request should not be intercepted by the
+ // service worker.
+ assert_array_equals(await getRequestedUrls(worker), []);
+
+ // Add a uuid-in-package URL iframe element in the service worker controlled
+ // iframe.
+ const inner_iframe = iframe.contentDocument.createElement("iframe");
+ inner_iframe.src = frame_id;
+ const load_promise = new Promise((resolve) => {
+ inner_iframe.addEventListener("load", () => {
+ resolve();
+ });
+ });
+ iframe.contentDocument.body.appendChild(inner_iframe);
+ await load_promise;
+ // The urn uuld URL iframe request should not intercepted by the service
+ // worker.
+ assert_array_equals(await getRequestedUrls(worker), []);
+
+ // Check if the uuid-in-package URL iframe element is loaded correctly.
+ const message_promise = new Promise((resolve) => {
+ window.addEventListener(
+ "message",
+ (e) => {
+ resolve(e.data);
+ },
+ { once: true }
+ );
+ });
+ // location.href is evaluated in the uuid-in-package URL iframe element.
+ inner_iframe.contentWindow.postMessage("location.href", "*");
+ assert_equals(await message_promise, frame_id);
+ }, "Both Web Bundle request and Subresource fetch requests inside the Web " + "Bundle should skip the service worker.");
+ </script>
+</body>