| <!DOCTYPE html> | |
| <title>Credentials in WebBundle subresource loading</title> | |
| <link | |
| rel="help" | |
| href="https://github.com/WICG/webpackage/blob/main/explainers/subresource-loading.md#requests-mode-and-credentials-mode" | |
| /> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="../resources/test-helpers.js"></script> | |
| <body> | |
| <script> | |
| // In this wpt, we test a request's credential mode, which controls | |
| // whether UA sends a credential or not to fetch a bundle. | |
| // If UA sends a credential, check-cookie-and-return-{cross-oriigin}-bundle.py | |
| // returns a valid format webbundle. Then, a subresource fetch should be successful. | |
| // Otherwise, a subresource fetch should be rejected. | |
| setup(() => { | |
| assert_true(HTMLScriptElement.supports("webbundle")); | |
| }); | |
| document.cookie = "milk=1; path=/"; | |
| // Make sure to set a cookie for a cross-origin domain from where a cross | |
| // origin bundle is served. | |
| const setCookiePromise = fetch( | |
| "https://{{domains[www1]}}:{{ports[https][0]}}/cookies/resources/set-cookie.py?name=milk&path=/web-bundle/resources/", | |
| { | |
| mode: "no-cors", | |
| credentials: "include", | |
| } | |
| ); | |
| const same_origin_bundle = "../resources/check-cookie-and-return-bundle.py"; | |
| const cross_origin_bundle = | |
| "https://{{domains[www1]}}:{{ports[https][0]}}/web-bundle/resources/check-cookie-and-return-bundle.py?bundle=cross-origin"; | |
| const same_origin_bundle_subresource = "../resources/wbn/root.js"; | |
| const cross_origin_bundle_subresource = | |
| "https://{{domains[www1]}}:{{ports[https][0]}}/web-bundle/resources/wbn/simple-cross-origin.txt"; | |
| async function assertSubresourceCanBeFetched() { | |
| const response = await fetch(same_origin_bundle_subresource); | |
| const text = await response.text(); | |
| assert_equals(text, "export * from './submodule.js';\n"); | |
| } | |
| async function assertCrossOriginSubresourceCanBeFetched() { | |
| const response = await fetch(cross_origin_bundle_subresource); | |
| const text = await response.text(); | |
| assert_equals(text, "hello from simple-cross-origin.txt"); | |
| } | |
| function createScriptWebBundle(credentials) { | |
| const options = {}; | |
| if (credentials) { | |
| options.credentials = credentials; | |
| } | |
| return createWebBundleElement( | |
| same_origin_bundle, | |
| [same_origin_bundle_subresource], | |
| options | |
| ); | |
| } | |
| function createScriptWebBundleCrossOrigin(credentials) { | |
| const options = {}; | |
| if (credentials) { | |
| options.credentials = credentials; | |
| } | |
| return createWebBundleElement( | |
| cross_origin_bundle, | |
| [cross_origin_bundle_subresource], | |
| options | |
| ); | |
| } | |
| promise_test(async (t) => { | |
| const script = createScriptWebBundle(); | |
| document.body.append(script); | |
| t.add_cleanup(() => script.remove()); | |
| await assertSubresourceCanBeFetched(); | |
| }, "The default should send a credential to a same origin bundle"); | |
| promise_test(async (t) => { | |
| const script = createScriptWebBundle("invalid"); | |
| document.body.append(script); | |
| t.add_cleanup(() => script.remove()); | |
| await assertSubresourceCanBeFetched(); | |
| }, "An invalid value should send a credential to a same origin bundle"); | |
| promise_test(async (t) => { | |
| const script = createScriptWebBundle("omit"); | |
| document.body.append(script); | |
| t.add_cleanup(() => script.remove()); | |
| return promise_rejects_js( | |
| t, | |
| TypeError, | |
| fetch(same_origin_bundle_subresource) | |
| ); | |
| }, "'omit' should not send a credential to a same origin bundle"); | |
| promise_test(async (t) => { | |
| const script = createScriptWebBundle("same-origin"); | |
| document.body.append(script); | |
| t.add_cleanup(() => script.remove()); | |
| await assertSubresourceCanBeFetched(); | |
| }, "'same-origin' should send a credential to a same origin bundle"); | |
| promise_test(async (t) => { | |
| const script = createScriptWebBundle("include"); | |
| document.body.append(script); | |
| t.add_cleanup(() => script.remove()); | |
| await assertSubresourceCanBeFetched(); | |
| }, "'include' should send a credential to a same origin bundle"); | |
| promise_test(async (t) => { | |
| await setCookiePromise; | |
| const script = createScriptWebBundleCrossOrigin("omit"); | |
| document.body.append(script); | |
| t.add_cleanup(() => script.remove()); | |
| return promise_rejects_js( | |
| t, | |
| TypeError, | |
| fetch(cross_origin_bundle_subresource) | |
| ); | |
| }, "'omit' should not send a credential to a cross origin bundle"); | |
| promise_test(async (t) => { | |
| await setCookiePromise; | |
| const script = createScriptWebBundleCrossOrigin("same-origin"); | |
| document.body.append(script); | |
| t.add_cleanup(() => script.remove()); | |
| return promise_rejects_js( | |
| t, | |
| TypeError, | |
| fetch(cross_origin_bundle_subresource) | |
| ); | |
| }, "'same-origin' should not send a credential to a cross origin bundle"); | |
| promise_test(async (t) => { | |
| await setCookiePromise; | |
| const script = createScriptWebBundleCrossOrigin("include"); | |
| document.body.append(script); | |
| t.add_cleanup(() => script.remove()); | |
| await assertCrossOriginSubresourceCanBeFetched(); | |
| }, "'include' should send a credential to a cross origin bundle"); | |
| promise_test(async (t) => { | |
| const script = createScriptWebBundleCrossOrigin("invalid"); | |
| document.body.append(script); | |
| t.add_cleanup(() => script.remove()); | |
| return promise_rejects_js( | |
| t, | |
| TypeError, | |
| fetch(cross_origin_bundle_subresource) | |
| ); | |
| }, "An invalid value should not send a credential to a cross origin bundle"); | |
| </script> | |
| </body> |