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
|
<?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.import("resource://testing-common/BrowserTestUtils.jsm");
const {ContentTask} = ChromeUtils.import("resource://testing-common/ContentTask.jsm");
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;
function startTest() {
(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.loadURIString(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.
await new Promise(resolve => {
window.addEventListener("findbarclose", resolve, { once: true });
gFindBar.close();
});
gFindBar.onFindAgainCommand(false);
await SpecialPowers.spawn(gBrowser, [], async function() {
Assert.equal(content.document.activeElement,
content.document.getElementById("input"), "Input Element isn't focused");
});
// 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>
|