// META: timeout=long // META: script=/common/get-host-info.sub.js // META: script=/common/utils.js // META: script=/common/dispatcher/dispatcher.js // META: script=/html/cross-origin-embedder-policy/credentialless/resources/common.js // META: script=./resources/common.js // A set of tests, checking cookies defined from within a credentialless iframe // continue to work. const same_origin = get_host_info().HTTPS_ORIGIN; const cross_origin = get_host_info().HTTPS_REMOTE_ORIGIN; const cookie_key = token() const credentialless_iframe = newIframeCredentialless(cross_origin); // Install some helper functions in the child to observe Cookies: promise_setup(async () => { await send(credentialless_iframe, ` window.getMyCookie = () => { const value = "; " + document.cookie; const parts = value.split("; ${cookie_key}="); if (parts.length !== 2) return undefined return parts.pop().split(';').shift(); }; window.nextCookieValue = () => { return new Promise(resolve => { const old_cookie = getMyCookie(); let timeToLive = 40; // 40 iterations of 100ms = 4s; const interval = setInterval(() => { const next_cookie_value = getMyCookie(); timeToLive--; if (old_cookie !== next_cookie_value || timeToLive <= 0) { clearInterval(interval); resolve(next_cookie_value) } }, 100) }); }; `); }, "Setup"); promise_test(async test => { const this_token = token(); send(credentialless_iframe, ` document.cookie = "${cookie_key}=cookie_value_1"; send("${this_token}", getMyCookie()); `); assert_equals(await receive(this_token), "cookie_value_1"); }, "Set/Get cookie via JS API"); promise_test(async test => { const resource_token = token(); send(credentialless_iframe, ` fetch("${showRequestHeaders(cross_origin, resource_token)}"); `); const request_headers = JSON.parse(await receive(resource_token)); const cookie_value = parseCookies(request_headers)[cookie_key]; assert_equals(cookie_value, "cookie_value_1"); }, "Get Cookie via subresource requests"); promise_test(async test => { const resource_token = token(); const resource_url = cross_origin + "/common/blank.html?pipe=" + `|header(Set-Cookie,${cookie_key}=cookie_value_2;Path=/common/dispatcher)`; const this_token = token(); send(credentialless_iframe, ` const next_cookie_value = nextCookieValue(); fetch("${resource_url}"); send("${this_token}", await next_cookie_value); `); assert_equals(await receive(this_token), "cookie_value_2"); }, "Set Cookie via subresource requests"); promise_test(async test => { const resource_token = token(); const resource_url = cross_origin + "/common/blank.html?pipe=" + `|header(Set-Cookie,${cookie_key}=cookie_value_3;Path=/common/dispatcher)`; const this_token = token(); send(credentialless_iframe, ` const next_cookie_value = nextCookieValue(); const iframe = document.createElement("iframe"); iframe.src = "${resource_url}"; document.body.appendChild(iframe); send("${this_token}", await next_cookie_value); `); assert_equals(await receive(this_token), "cookie_value_3"); }, "Set Cookie via navigation requests");