<!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>