// To use this file, use the following imports: // // META: script=/common/dispatcher/dispatcher.js // // META: script=/common/get-host-info.sub.js // // META: script=/common/utils.js // // META: script=/resources/testdriver.js // // META: script=/resources/testdriver-vendor.js // // META: script=/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js // // META: script=./resources/sandbox-top-navigation-helper.sub.js // Helper file that provides various functions to test top-level navigation // with various frame and sandbox flag configurations. async function createNestedIframe(parent, origin, frame_sandbox, header_sandbox) { let headers = []; if (header_sandbox) { headers.push([ "Content-Security-Policy", "sandbox allow-scripts " + header_sandbox ]); } let iframe_attributes = {}; if (frame_sandbox) { iframe_attributes.sandbox = "allow-scripts " + frame_sandbox; } return parent.addIframe({ origin: origin, scripts: [ '/resources/testdriver.js', '/resources/testdriver-vendor.js', ], headers: headers, }, iframe_attributes); } async function navigateFrameTo(frame, origin) { return frame.navigateToNew({ origin: origin, scripts: [ '/resources/testdriver.js', '/resources/testdriver-vendor.js', ], }); } async function attemptTopNavigation(iframe, should_succeed) { let did_succeed; try { await iframe.executeScript(() => { window.top.location.href = 'http://{{hosts[alt][www2]}}:{{ports[http][0]}}'; }); did_succeed = true; } catch (e) { did_succeed = false; } assert_equals(did_succeed, should_succeed, should_succeed ? "The navigation should succeed." : "The navigation should fail."); } async function setupTest() { const rcHelper = new RemoteContextHelper(); return rcHelper.addWindow(/*config=*/ null, /*options=*/ {}); } async function activate(iframe) { return iframe.executeScript(async () => { let b = document.createElement("button"); document.body.appendChild(b); // Since test_driver.bless() does not play nicely with the remote context // helper, this is a workaround to trigger user activation in the iframe. // This adds a button to the iframe and then simulates hitting the 'tab' key // twice. Once to focus on the button, and once to trigger user activation // in the iframe (user activation is given to the frame that has focus when // the tab key is pressed, not the frame that ends up getting focus). Note // that this will result in both the parent and this frame getting user // activation. Note that this currently only works for iframes nested 1 // level deep. test_driver.set_test_context(window.top); return test_driver.send_keys(document.body, "\uE004\uE004"); }); }