| <!DOCTYPE html> |
| <!-- |
| Tentative due to: |
| https://github.com/web-platform-tests/wpt/issues/36727 |
| --> |
| <html> |
| <head> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="/resources/testdriver.js"></script> |
| <script src="/resources/testdriver-vendor.js"></script> |
| <script> |
| // Frame layout: |
| // top=this-file [ |
| // child1=child-one.html, |
| // child-so=consumption-sameorigin-child.html [ |
| // gchild=child-two.html |
| // ] |
| // ] |
| let consumption_test = async_test("Consumption test"); |
| |
| let num_children_to_load = 3; |
| let num_children_to_report = 3; |
| |
| function finishLoadPhase() { |
| assert_equals(num_children_to_load, 0); |
| |
| test(() => { |
| assert_false(navigator.userActivation.isActive); |
| assert_false(navigator.userActivation.hasBeenActive); |
| }, "Parent frame initial state"); |
| |
| return test_driver.click(document.getElementById("child-so")); |
| } |
| |
| function finishReportPhase() { |
| assert_equals(num_children_to_report, 0); |
| |
| test(() => { |
| assert_false(navigator.userActivation.isActive); |
| assert_true(navigator.userActivation.hasBeenActive); |
| }, "Parent frame final state"); |
| |
| consumption_test.done(); |
| } |
| |
| window.addEventListener("message", async event => { |
| // Test driver can send messages too... |
| if (typeof event.data !== "string") return; |
| |
| var msg = JSON.parse(event.data); |
| |
| if (msg.type == 'child-one-loaded') { |
| test(() => { |
| assert_false(msg.isActive); |
| assert_false(msg.hasBeenActive); |
| }, "Child1 frame initial state"); |
| } else if (msg.type == 'child-sameorigin-loaded') { |
| test(() => { |
| assert_false(msg.isActive); |
| assert_false(msg.hasBeenActive); |
| }, "Child2 frame initial state"); |
| } else if (msg.type == 'child-two-loaded') { |
| test(() => { |
| assert_false(msg.isActive); |
| assert_false(msg.hasBeenActive); |
| }, "Grandchild frame initial state"); |
| } else if (msg.type == 'child-one-report') { |
| test(() => { |
| assert_false(msg.isActive); |
| assert_true(msg.hasBeenActive); |
| }, "Child1 frame final state"); |
| } else if (msg.type == 'child-sameorigin-report') { |
| // This msg was triggered by a user click followed by a window.open(). |
| test(() => { |
| assert_false(msg.isActive); |
| assert_true(msg.hasBeenActive); |
| }, "Child2 frame final state"); |
| |
| // Ask remaining frames to report states. |
| let ask_report = JSON.stringify({"type": "report"}); |
| frames[0].postMessage(ask_report, "*"); |
| frames[1].frames[0].postMessage(ask_report, "*"); |
| } else if (msg.type == 'child-two-report') { |
| test(() => { |
| assert_false(msg.isActive); |
| assert_true(msg.hasBeenActive); |
| }, "Grand child frame final state"); |
| } |
| |
| // Phase switching. |
| if (msg.type.endsWith("-loaded")) { |
| if (--num_children_to_load == 0) |
| await finishLoadPhase(); |
| } else if (msg.type.endsWith("-report")) { |
| if (--num_children_to_report == 0) |
| finishReportPhase(); |
| } |
| }); |
| async function createIframes() { |
| const child1 = document.createElement("iframe"); |
| child1.src = "resources/child-one.html"; |
| child1.id = "child1"; |
| await new Promise((resolve) => { |
| child1.onload = resolve; |
| document.body.appendChild(child1); |
| }); |
| const childSO = document.createElement("iframe"); |
| childSO.id = "child-so"; |
| childSO.src = "resources/consumption-sameorigin-child.html"; |
| document.body.appendChild(childSO); |
| } |
| </script> |
| </head> |
| <body onload="createIframes()" > |
| <h1>User activation consumption across same-origin frame boundary</h1> |
| <p>Tests that user activation consumption resets the transient states in all same-origin frames.</p> |
| <ol id="instructions"> |
| <li>Click anywhere on the green area (child frame). |
| </ol> |
| </body> |
| </html> |