// META: script=/common/utils.js // META: script=/common/get-host-info.sub.js // META: script=/fetch/fetch-later/resources/fetch-later-helper.js 'use strict'; const { HTTPS_ORIGIN, HTTPS_NOTSAMESITE_ORIGIN, } = get_host_info(); function fetchLaterPopupUrl(host, targetUrl) { return `${host}/fetch/fetch-later/resources/fetch-later.html?url=${ encodeURIComponent(targetUrl)}&activateAfter=0`; } async function receiveMessageFromPopup(url) { const expect = new FetchLaterIframeExpectation(FetchLaterExpectationType.DONE); const messageType = await new Promise((resolve, reject) => { window.addEventListener('message', function handler(e) { try { if (expect.run(e, url)) { window.removeEventListener('message', handler); resolve(e.data.type); } } catch (err) { reject(err); } }); }); assert_equals(messageType, FetchLaterIframeMessageType.DONE); } for (const target of ['', '_blank']) { // NOTE: noopener popup window cannot communicate back. It will be too // unreliable to only use `expectBeacon()` to test such window. for (const features of ['', 'popup']) { parallelPromiseTest( async t => { const uuid = token(); const url = generateSetBeaconURL(uuid, {host: HTTPS_NOTSAMESITE_ORIGIN}); // Opens a blank popup window that fires a fetchLater request. const w = window.open( `javascript: fetchLater("${url}", {activateAfter: 0})`, target, features); await new Promise(resolve => w.addEventListener('load', resolve)); // The popup should have sent the request. await expectBeacon(uuid, {count: 1}); w.close(); }, `A blank window[target='${target}'][features='${ features}'] can trigger fetchLater.`); parallelPromiseTest( async t => { const uuid = token(); const popupUrl = fetchLaterPopupUrl(HTTPS_ORIGIN, generateSetBeaconURL(uuid)); // Opens a same-origin popup that fires a fetchLater request. const w = window.open(popupUrl, target, features); await receiveMessageFromPopup(popupUrl); // The popup should have sent the request. await expectBeacon(uuid, {count: 1}); w.close(); }, `A same-origin window[target='${target}'][features='${ features}'] can trigger fetchLater.`); parallelPromiseTest( async t => { const uuid = token(); const popupUrl = fetchLaterPopupUrl( HTTPS_NOTSAMESITE_ORIGIN, generateSetBeaconURL(uuid)); // Opens a cross-origin popup that fires a fetchLater request. const w = window.open(popupUrl, target, features); await receiveMessageFromPopup(popupUrl); // The popup should have sent the request. await expectBeacon(uuid, {count: 1}); w.close(); }, `A cross-origin window[target='${target}'][features='${ features}'] can trigger fetchLater.`); } }