diff --git a/service-workers/redirects/opaque-redirect.window.js b/service-workers/redirects/opaque-redirect.window.js new file mode 100644 index 00000000000000..9ae0ba583c0d98 --- /dev/null +++ b/service-workers/redirects/opaque-redirect.window.js @@ -0,0 +1,13 @@ +// META: script=../service-worker/resources/test-helpers.sub.js + +promise_test(async t => { + const reg = await service_worker_unregister_and_register(t, "resources/opaque-redirect-serviceworker.js", "resources/"); + t.add_cleanup(async () => await reg.unregister()); + await wait_for_state(t, reg.installing, 'activated'); + const frame = await with_iframe("resources/opaque-redirect.py"); + assert_equals(frame.contentDocument.body.textContent, "stage 1 completed\n"); + frame.remove(); + const frame2 = await with_iframe("resources/x/"); + assert_equals(frame2.contentDocument.body.textContent, "YAY!\n"); + frame2.remove(); +}, "Passing an (opaque) redirect with a relative URL in its Location header to a second navigation with a different base URL"); diff --git a/service-workers/redirects/resources/opaque-redirect-result.txt b/service-workers/redirects/resources/opaque-redirect-result.txt new file mode 100644 index 00000000000000..07103062557c8a --- /dev/null +++ b/service-workers/redirects/resources/opaque-redirect-result.txt @@ -0,0 +1 @@ +YAY! diff --git a/service-workers/redirects/resources/opaque-redirect-serviceworker.js b/service-workers/redirects/resources/opaque-redirect-serviceworker.js new file mode 100644 index 00000000000000..4b336074e5f2ac --- /dev/null +++ b/service-workers/redirects/resources/opaque-redirect-serviceworker.js @@ -0,0 +1,11 @@ +let evilGlobalState = null; +onfetch = e => { + if(e.request.url.endsWith("resources/opaque-redirect.py")) { + e.respondWith(new Promise(async resolve => { + evilGlobalState = await fetch(e.request); + resolve(new Response("stage 1 completed\n")); + })); + } else if(e.request.url.endsWith("resources/x/")) { + e.respondWith(evilGlobalState); + } +} diff --git a/service-workers/redirects/resources/opaque-redirect.py b/service-workers/redirects/resources/opaque-redirect.py new file mode 100644 index 00000000000000..c490bfa5bd6db6 --- /dev/null +++ b/service-workers/redirects/resources/opaque-redirect.py @@ -0,0 +1,3 @@ +def main(request, response): + response.status = 302 + response.headers.set("Location", "opaque-redirect-result.txt") diff --git a/service-workers/redirects/resources/x/opaque-redirect-result.txt b/service-workers/redirects/resources/x/opaque-redirect-result.txt new file mode 100644 index 00000000000000..2d80cb9469bc32 --- /dev/null +++ b/service-workers/redirects/resources/x/opaque-redirect-result.txt @@ -0,0 +1 @@ +NOOO :-(