286 lines
8.9 KiB
JavaScript
286 lines
8.9 KiB
JavaScript
/* 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/. */
|
|
|
|
ChromeUtils.defineESModuleGetters(this, {
|
|
UrlbarUtils: "resource:///modules/UrlbarUtils.sys.mjs",
|
|
});
|
|
|
|
ChromeUtils.defineLazyGetter(this, "UrlbarTestUtils", () => {
|
|
const { UrlbarTestUtils: module } = ChromeUtils.importESModule(
|
|
"resource://testing-common/UrlbarTestUtils.sys.mjs"
|
|
);
|
|
module.init(this);
|
|
return module;
|
|
});
|
|
|
|
/**
|
|
* Clicks the given link and checks this opens the given URI in the new tab.
|
|
*
|
|
* This function does not return to the previous page.
|
|
*/
|
|
async function testLinkOpensUrl({ win, tab, elementId, expectedUrl }) {
|
|
let loadedPromise = BrowserTestUtils.waitForNewTab(win.gBrowser, url =>
|
|
url.startsWith(expectedUrl)
|
|
);
|
|
await SpecialPowers.spawn(tab, [elementId], async function (elemId) {
|
|
content.document.getElementById(elemId).click();
|
|
});
|
|
await loadedPromise;
|
|
is(
|
|
win.gBrowser.selectedBrowser.currentURI.spec,
|
|
expectedUrl,
|
|
`Clicking ${elementId} opened ${expectedUrl} in the same tab.`
|
|
);
|
|
}
|
|
|
|
let expectedEngineAlias;
|
|
let expectedIconURL;
|
|
|
|
add_setup(async function () {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.search.separatePrivateDefault", true],
|
|
// Enable suggestions in this test. Otherwise, the behaviour of the
|
|
// content search box changes.
|
|
["browser.search.suggest.enabled", true],
|
|
],
|
|
});
|
|
|
|
const originalPrivateDefault = await Services.search.getDefaultPrivate();
|
|
// We have to use a built-in engine as we are currently hard-coding the aliases.
|
|
const privateEngine = await Services.search.getEngineByName("DuckDuckGo");
|
|
await Services.search.setDefaultPrivate(
|
|
privateEngine,
|
|
Ci.nsISearchService.CHANGE_REASON_UNKNOWN
|
|
);
|
|
expectedEngineAlias = privateEngine.aliases[0];
|
|
expectedIconURL = await privateEngine.getIconURL();
|
|
|
|
registerCleanupFunction(async () => {
|
|
await Services.search.setDefaultPrivate(
|
|
originalPrivateDefault,
|
|
Ci.nsISearchService.CHANGE_REASON_UNKNOWN
|
|
);
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Tests the private-browsing-myths link in "about:privatebrowsing".
|
|
*/
|
|
add_task(async function test_myths_link() {
|
|
Services.prefs.setCharPref("app.support.baseURL", "https://example.com/");
|
|
registerCleanupFunction(function () {
|
|
Services.prefs.clearUserPref("app.support.baseURL");
|
|
});
|
|
|
|
let { win, tab } = await openAboutPrivateBrowsing();
|
|
|
|
await testLinkOpensUrl({
|
|
win,
|
|
tab,
|
|
elementId: "private-browsing-myths",
|
|
expectedUrl: "https://example.com/private-browsing-myths",
|
|
});
|
|
|
|
await BrowserTestUtils.closeWindow(win);
|
|
});
|
|
|
|
function urlBarHasHiddenFocus(win) {
|
|
return win.gURLBar.focused && !win.gURLBar.hasAttribute("focused");
|
|
}
|
|
|
|
function urlBarHasNormalFocus(win) {
|
|
return win.gURLBar.hasAttribute("focused");
|
|
}
|
|
|
|
/**
|
|
* Tests that we have the correct icon displayed.
|
|
*/
|
|
add_task(async function test_search_icon() {
|
|
let { win, tab } = await openAboutPrivateBrowsing();
|
|
|
|
await SpecialPowers.spawn(tab, [expectedIconURL], async function (iconURL) {
|
|
let computedStyle = content.window.getComputedStyle(content.document.body);
|
|
await ContentTaskUtils.waitForCondition(
|
|
() =>
|
|
computedStyle
|
|
.getPropertyValue("--newtab-search-icon")
|
|
.startsWith("url"),
|
|
"Search Icon should get set."
|
|
);
|
|
|
|
if (iconURL.startsWith("blob:")) {
|
|
// We don't check the data here as `browser_contentSearch.js` performs
|
|
// those checks.
|
|
Assert.ok(
|
|
computedStyle
|
|
.getPropertyValue("--newtab-search-icon")
|
|
.startsWith("url(blob:"),
|
|
"Should have a blob URL for the logo"
|
|
);
|
|
} else {
|
|
Assert.equal(
|
|
computedStyle.getPropertyValue("--newtab-search-icon"),
|
|
`url(${iconURL})`,
|
|
"Should have the correct icon URL for the logo"
|
|
);
|
|
}
|
|
});
|
|
|
|
await BrowserTestUtils.closeWindow(win);
|
|
});
|
|
|
|
/**
|
|
* Tests the search hand-off on character keydown in "about:privatebrowsing".
|
|
*/
|
|
add_task(async function test_search_handoff_on_keydown() {
|
|
let { win, tab } = await openAboutPrivateBrowsing();
|
|
|
|
await SpecialPowers.spawn(tab, [], async function () {
|
|
let btn = content.document.getElementById("search-handoff-button");
|
|
btn.click();
|
|
ok(btn.classList.contains("focused"), "in-content search has focus styles");
|
|
});
|
|
ok(urlBarHasHiddenFocus(win), "Urlbar has hidden focus");
|
|
|
|
// Expect two searches, one to enter search mode and then another in search
|
|
// mode.
|
|
let searchPromise = UrlbarTestUtils.promiseSearchComplete(win);
|
|
|
|
await new Promise(r => EventUtils.synthesizeKey("f", {}, win, r));
|
|
await SpecialPowers.spawn(tab, [], async function () {
|
|
ok(
|
|
content.document
|
|
.getElementById("search-handoff-button")
|
|
.classList.contains("disabled"),
|
|
"in-content search is disabled"
|
|
);
|
|
});
|
|
await searchPromise;
|
|
ok(urlBarHasNormalFocus(win), "Urlbar has normal focus");
|
|
is(win.gURLBar.value, "f", "url bar has search text");
|
|
|
|
// Close the popup.
|
|
await UrlbarTestUtils.promisePopupClose(win);
|
|
|
|
// Hitting ESC should reshow the in-content search
|
|
await new Promise(r => EventUtils.synthesizeKey("KEY_Escape", {}, win, r));
|
|
await SpecialPowers.spawn(tab, [], async function () {
|
|
ok(
|
|
!content.document
|
|
.getElementById("search-handoff-button")
|
|
.classList.contains("disabled"),
|
|
"in-content search is not disabled"
|
|
);
|
|
});
|
|
|
|
await BrowserTestUtils.closeWindow(win);
|
|
});
|
|
|
|
/**
|
|
* Tests the search hand-off on composition start in "about:privatebrowsing".
|
|
*/
|
|
add_task(async function test_search_handoff_on_composition_start() {
|
|
let { win, tab } = await openAboutPrivateBrowsing();
|
|
|
|
await SpecialPowers.spawn(tab, [], async function () {
|
|
content.document.getElementById("search-handoff-button").click();
|
|
});
|
|
ok(urlBarHasHiddenFocus(win), "Urlbar has hidden focus");
|
|
await new Promise(r =>
|
|
EventUtils.synthesizeComposition({ type: "compositionstart" }, win, r)
|
|
);
|
|
ok(urlBarHasNormalFocus(win), "Urlbar has normal focus");
|
|
|
|
await BrowserTestUtils.closeWindow(win);
|
|
});
|
|
|
|
/**
|
|
* Tests the search hand-off on paste in "about:privatebrowsing".
|
|
*/
|
|
add_task(async function test_search_handoff_on_paste() {
|
|
let { win, tab } = await openAboutPrivateBrowsing();
|
|
|
|
await SpecialPowers.spawn(tab, [], async function () {
|
|
content.document.getElementById("search-handoff-button").click();
|
|
});
|
|
ok(urlBarHasHiddenFocus(win), "Urlbar has hidden focus");
|
|
var helper = SpecialPowers.Cc[
|
|
"@mozilla.org/widget/clipboardhelper;1"
|
|
].getService(SpecialPowers.Ci.nsIClipboardHelper);
|
|
helper.copyString("words");
|
|
|
|
// Expect two searches, one to enter search mode and then another in search
|
|
// mode.
|
|
let searchPromise = UrlbarTestUtils.promiseSearchComplete(win);
|
|
|
|
await new Promise(r =>
|
|
EventUtils.synthesizeKey("v", { accelKey: true }, win, r)
|
|
);
|
|
|
|
await searchPromise;
|
|
|
|
ok(urlBarHasNormalFocus(win), "Urlbar has normal focus");
|
|
is(win.gURLBar.value, "words", "Urlbar has search text");
|
|
|
|
await BrowserTestUtils.closeWindow(win);
|
|
});
|
|
|
|
/**
|
|
* Tests that handoff enters search mode when suggestions are disabled.
|
|
*/
|
|
add_task(async function test_search_handoff_search_mode() {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["browser.urlbar.suggest.searches", false]],
|
|
});
|
|
|
|
let { win, tab } = await openAboutPrivateBrowsing();
|
|
|
|
await SpecialPowers.spawn(tab, [], async function () {
|
|
let btn = content.document.getElementById("search-handoff-button");
|
|
btn.click();
|
|
ok(btn.classList.contains("focused"), "in-content search has focus styles");
|
|
});
|
|
ok(urlBarHasHiddenFocus(win), "Urlbar has hidden focus");
|
|
|
|
// Expect two searches, one to enter search mode and then another in search
|
|
// mode.
|
|
let searchPromise = UrlbarTestUtils.promiseSearchComplete(win);
|
|
|
|
await new Promise(r => EventUtils.synthesizeKey("f", {}, win, r));
|
|
await SpecialPowers.spawn(tab, [], async function () {
|
|
ok(
|
|
content.document
|
|
.getElementById("search-handoff-button")
|
|
.classList.contains("disabled"),
|
|
"in-content search is disabled"
|
|
);
|
|
});
|
|
await searchPromise;
|
|
ok(urlBarHasNormalFocus(win), "Urlbar has normal focus");
|
|
await UrlbarTestUtils.assertSearchMode(win, {
|
|
engineName: "DuckDuckGo",
|
|
source: UrlbarUtils.RESULT_SOURCE.SEARCH,
|
|
entry: "handoff",
|
|
});
|
|
is(win.gURLBar.value, "f", "url bar has search text");
|
|
|
|
// Close the popup.
|
|
await UrlbarTestUtils.exitSearchMode(win);
|
|
await UrlbarTestUtils.promisePopupClose(win);
|
|
|
|
// Hitting ESC should reshow the in-content search
|
|
await new Promise(r => EventUtils.synthesizeKey("KEY_Escape", {}, win, r));
|
|
await SpecialPowers.spawn(tab, [], async function () {
|
|
ok(
|
|
!content.document
|
|
.getElementById("search-handoff-button")
|
|
.classList.contains("disabled"),
|
|
"in-content search is not disabled"
|
|
);
|
|
});
|
|
|
|
await BrowserTestUtils.closeWindow(win);
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|