| <!doctype html> |
| <meta charset=utf-8> |
| <title>Test focus and blur event after switching focus from an iframe to another iframe</title> |
| <script src=/resources/testharness.js></script> |
| <script src=/resources/testharnessreport.js></script> |
| <script src="/resources/testdriver.js"></script> |
| <script src="/resources/testdriver-actions.js"></script> |
| <script src="/resources/testdriver-vendor.js"></script> |
| <body></body> |
| <script> |
| function waitForBothIFramesLoaded() { |
| let count = 0; |
| return new Promise(resolve => { |
| window.addEventListener("message", function handler(e) { |
| if (e.data == "ready") { |
| count += 1; |
| } |
| if (count == 2) { |
| window.removeEventListener("message", handler); |
| resolve(); |
| } |
| }); |
| }); |
| } |
| |
| function waitForIframeFocus(w) { |
| return new Promise(resolve => { |
| window.addEventListener("message", function handler(e) { |
| if (e.data == "focus" && |
| e.source == w) { |
| window.removeEventListener("message", handler); |
| resolve(); |
| } |
| }); |
| }); |
| } |
| |
| function clickFocusIFrame(w) { |
| w.postMessage("focus", "*"); |
| } |
| |
| // This will send message to the inner frame to ask it |
| // send the log they collect back. |
| async function getLog(w) { |
| w.postMessage("getlog", "*"); |
| let log = await new Promise( r=> { |
| window.addEventListener("message", function handler(e) { |
| window.removeEventListener("message", handler); |
| r(e.data); |
| }); |
| }); |
| return log; |
| } |
| |
| async function runTest(t, urlForFrame1, urlForFrame2) { |
| const iframe1 = document.createElement("iframe"); |
| iframe1.src = urlForFrame1; |
| const iframe2 = document.createElement("iframe"); |
| iframe2.src = urlForFrame2; |
| document.body.appendChild(iframe1); |
| document.body.appendChild(iframe2); |
| |
| t.add_cleanup(() => { iframe1.remove(); iframe2.remove() }); |
| |
| await waitForBothIFramesLoaded(); |
| iframe1.focus(); |
| await waitForIframeFocus(iframe1.contentWindow); |
| // Ask the iframe2 to be focused by using test_driver to simulate |
| // a click. |
| clickFocusIFrame(iframe2.contentWindow); |
| await waitForIframeFocus(iframe2.contentWindow); |
| assert_equals(await getLog(iframe1.contentWindow), 'innerlog:windowfocus,windowblur,'); |
| } |
| |
| // Both inner frames are different sites. |
| promise_test(async t => { |
| await runTest( |
| t, |
| "http://{{hosts[alt][www]}}:{{ports[http][0]}}/focus/support/focus-event-after-switching-iframes-inner.html", |
| "http://{{hosts[alt][www]}}:{{ports[http][0]}}/focus/support/focus-event-after-switching-iframes-inner.html"); |
| }, "Check focus and blur events after switching from a different site iframe to a different site iframe"); |
| |
| // The one that expects to focus and blur is same site, the other one is different site. |
| promise_test(async t => { |
| await runTest( |
| t, |
| "/focus/support/focus-event-after-switching-iframes-inner.html", |
| "http://{{hosts[alt][www]}}:{{ports[http][0]}}/focus/support/focus-event-after-switching-iframes-inner.html"); |
| }, "Check focus and blur events after switching from a same site iframe to a different site iframe"); |
| |
| // Both inner frames are same site |
| promise_test(async t => { |
| await runTest( |
| t, |
| "/focus/support/focus-event-after-switching-iframes-inner.html", |
| "/focus/support/focus-event-after-switching-iframes-inner.html"); |
| }, "Check focus and blur events after switching from a same site iframe to a same site iframe"); |
| |
| // The one that expects to focus and blur is different site, the other one is same site |
| promise_test(async t => { |
| await runTest( |
| t, |
| "http://{{hosts[alt][www]}}:{{ports[http][0]}}/focus/support/focus-event-after-switching-iframes-inner.html", |
| "/focus/support/focus-event-after-switching-iframes-inner.html"); |
| }, "Check focus and blur events after switching from a different site iframe to a same site iframe"); |
| </script> |