/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const gDOMWindowUtils = EventUtils._getDOMWindowUtils(window);
function promiseURLBarFocus() {
const waitForFocusInURLBar = BrowserTestUtils.waitForEvent(gURLBar, "focus");
gURLBar.blur();
gURLBar.focus();
return Promise.all([
waitForFocusInURLBar,
TestUtils.waitForCondition(
() =>
gDOMWindowUtils.IMEStatus === Ci.nsIDOMWindowUtils.IME_STATUS_ENABLED &&
gDOMWindowUtils.inputContextOrigin ===
Ci.nsIDOMWindowUtils.INPUT_CONTEXT_ORIGIN_MAIN
),
]);
}
function promiseIMEStateEnabledByRemote() {
return TestUtils.waitForCondition(
() =>
gDOMWindowUtils.IMEStatus === Ci.nsIDOMWindowUtils.IME_STATUS_ENABLED &&
gDOMWindowUtils.inputContextOrigin ===
Ci.nsIDOMWindowUtils.INPUT_CONTEXT_ORIGIN_CONTENT
);
}
async function test_url_bar_url(aDesc) {
await promiseURLBarFocus();
is(
gDOMWindowUtils.inputContextURI,
null,
`When the search bar has focus, input context URI should be null because of in chrome document (${aDesc})`
);
}
async function test_input_in_http_or_https(aIsHTTPS) {
await promiseURLBarFocus();
const scheme = aIsHTTPS ? "https" : "http";
const url = `${scheme}://example.com/browser/toolkit/content/tests/browser/file_empty.html`;
await BrowserTestUtils.withNewTab(url, async browser => {
ok(browser.isRemoteBrowser, "This test passes only in e10s mode");
await SpecialPowers.spawn(browser, [], async () => {
content.document.body.innerHTML = "";
const input = content.document.querySelector("input");
input.focus();
// Wait for a tick for flushing IMEContentObserver's pending notifications.
await new Promise(resolve =>
content.requestAnimationFrame(() =>
content.requestAnimationFrame(resolve)
)
);
});
await promiseIMEStateEnabledByRemote();
if (!gDOMWindowUtils.inputContextURI) {
ok(
false,
`Input context should have valid URI when the scheme of focused tab's URL is ${scheme}`
);
return;
}
is(
gDOMWindowUtils.inputContextURI.spec,
url,
`Input context should have the document URI when the scheme of focused tab's URL is ${scheme}`
);
});
}
add_task(async () => {
await test_url_bar_url("first check");
});
add_task(async () => {
await test_input_in_http_or_https(true);
});
add_task(async () => {
await test_url_bar_url("check after remote content sets the URI");
});
add_task(async () => {
await test_input_in_http_or_https(false);
});
add_task(async function test_input_in_data() {
await BrowserTestUtils.withNewTab("data:text/html,", async browser => {
ok(browser.isRemoteBrowser, "This test passes only in e10s mode");
await SpecialPowers.spawn(browser, [], async () => {
const input = content.document.querySelector("input");
input.focus();
// Wait for a tick for flushing IMEContentObserver's pending notifications.
await new Promise(resolve =>
content.requestAnimationFrame(() =>
content.requestAnimationFrame(resolve)
)
);
});
await promiseIMEStateEnabledByRemote();
is(
gDOMWindowUtils.inputContextURI,
null,
"Input context should not have data URI"
);
});
});
add_task(async function test_omit_private_things_in_URL() {
await SpecialPowers.pushPrefEnv({
set: [["network.auth.confirmAuth.enabled", false]],
});
await promiseURLBarFocus();
await BrowserTestUtils.withNewTab(
"https://username:password@example.com/browser/toolkit/content/tests/browser/file_empty.html?query=some#ref",
async browser => {
ok(browser.isRemoteBrowser, "This test passes only in e10s mode");
await SpecialPowers.spawn(browser, [], async () => {
content.document.body.innerHTML = "";
const input = content.document.querySelector("input");
input.focus();
// Wait for a tick for flushing IMEContentObserver's pending notifications.
await new Promise(resolve =>
content.requestAnimationFrame(() =>
content.requestAnimationFrame(resolve)
)
);
});
await promiseIMEStateEnabledByRemote();
if (!gDOMWindowUtils.inputContextURI) {
ok(
false,
`Input context should have valid URI even when the URL contains some private things`
);
return;
}
is(
gDOMWindowUtils.inputContextURI.spec,
"https://example.com/browser/toolkit/content/tests/browser/file_empty.html",
`Input context should have the document URI which omit some private things in the URL`
);
}
);
});