add_task(async function () { requestLongerTimeout(2); let testingList = [ { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><input id='target'></body>", tagName: "INPUT", methodName: "focus", }, { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').select(); }, 10);\"><input id='target'></body>", tagName: "INPUT", methodName: "select", }, { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><a href='about:blank' id='target'>anchor</a></body>", tagName: "A", methodName: "focus", }, { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><button id='target'>button</button></body>", tagName: "BUTTON", methodName: "focus", }, { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><select id='target'><option>item1</option></select></body>", tagName: "SELECT", methodName: "focus", }, { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><textarea id='target'>textarea</textarea></body>", tagName: "TEXTAREA", methodName: "focus", }, { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').select(); }, 10);\"><textarea id='target'>textarea</textarea></body>", tagName: "TEXTAREA", methodName: "select", }, { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><label id='target'><input></label></body>", tagName: "INPUT", methodName: "focus of label element", }, { uri: "data:text/html,<body onload=\"setTimeout(function () { document.getElementById('target').focus(); }, 10);\"><fieldset><legend id='target'>legend</legend><input></fieldset></body>", tagName: "INPUT", methodName: "focus of legend element", }, { uri: 'data:text/html,<body onload="setTimeout(function () {' + " var element = document.getElementById('target');" + " var event = document.createEvent('MouseEvent');" + " event.initMouseEvent('click', true, true, window," + " 1, 0, 0, 0, 0, false, false, false, false, 0, element);" + ' element.dispatchEvent(event); }, 10);">' + "<label id='target'><input></label></body>", tagName: "INPUT", methodName: "click event on the label element", }, ]; await BrowserTestUtils.withNewTab("about:blank", async function (bg) { await BrowserTestUtils.withNewTab("about:blank", async function (fg) { for (let test of testingList) { // Focus the foreground tab's content fg.focus(); // Load the URIs. BrowserTestUtils.loadURIString(bg, test.uri); await BrowserTestUtils.browserLoaded(bg); BrowserTestUtils.loadURIString(fg, test.uri); await BrowserTestUtils.browserLoaded(fg); ok(true, "Test1: Both of the tabs are loaded"); // Confirm that the contents should be able to steal focus from content. await SpecialPowers.spawn(fg, [test], test => { return new Promise(res => { function f() { let e = content.document.activeElement; if (e.tagName != test.tagName) { // eslint-disable-next-line mozilla/no-arbitrary-setTimeout content.setTimeout(f, 10); } else { is( Services.focus.focusedElement, e, "the foreground tab's " + test.tagName + " element isn't focused by the " + test.methodName + " (Test1: content can steal focus)" ); res(); } } f(); }); }); await SpecialPowers.spawn(bg, [test], test => { return new Promise(res => { function f() { let e = content.document.activeElement; if (e.tagName != test.tagName) { // eslint-disable-next-line mozilla/no-arbitrary-setTimeout content.setTimeout(f, 10); } else { isnot( Services.focus.focusedElement, e, "the background tab's " + test.tagName + " element is focused by the " + test.methodName + " (Test1: content can steal focus)" ); res(); } } f(); }); }); if (fg.isRemoteBrowser) { is( Services.focus.focusedElement, fg, "Focus should be on the content in the parent process" ); } // Focus chrome gURLBar.focus(); let originalFocus = Services.focus.focusedElement; // Load about:blank just to make sure that everything works nicely BrowserTestUtils.loadURIString(bg, "about:blank"); await BrowserTestUtils.browserLoaded(bg); BrowserTestUtils.loadURIString(fg, "about:blank"); await BrowserTestUtils.browserLoaded(fg); // Load the URIs. BrowserTestUtils.loadURIString(bg, test.uri); await BrowserTestUtils.browserLoaded(bg); BrowserTestUtils.loadURIString(fg, test.uri); await BrowserTestUtils.browserLoaded(fg); ok(true, "Test2: Both of the tabs are loaded"); // Confirm that the contents should be able to steal focus from content. await SpecialPowers.spawn(fg, [test], test => { return new Promise(res => { function f() { let e = content.document.activeElement; if (e.tagName != test.tagName) { // eslint-disable-next-line mozilla/no-arbitrary-setTimeout content.setTimeout(f, 10); } else { isnot( Services.focus.focusedElement, e, "the foreground tab's " + test.tagName + " element is focused by the " + test.methodName + " (Test2: content can NOT steal focus)" ); res(); } } f(); }); }); await SpecialPowers.spawn(bg, [test], test => { return new Promise(res => { function f() { let e = content.document.activeElement; if (e.tagName != test.tagName) { // eslint-disable-next-line mozilla/no-arbitrary-setTimeout content.setTimeout(f, 10); } else { isnot( Services.focus.focusedElement, e, "the background tab's " + test.tagName + " element is focused by the " + test.methodName + " (Test2: content can NOT steal focus)" ); res(); } } f(); }); }); is( Services.focus.focusedElement, originalFocus, "The parent process's focus has shifted " + "(methodName = " + test.methodName + ")" + " (Test2: content can NOT steal focus)" ); } }); }); });