// 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 = "/storage-access-api/resources/script-with-cookie-header.py?script=embedded_responder.js"; if (window === window.top) { // Test the interaction between two (same-origin) iframes. promise_test(async (t) => { const [frame1, frame2] = await Promise.all([ CreateFrame(wwwAlt + responder_html), CreateFrame(wwwAlt + responder_html), ]); t.add_cleanup(async () => { await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'prompt']); }); const observed = ObservePermissionChange(frame2); await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'granted']); const state = await observed; assert_equals(state, "granted"); }, "Permissions grants are observable across same-origin iframes"); // Test the interaction between two cross-origin but same-site iframes. promise_test(async (t) => { const [frame1, frame2] = await Promise.all([ CreateFrame(wwwAlt + responder_html), CreateFrame(www1Alt + responder_html), ]); t.add_cleanup(async () => { await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'prompt']); }); const observed = ObservePermissionChange(frame2); await SetPermissionInFrame(frame1, [{ name: 'storage-access' }, 'granted']); const state = await observed; assert_equals(state, "granted"); }, "Permissions grants are observable across same-site iframes"); promise_test(async (t) => { // 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"); return; } // We're in a cross-origin, same-site iframe test now. test_driver.set_test_context(window.top); promise_test(async t => { const permission = await navigator.permissions.query({name: "storage-access"}); assert_equals(permission.name, "storage-access"); assert_equals(permission.state, "prompt"); }, "Permission default state can be queried"); promise_test(async t => { t.add_cleanup(async () => { await test_driver.set_permission({ name: 'storage-access' }, 'prompt'); }); await test_driver.set_permission({ name: 'storage-access' }, 'granted'); const permission = await navigator.permissions.query({name: "storage-access"}); assert_equals(permission.name, "storage-access"); assert_equals(permission.state, "granted"); }, "Permission granted state can be queried"); promise_test(async t => { t.add_cleanup(async () => { await test_driver.set_permission({ name: 'storage-access' }, 'prompt'); }); await test_driver.set_permission({ name: 'storage-access' }, 'denied'); const permission = await navigator.permissions.query({name: "storage-access"}); assert_equals(permission.name, "storage-access"); assert_equals(permission.state, "prompt"); await test_driver.set_permission({ name: 'storage-access' }, 'prompt'); }, "Permission denied state is hidden"); promise_test(async t => { t.add_cleanup(async () => { await test_driver.set_permission({ name: 'storage-access' }, 'prompt'); }); const permission = await navigator.permissions.query({name: "storage-access"}); const p = new Promise(resolve => { permission.addEventListener("change", (event) => resolve(event), { once: true }); }); await test_driver.set_permission({ name: 'storage-access' }, 'granted'); await document.requestStorageAccess(); const event = await p; assert_equals(event.target.name, "storage-access"); assert_equals(event.target.state, "granted"); }, "Permission state can be observed"); })();