forked from mirrors/gecko-dev
ContentTask tasks have a different lifetime than SpecialPowers tasks, with the former being tied to the lifetime of a message manager and the latter tied to the lifetime of a window global. That means that existing ContentTask callers which expect to be able to register load listeners before the creation of a window global, or which expect to persist after a page has navigated, won't work as SpecialPowers tasks. Since those sorts of tasks are not really resilient in the face of Fission, they should really be written to work differently, but this patch mostly just reverts them to using ContentTask for the time being. Differential Revision: https://phabricator.services.mozilla.com/D53744 --HG-- extra : moz-landing-system : lando
121 lines
4.4 KiB
HTML
121 lines
4.4 KiB
HTML
<?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 imports = ["SimpleTest", "ok", "is", "info"];
|
|
for (var name of imports) {
|
|
window[name] = window.arguments[0][name];
|
|
}
|
|
|
|
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.loadURI(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: function({ 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 = document.createEvent("KeyboardEvent");
|
|
event.initKeyEvent("keypress", true, true, null, false, false,
|
|
false, false, 0, str.charCodeAt(i));
|
|
gFindBar._findField.dispatchEvent(event);
|
|
}
|
|
return promise;
|
|
}
|
|
]]></script>
|
|
<html:input id="textbox"/>
|
|
<browser type="content" primary="true" flex="1" id="content" src="about:blank"/>
|
|
<browser type="content" primary="true" flex="1" id="content-remote" remote="true" src="about:blank"/>
|
|
<findbar id="FindToolbar" browserid="content"/>
|
|
</window>
|