1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
<?xml version="1.0"?>
<!-- This Source Code Form is subject to the terms of the Mozilla Public
- License, v. 2.0. If a copy of the MPL was not distributed with this
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?xml-stylesheet href="chrome://global/skin" type="text/css"?>
<?xml-stylesheet
href="chrome://mochikit/content/tests/SimpleTest/test.css"
type="text/css"?>
<window id="360437Test"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml"
width="600"
height="600"
onload="startTest();"
title="360437 test">
<script type="application/javascript"><![CDATA[
const {BrowserTestUtils} = ChromeUtils.importESModule(
"resource://testing-common/BrowserTestUtils.sys.mjs"
);
const {ContentTask} = ChromeUtils.importESModule(
"resource://testing-common/ContentTask.sys.mjs"
);
ContentTask.setTestScope(window.arguments[0]);
var gFindBar = null;
var gBrowser;
var SimpleTest = window.arguments[0].SimpleTest;
var ok = window.arguments[0].ok;
var is = window.arguments[0].is;
var info = window.arguments[0].info;
async function startTest() {
await SimpleTest.promiseFocus(window);
(async function() {
gFindBar = document.getElementById("FindToolbar");
for (let browserId of ["content", "content-remote"]) {
await startTestWithBrowser(browserId);
}
})().then(() => {
window.close();
SimpleTest.finish();
});
}
async function startTestWithBrowser(browserId) {
info("Starting test with browser '" + browserId + "'");
gBrowser = document.getElementById(browserId);
gFindBar.browser = gBrowser;
let loadedPromise = BrowserTestUtils.browserLoaded(gBrowser);
let contentLoadedPromise = ContentTask.spawn(gBrowser, null, async function() {
return new Promise(resolve => {
addEventListener("DOMContentLoaded", () => resolve(), { once: true });
});
});
BrowserTestUtils.startLoadingURIString(gBrowser, "data:text/html,<form><input id='input' type='text' value='text inside an input element'></form>");
await loadedPromise;
await contentLoadedPromise;
gFindBar.onFindCommand();
// Make sure the findfield is correctly focused on open
var searchStr = "text inside an input element";
await promiseEnterStringIntoFindField(searchStr);
is(document.commandDispatcher.focusedElement,
gFindBar._findField, "Find field isn't focused");
// Make sure "find again" correctly transfers focus to the content element
// when the find bar is closed.
let focusPromise;
if (browserId == "content-remote") {
focusPromise = ContentTask.spawn(gBrowser, null, async function() {
await new Promise(resolve => {
content.document.addEventListener("focus", resolve, { once: true });
});
});
}
info("Wait for findbarclose");
await new Promise(resolve => {
window.addEventListener("findbarclose", resolve, { once: true });
gFindBar.close();
});
info("Wait for document focus");
await focusPromise;
await SpecialPowers.spawn(gBrowser, [], async function() {
Assert.equal(content.document.activeElement,
content.document.getElementById("input"), "Input Element isn't focused");
});
gFindBar.onFindAgainCommand(false);
await SpecialPowers.spawn(gBrowser, [], async function() {
Assert.equal(content.document.activeElement,
content.document.getElementById("input"), "Input Element isn't focused after find again");
});
// Make sure "find again" doesn't focus the content element if focus
// isn't in the content document.
var textbox = document.getElementById("textbox");
textbox.focus();
ok(gFindBar.hidden, "Findbar is hidden");
gFindBar.onFindAgainCommand(false);
is(document.activeElement, textbox,
"Focus was stolen from a chrome element");
}
function promiseFindResult(str = null) {
return new Promise(resolve => {
let listener = {
onFindResult({ searchString }) {
if (str !== null && str != searchString) {
return;
}
gFindBar.browser.finder.removeResultListener(listener);
resolve();
}
};
gFindBar.browser.finder.addResultListener(listener);
});
}
function promiseEnterStringIntoFindField(str) {
let promise = promiseFindResult(str);
for (let i = 0; i < str.length; i++) {
let event = new KeyboardEvent("keypress", {
bubbles: true,
cancelable: true,
view: null,
keyCode: 0,
charCode: str.charCodeAt(i),
});
gFindBar._findField.dispatchEvent(event);
}
return promise;
}
]]></script>
<html:input id="textbox"/>
<browser type="content" primary="true" flex="1" id="content" messagemanagergroup="test" src="about:blank"/>
<browser type="content" primary="true" flex="1" id="content-remote" remote="true" messagemanagergroup="test" src="about:blank"/>
<findbar id="FindToolbar" browserid="content"/>
</window>
|