// META: script=helpers.js // META: script=/resources/testdriver.js // META: script=/resources/testdriver-vendor.js 'use strict'; (async function() { // These are cross-domain from the current document. const wwwAlt = "https://{{hosts[alt][www]}}:{{ports[https][0]}}"; const www1Alt = "https://{{hosts[alt][www1]}}:{{ports[https][0]}}"; const responder_html_load_ack = "/storage-access-api/resources/script-with-cookie-header.py?script=embedded_responder.js&should_ack_load=true"; function permissionChangeEvent() { return new Promise(resolve => { window.onmessage = e => { if (e.data.tag == 'observed_permission_change') { resolve(e.data.state); } }; }); } // Test the interaction between two (same-origin) iframes. promise_test(async (t) => { // Note: the web platform doesn't guarantee that each iframe has finished // loading (and executing its script) by the time the CreateFrame promise // resolves. Therefore the script will signal the parent when it's loaded // and safe to proceed. Without this extra synchronization, frames can // miss messages that are essential to the test, and cause the test to // timeout. const frame1_loaded = new Promise(r => { onmessage = e => r(e.data); }); const frame1 = await CreateFrame(wwwAlt + responder_html_load_ack); assert_equals(await frame1_loaded, "loaded"); const frame2_loaded = new Promise(r => { onmessage = e => r(e.data); }); const frame2 = await CreateFrame(www1Alt + responder_html_load_ack); assert_equals(await frame2_loaded, "loaded"); t.add_cleanup(async () => { await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'prompt']); }); // Install observer on frame, and wait for acknowledgement that it is // installed. assert_equals(await ObservePermissionChange(frame2), "permission_change_observer_installed"); const observed_event = permissionChangeEvent(); await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'granted']); const state = await observed_event; assert_equals(state, "granted"); }, 'Permissions grants are observable across same-origin iframes'); promise_test(async (t) => { // Note: the web platform doesn't guarantee that each iframe has finished // loading (and executing its script) by the time the CreateFrame promise // resolves. Therefore the script will signal the parent when it's loaded // and safe to proceed. Without this extra synchronization, frames can // miss messages that are essential to the test, and cause the test to // timeout. const frame1_loaded = new Promise(r => { onmessage = e => r(e.data); }); const frame1 = await CreateFrame(wwwAlt + responder_html_load_ack); assert_equals(await frame1_loaded, "loaded"); const frame2_loaded = new Promise(r => { onmessage = e => r(e.data); }); const frame2 = await CreateFrame(www1Alt + responder_html_load_ack); assert_equals(await frame2_loaded, "loaded"); t.add_cleanup(async () => { await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'prompt']); }); // Install observer on frame, and wait for acknowledgement that it is // installed. assert_equals(await ObservePermissionChange(frame2), "permission_change_observer_installed"); const observed_event = permissionChangeEvent(); await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'granted']); const state = await observed_event; assert_equals(state, "granted"); }, "Permissions grants are observable across same-site iframes"); promise_test(async () => { // Finally run the simple tests below in a separate cross-origin iframe. await RunTestsInIFrame('https://{{domains[www]}}:{{ports[https][0]}}/storage-access-api/resources/permissions-iframe.https.html'); }, "IFrame tests"); })();