forked from mirrors/gecko-dev
855 lines
27 KiB
JavaScript
855 lines
27 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
// This tests the Privacy pane's Firefox Suggest UI.
|
|
|
|
"use strict";
|
|
|
|
ChromeUtils.defineESModuleGetters(this, {
|
|
QuickSuggest: "resource:///modules/QuickSuggest.sys.mjs",
|
|
});
|
|
|
|
XPCOMUtils.defineLazyGetter(this, "QuickSuggestTestUtils", () => {
|
|
const { QuickSuggestTestUtils: module } = ChromeUtils.importESModule(
|
|
"resource://testing-common/QuickSuggestTestUtils.sys.mjs"
|
|
);
|
|
module.init(this);
|
|
return module;
|
|
});
|
|
|
|
const CONTAINER_ID = "firefoxSuggestContainer";
|
|
const NONSPONSORED_TOGGLE_ID = "firefoxSuggestNonsponsoredToggle";
|
|
const SPONSORED_TOGGLE_ID = "firefoxSuggestSponsoredToggle";
|
|
const DATA_COLLECTION_TOGGLE_ID = "firefoxSuggestDataCollectionToggle";
|
|
const INFO_BOX_ID = "firefoxSuggestInfoBox";
|
|
const INFO_TEXT_ID = "firefoxSuggestInfoText";
|
|
const LEARN_MORE_CLASS = "firefoxSuggestLearnMore";
|
|
const BEST_MATCH_CONTAINER_ID = "firefoxSuggestBestMatchContainer";
|
|
const BEST_MATCH_CHECKBOX_ID = "firefoxSuggestBestMatch";
|
|
const BUTTON_RESTORE_DISMISSED_ID = "restoreDismissedSuggestions";
|
|
const PREF_URLBAR_QUICKSUGGEST_BLOCKLIST =
|
|
"browser.urlbar.quicksuggest.blockedDigests";
|
|
const PREF_URLBAR_WEATHER_USER_ENABLED = "browser.urlbar.suggest.weather";
|
|
|
|
// Maps text element IDs to `{ enabled, disabled }`, where `enabled` is the
|
|
// expected l10n ID when the Firefox Suggest feature is enabled, and `disabled`
|
|
// is when disabled.
|
|
const EXPECTED_L10N_IDS = {
|
|
locationBarGroupHeader: {
|
|
enabled: "addressbar-header-firefox-suggest",
|
|
disabled: "addressbar-header",
|
|
},
|
|
locationBarSuggestionLabel: {
|
|
enabled: "addressbar-suggest-firefox-suggest",
|
|
disabled: "addressbar-suggest",
|
|
},
|
|
};
|
|
|
|
// This test can take a while due to the many permutations some of these tasks
|
|
// run through, so request a longer timeout.
|
|
requestLongerTimeout(10);
|
|
|
|
// The following tasks check the visibility of the Firefox Suggest UI based on
|
|
// the value of the feature pref. See doVisibilityTest().
|
|
|
|
add_task(async function historyToOffline() {
|
|
await doVisibilityTest({
|
|
initialScenario: "history",
|
|
initialExpectedVisibility: false,
|
|
newScenario: "offline",
|
|
newExpectedVisibility: true,
|
|
});
|
|
});
|
|
|
|
add_task(async function historyToOnline() {
|
|
await doVisibilityTest({
|
|
initialScenario: "history",
|
|
initialExpectedVisibility: false,
|
|
newScenario: "online",
|
|
newExpectedVisibility: true,
|
|
});
|
|
});
|
|
|
|
add_task(async function offlineToHistory() {
|
|
await doVisibilityTest({
|
|
initialScenario: "offline",
|
|
initialExpectedVisibility: true,
|
|
newScenario: "history",
|
|
newExpectedVisibility: false,
|
|
});
|
|
});
|
|
|
|
add_task(async function offlineToOnline() {
|
|
await doVisibilityTest({
|
|
initialScenario: "offline",
|
|
initialExpectedVisibility: true,
|
|
newScenario: "online",
|
|
newExpectedVisibility: true,
|
|
});
|
|
});
|
|
|
|
add_task(async function onlineToHistory() {
|
|
await doVisibilityTest({
|
|
initialScenario: "online",
|
|
initialExpectedVisibility: true,
|
|
newScenario: "history",
|
|
newExpectedVisibility: false,
|
|
});
|
|
});
|
|
|
|
add_task(async function onlineToOffline() {
|
|
await doVisibilityTest({
|
|
initialScenario: "online",
|
|
initialExpectedVisibility: true,
|
|
newScenario: "offline",
|
|
newExpectedVisibility: true,
|
|
});
|
|
});
|
|
|
|
/**
|
|
* Runs a test that checks the visibility of the Firefox Suggest preferences UI
|
|
* based on scenario pref.
|
|
*
|
|
* @param {string} initialScenario
|
|
* The initial scenario.
|
|
* @param {boolean} initialExpectedVisibility
|
|
* Whether the UI should be visible with the initial scenario.
|
|
* @param {string} newScenario
|
|
* The updated scenario.
|
|
* @param {boolean} newExpectedVisibility
|
|
* Whether the UI should be visible after setting the new scenario.
|
|
*/
|
|
async function doVisibilityTest({
|
|
initialScenario,
|
|
initialExpectedVisibility,
|
|
newScenario,
|
|
newExpectedVisibility,
|
|
}) {
|
|
info(
|
|
"Running visibility test: " +
|
|
JSON.stringify(
|
|
{
|
|
initialScenario,
|
|
initialExpectedVisibility,
|
|
newScenario,
|
|
newExpectedVisibility,
|
|
},
|
|
null,
|
|
2
|
|
)
|
|
);
|
|
|
|
// Set the initial scenario.
|
|
await QuickSuggestTestUtils.setScenario(initialScenario);
|
|
|
|
Assert.equal(
|
|
Services.prefs.getBoolPref("browser.urlbar.quicksuggest.enabled"),
|
|
initialExpectedVisibility,
|
|
`quicksuggest.enabled is correct after setting initial scenario, initialExpectedVisibility=${initialExpectedVisibility}`
|
|
);
|
|
|
|
// Open prefs and check the initial visibility.
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
|
|
|
|
let doc = gBrowser.selectedBrowser.contentDocument;
|
|
let container = doc.getElementById(CONTAINER_ID);
|
|
Assert.equal(
|
|
BrowserTestUtils.is_visible(container),
|
|
initialExpectedVisibility,
|
|
`The container has the expected initial visibility, initialExpectedVisibility=${initialExpectedVisibility}`
|
|
);
|
|
|
|
// Check the text elements' l10n IDs.
|
|
for (let [id, { enabled, disabled }] of Object.entries(EXPECTED_L10N_IDS)) {
|
|
Assert.equal(
|
|
doc.getElementById(id).dataset.l10nId,
|
|
initialExpectedVisibility ? enabled : disabled,
|
|
`Initial l10n ID for element with ID ${id}, initialExpectedVisibility=${initialExpectedVisibility}`
|
|
);
|
|
}
|
|
|
|
// Set the new scenario.
|
|
await QuickSuggestTestUtils.setScenario(newScenario);
|
|
|
|
Assert.equal(
|
|
Services.prefs.getBoolPref("browser.urlbar.quicksuggest.enabled"),
|
|
newExpectedVisibility,
|
|
`quicksuggest.enabled is correct after setting new scenario, newExpectedVisibility=${newExpectedVisibility}`
|
|
);
|
|
|
|
// Check visibility again.
|
|
Assert.equal(
|
|
BrowserTestUtils.is_visible(container),
|
|
newExpectedVisibility,
|
|
`The container has the expected visibility after setting new scenario, newExpectedVisibility=${newExpectedVisibility}`
|
|
);
|
|
|
|
// Check the text elements' l10n IDs again.
|
|
for (let [id, { enabled, disabled }] of Object.entries(EXPECTED_L10N_IDS)) {
|
|
Assert.equal(
|
|
doc.getElementById(id).dataset.l10nId,
|
|
newExpectedVisibility ? enabled : disabled,
|
|
`New l10n ID for element with ID ${id}, newExpectedVisibility=${newExpectedVisibility}`
|
|
);
|
|
}
|
|
|
|
// Clean up.
|
|
gBrowser.removeCurrentTab();
|
|
await QuickSuggestTestUtils.setScenario(null);
|
|
}
|
|
|
|
// Verifies all 8 states of the 3 toggles and their related info box states.
|
|
add_task(async function togglesAndInfoBox() {
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
|
|
|
|
// suggest.quicksuggest.nonsponsored = true
|
|
// suggest.quicksuggest.sponsored = true
|
|
// quicksuggest.dataCollection.enabled = true
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", true],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", true],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", true],
|
|
],
|
|
});
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: true,
|
|
[SPONSORED_TOGGLE_ID]: true,
|
|
[DATA_COLLECTION_TOGGLE_ID]: true,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-all");
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
// suggest.quicksuggest.nonsponsored = true
|
|
// suggest.quicksuggest.sponsored = true
|
|
// quicksuggest.dataCollection.enabled = false
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", true],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", true],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", false],
|
|
],
|
|
});
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: true,
|
|
[SPONSORED_TOGGLE_ID]: true,
|
|
[DATA_COLLECTION_TOGGLE_ID]: false,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-nonsponsored-sponsored");
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
// suggest.quicksuggest.nonsponsored = true
|
|
// suggest.quicksuggest.sponsored = false
|
|
// quicksuggest.dataCollection.enabled = true
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", true],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", false],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", true],
|
|
],
|
|
});
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: true,
|
|
[SPONSORED_TOGGLE_ID]: false,
|
|
[DATA_COLLECTION_TOGGLE_ID]: true,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-nonsponsored-data");
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
// suggest.quicksuggest.nonsponsored = true
|
|
// suggest.quicksuggest.sponsored = false
|
|
// quicksuggest.dataCollection.enabled = false
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", true],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", false],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", false],
|
|
],
|
|
});
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: true,
|
|
[SPONSORED_TOGGLE_ID]: false,
|
|
[DATA_COLLECTION_TOGGLE_ID]: false,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-nonsponsored");
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
// suggest.quicksuggest.nonsponsored = false
|
|
// suggest.quicksuggest.sponsored = true
|
|
// quicksuggest.dataCollection.enabled = true
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", false],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", true],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", true],
|
|
],
|
|
});
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: false,
|
|
[SPONSORED_TOGGLE_ID]: true,
|
|
[DATA_COLLECTION_TOGGLE_ID]: true,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-sponsored-data");
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
// suggest.quicksuggest.nonsponsored = false
|
|
// suggest.quicksuggest.sponsored = true
|
|
// quicksuggest.dataCollection.enabled = false
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", false],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", true],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", false],
|
|
],
|
|
});
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: false,
|
|
[SPONSORED_TOGGLE_ID]: true,
|
|
[DATA_COLLECTION_TOGGLE_ID]: false,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-sponsored");
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
// suggest.quicksuggest.nonsponsored = false
|
|
// suggest.quicksuggest.sponsored = false
|
|
// quicksuggest.dataCollection.enabled = true
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", false],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", false],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", true],
|
|
],
|
|
});
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: false,
|
|
[SPONSORED_TOGGLE_ID]: false,
|
|
[DATA_COLLECTION_TOGGLE_ID]: true,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-data");
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
// suggest.quicksuggest.nonsponsored = false
|
|
// suggest.quicksuggest.sponsored = false
|
|
// quicksuggest.dataCollection.enabled = false
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", false],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", false],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", false],
|
|
],
|
|
});
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: false,
|
|
[SPONSORED_TOGGLE_ID]: false,
|
|
[DATA_COLLECTION_TOGGLE_ID]: false,
|
|
});
|
|
await assertInfoBox(null);
|
|
await SpecialPowers.popPrefEnv();
|
|
|
|
gBrowser.removeCurrentTab();
|
|
});
|
|
|
|
// Clicks each of the toggles and makes sure the prefs and info box are updated.
|
|
add_task(async function clickToggles() {
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
|
|
|
|
let doc = gBrowser.selectedBrowser.contentDocument;
|
|
let addressBarSection = doc.getElementById("locationBarGroup");
|
|
addressBarSection.scrollIntoView();
|
|
|
|
async function clickToggle(id) {
|
|
let toggle = doc.getElementById(id);
|
|
let changed = BrowserTestUtils.waitForEvent(toggle, "toggle");
|
|
let button = toggle.buttonEl;
|
|
await EventUtils.synthesizeMouseAtCenter(
|
|
button,
|
|
{},
|
|
gBrowser.selectedBrowser.contentWindow
|
|
);
|
|
await changed;
|
|
}
|
|
|
|
// Set initial state.
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", true],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", true],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", true],
|
|
],
|
|
});
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: true,
|
|
[SPONSORED_TOGGLE_ID]: true,
|
|
[DATA_COLLECTION_TOGGLE_ID]: true,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-all");
|
|
|
|
// non-sponsored toggle
|
|
await clickToggle(NONSPONSORED_TOGGLE_ID);
|
|
Assert.ok(
|
|
!Services.prefs.getBoolPref(
|
|
"browser.urlbar.suggest.quicksuggest.nonsponsored"
|
|
),
|
|
"suggest.quicksuggest.nonsponsored is false after clicking non-sponsored toggle"
|
|
);
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: false,
|
|
[SPONSORED_TOGGLE_ID]: true,
|
|
[DATA_COLLECTION_TOGGLE_ID]: true,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-sponsored-data");
|
|
|
|
// sponsored toggle
|
|
await clickToggle(SPONSORED_TOGGLE_ID);
|
|
Assert.ok(
|
|
!Services.prefs.getBoolPref(
|
|
"browser.urlbar.suggest.quicksuggest.nonsponsored"
|
|
),
|
|
"suggest.quicksuggest.nonsponsored remains false after clicking sponsored toggle"
|
|
);
|
|
Assert.ok(
|
|
!Services.prefs.getBoolPref(
|
|
"browser.urlbar.suggest.quicksuggest.sponsored"
|
|
),
|
|
"suggest.quicksuggest.sponsored is false after clicking sponsored toggle"
|
|
);
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: false,
|
|
[SPONSORED_TOGGLE_ID]: false,
|
|
[DATA_COLLECTION_TOGGLE_ID]: true,
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-data");
|
|
|
|
// data collection toggle
|
|
await clickToggle(DATA_COLLECTION_TOGGLE_ID);
|
|
Assert.ok(
|
|
!Services.prefs.getBoolPref(
|
|
"browser.urlbar.suggest.quicksuggest.nonsponsored"
|
|
),
|
|
"suggest.quicksuggest.nonsponsored remains false after clicking sponsored toggle"
|
|
);
|
|
Assert.ok(
|
|
!Services.prefs.getBoolPref(
|
|
"browser.urlbar.suggest.quicksuggest.sponsored"
|
|
),
|
|
"suggest.quicksuggest.sponsored remains false after clicking data collection toggle"
|
|
);
|
|
Assert.ok(
|
|
!Services.prefs.getBoolPref(
|
|
"browser.urlbar.quicksuggest.dataCollection.enabled"
|
|
),
|
|
"quicksuggest.dataCollection.enabled is false after clicking data collection toggle"
|
|
);
|
|
assertPrefUIState({
|
|
[NONSPONSORED_TOGGLE_ID]: false,
|
|
[SPONSORED_TOGGLE_ID]: false,
|
|
[DATA_COLLECTION_TOGGLE_ID]: false,
|
|
});
|
|
await assertInfoBox(null);
|
|
|
|
gBrowser.removeCurrentTab();
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
|
|
// Clicks the learn-more links and checks the help page is opened in a new tab.
|
|
add_task(async function clickLearnMore() {
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
|
|
|
|
let doc = gBrowser.selectedBrowser.contentDocument;
|
|
let addressBarSection = doc.getElementById("locationBarGroup");
|
|
addressBarSection.scrollIntoView();
|
|
|
|
// Set initial state so that the info box and learn more link are shown.
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [
|
|
["browser.urlbar.suggest.quicksuggest.nonsponsored", true],
|
|
["browser.urlbar.suggest.quicksuggest.sponsored", true],
|
|
["browser.urlbar.quicksuggest.dataCollection.enabled", true],
|
|
],
|
|
});
|
|
await assertInfoBox("addressbar-firefox-suggest-info-all");
|
|
|
|
let learnMoreLinks = doc.querySelectorAll("." + LEARN_MORE_CLASS);
|
|
Assert.equal(
|
|
learnMoreLinks.length,
|
|
3,
|
|
"Expected number of learn-more links are present"
|
|
);
|
|
for (let link of learnMoreLinks) {
|
|
Assert.ok(
|
|
BrowserTestUtils.is_visible(link),
|
|
"Learn-more link is visible: " + link.id
|
|
);
|
|
}
|
|
|
|
let prefsTab = gBrowser.selectedTab;
|
|
for (let link of learnMoreLinks) {
|
|
let tabPromise = BrowserTestUtils.waitForNewTab(
|
|
gBrowser,
|
|
QuickSuggest.HELP_URL
|
|
);
|
|
info("Clicking learn-more link: " + link.id);
|
|
Assert.ok(link.id, "Sanity check: Learn-more link has an ID");
|
|
await BrowserTestUtils.synthesizeMouseAtCenter(
|
|
"#" + link.id,
|
|
{},
|
|
gBrowser.selectedBrowser
|
|
);
|
|
info("Waiting for help page to load in a new tab");
|
|
await tabPromise;
|
|
gBrowser.removeCurrentTab();
|
|
gBrowser.selectedTab = prefsTab;
|
|
}
|
|
|
|
gBrowser.removeCurrentTab();
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
|
|
// Tests the visibility of the best match checkbox based on the values of
|
|
// `browser.urlbar.quicksuggest.enabled` and `browser.urlbar.bestMatch.enabled`.
|
|
add_task(async function bestMatchVisibility() {
|
|
for (let initialQuickSuggest of [false, true]) {
|
|
for (let initialBestMatch of [false, true]) {
|
|
for (let newQuickSuggest of [false, true]) {
|
|
for (let newBestMatch of [false, true]) {
|
|
await doBestMatchVisibilityTest({
|
|
initialQuickSuggest,
|
|
initialBestMatch,
|
|
newQuickSuggest,
|
|
newBestMatch,
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
// Tests the "Restore" button for dismissed suggestions.
|
|
add_task(async function restoreDismissedSuggestions() {
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
|
|
|
|
let doc = gBrowser.selectedBrowser.contentDocument;
|
|
let addressBarSection = doc.getElementById("locationBarGroup");
|
|
addressBarSection.scrollIntoView();
|
|
|
|
let button = doc.getElementById(BUTTON_RESTORE_DISMISSED_ID);
|
|
Assert.equal(
|
|
Services.prefs.getStringPref(PREF_URLBAR_QUICKSUGGEST_BLOCKLIST, ""),
|
|
"",
|
|
"Block list is empty initially"
|
|
);
|
|
Assert.ok(
|
|
Services.prefs.getBoolPref(PREF_URLBAR_WEATHER_USER_ENABLED),
|
|
"Weather suggestions are enabled initially"
|
|
);
|
|
Assert.ok(button.disabled, "Restore button is disabled initially.");
|
|
|
|
await QuickSuggest.blockedSuggestions.add("https://example.com/");
|
|
Assert.notEqual(
|
|
Services.prefs.getStringPref(PREF_URLBAR_QUICKSUGGEST_BLOCKLIST, ""),
|
|
"",
|
|
"Block list is non-empty after adding URL"
|
|
);
|
|
Assert.ok(!button.disabled, "Restore button is enabled after blocking URL.");
|
|
button.click();
|
|
Assert.equal(
|
|
Services.prefs.getStringPref(PREF_URLBAR_QUICKSUGGEST_BLOCKLIST, ""),
|
|
"",
|
|
"Block list is empty clicking Restore button"
|
|
);
|
|
Assert.ok(button.disabled, "Restore button is disabled after clicking it.");
|
|
|
|
Services.prefs.setBoolPref(PREF_URLBAR_WEATHER_USER_ENABLED, false);
|
|
Assert.ok(
|
|
!button.disabled,
|
|
"Restore button is enabled after disabling weather suggestions."
|
|
);
|
|
button.click();
|
|
Assert.ok(
|
|
Services.prefs.getBoolPref(PREF_URLBAR_WEATHER_USER_ENABLED),
|
|
"Weather suggestions are enabled after clicking Restore button"
|
|
);
|
|
Assert.ok(
|
|
button.disabled,
|
|
"Restore button is disabled after clicking it again."
|
|
);
|
|
|
|
gBrowser.removeCurrentTab();
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
|
|
/**
|
|
* Runs a test that checks the visibility of the Firefox Suggest best match
|
|
* checkbox. It does the following:
|
|
*
|
|
* 1. Sets the quick suggest and best match feature prefs
|
|
* 2. Opens about:preferences and checks the visibility of the checkbox
|
|
* 3. Sets the quick suggest and best match feature prefs again
|
|
* 4. Checks the visibility of the checkbox again
|
|
*
|
|
* @param {boolean} initialQuickSuggest
|
|
* The value to set for `browser.urlbar.quicksuggest.enabled` before
|
|
* about:preferences is opened.
|
|
* @param {boolean} initialBestMatch
|
|
* The value to set for `browser.urlbar.bestMatch.enabled` before
|
|
* about:preferences is opened.
|
|
* @param {boolean} newQuickSuggest
|
|
* The value to set for `browser.urlbar.quicksuggest.enabled` while
|
|
* about:preferences is open.
|
|
* @param {boolean} newBestMatch
|
|
* The value to set for `browser.urlbar.bestMatch.enabled` while
|
|
* about:preferences is open.
|
|
*/
|
|
async function doBestMatchVisibilityTest({
|
|
initialQuickSuggest,
|
|
initialBestMatch,
|
|
newQuickSuggest,
|
|
newBestMatch,
|
|
}) {
|
|
info(
|
|
"Running best match visibility test: " +
|
|
JSON.stringify(
|
|
{
|
|
initialQuickSuggest,
|
|
initialBestMatch,
|
|
newQuickSuggest,
|
|
newBestMatch,
|
|
},
|
|
null,
|
|
2
|
|
)
|
|
);
|
|
|
|
// Set the initial pref values.
|
|
Services.prefs.setBoolPref(
|
|
"browser.urlbar.quicksuggest.enabled",
|
|
initialQuickSuggest
|
|
);
|
|
Services.prefs.setBoolPref(
|
|
"browser.urlbar.bestMatch.enabled",
|
|
initialBestMatch
|
|
);
|
|
|
|
// Open prefs and check the initial visibility.
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
|
|
let doc = gBrowser.selectedBrowser.contentDocument;
|
|
let container = doc.getElementById(BEST_MATCH_CONTAINER_ID);
|
|
Assert.equal(
|
|
BrowserTestUtils.is_visible(container),
|
|
initialBestMatch,
|
|
"The checkbox container has the expected initial visibility"
|
|
);
|
|
|
|
// Set the new pref values.
|
|
Services.prefs.setBoolPref(
|
|
"browser.urlbar.quicksuggest.enabled",
|
|
newQuickSuggest
|
|
);
|
|
Services.prefs.setBoolPref("browser.urlbar.bestMatch.enabled", newBestMatch);
|
|
|
|
// Check visibility again.
|
|
Assert.equal(
|
|
BrowserTestUtils.is_visible(container),
|
|
newBestMatch,
|
|
"The checkbox container has the expected visibility after setting prefs"
|
|
);
|
|
|
|
// Clean up.
|
|
gBrowser.removeCurrentTab();
|
|
Services.prefs.clearUserPref("browser.urlbar.quicksuggest.enabled");
|
|
Services.prefs.clearUserPref("browser.urlbar.bestMatch.enabled");
|
|
}
|
|
|
|
// Tests the visibility of the best match checkbox when the best match feature
|
|
// is enabled via a Nimbus experiment before about:preferences is opened.
|
|
add_task(async function bestMatchVisibility_experiment_beforeOpen() {
|
|
await QuickSuggestTestUtils.withExperiment({
|
|
valueOverrides: {
|
|
bestMatchEnabled: true,
|
|
},
|
|
callback: async () => {
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", {
|
|
leaveOpen: true,
|
|
});
|
|
let doc = gBrowser.selectedBrowser.contentDocument;
|
|
let container = doc.getElementById(BEST_MATCH_CONTAINER_ID);
|
|
Assert.ok(
|
|
BrowserTestUtils.is_visible(container),
|
|
"The checkbox container is visible"
|
|
);
|
|
gBrowser.removeCurrentTab();
|
|
},
|
|
});
|
|
});
|
|
|
|
// Tests the visibility of the best match checkbox when the best match feature
|
|
// is enabled via a Nimbus experiment after about:preferences is opened.
|
|
add_task(async function bestMatchVisibility_experiment_afterOpen() {
|
|
// Open prefs and check the initial visibility.
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
|
|
let doc = gBrowser.selectedBrowser.contentDocument;
|
|
let container = doc.getElementById(BEST_MATCH_CONTAINER_ID);
|
|
Assert.ok(
|
|
BrowserTestUtils.is_hidden(container),
|
|
"The checkbox container is hidden initially"
|
|
);
|
|
|
|
// Install an experiment with best match enabled.
|
|
await QuickSuggestTestUtils.withExperiment({
|
|
valueOverrides: {
|
|
bestMatchEnabled: true,
|
|
},
|
|
callback: () => {
|
|
Assert.ok(
|
|
BrowserTestUtils.is_visible(container),
|
|
"The checkbox container is visible after installing the experiment"
|
|
);
|
|
},
|
|
});
|
|
|
|
Assert.ok(
|
|
BrowserTestUtils.is_hidden(container),
|
|
"The checkbox container is hidden again after the experiment is uninstalled"
|
|
);
|
|
|
|
gBrowser.removeCurrentTab();
|
|
});
|
|
|
|
// Check the pref and the checkbox for best match.
|
|
add_task(async function bestMatchToggle() {
|
|
// Enable the feature so that the toggle appears.
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["browser.urlbar.bestMatch.enabled", true]],
|
|
});
|
|
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
|
|
const doc = gBrowser.selectedBrowser.contentDocument;
|
|
const checkbox = doc.getElementById(BEST_MATCH_CHECKBOX_ID);
|
|
checkbox.scrollIntoView();
|
|
|
|
info("Check if the checkbox stauts reflects the pref value");
|
|
for (const isEnabled of [true, false]) {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["browser.urlbar.suggest.bestmatch", isEnabled]],
|
|
});
|
|
assertPrefUIState({ [BEST_MATCH_CHECKBOX_ID]: isEnabled }, "checked");
|
|
await SpecialPowers.popPrefEnv();
|
|
}
|
|
|
|
info("Check if the pref value reflects the checkbox status");
|
|
for (let i = 0; i < 2; i++) {
|
|
const initialValue = checkbox.checked;
|
|
await BrowserTestUtils.synthesizeMouseAtCenter(
|
|
"#" + BEST_MATCH_CHECKBOX_ID,
|
|
{},
|
|
gBrowser.selectedBrowser
|
|
);
|
|
Assert.ok(initialValue !== checkbox.checked);
|
|
Assert.equal(
|
|
Services.prefs.getBoolPref("browser.urlbar.suggest.bestmatch"),
|
|
checkbox.checked
|
|
);
|
|
}
|
|
|
|
// Clean up.
|
|
Services.prefs.clearUserPref("browser.urlbar.suggest.bestmatch");
|
|
gBrowser.removeCurrentTab();
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
|
|
// Clicks the learn-more link for best match and checks the help page is opened
|
|
// in a new tab.
|
|
add_task(async function clickBestMatchLearnMore() {
|
|
await SpecialPowers.pushPrefEnv({
|
|
set: [["browser.urlbar.bestMatch.enabled", true]],
|
|
});
|
|
|
|
await openPreferencesViaOpenPreferencesAPI("privacy", { leaveOpen: true });
|
|
|
|
const doc = gBrowser.selectedBrowser.contentDocument;
|
|
const link = doc.getElementById("firefoxSuggestBestMatchLearnMore");
|
|
Assert.ok(BrowserTestUtils.is_visible(link), "Learn-more link is visible");
|
|
|
|
const tabPromise = BrowserTestUtils.waitForNewTab(
|
|
gBrowser,
|
|
QuickSuggest.HELP_URL
|
|
);
|
|
|
|
info("Clicking learn-more link");
|
|
link.scrollIntoView();
|
|
await BrowserTestUtils.synthesizeMouseAtCenter(
|
|
"#firefoxSuggestBestMatchLearnMore",
|
|
{},
|
|
gBrowser.selectedBrowser
|
|
);
|
|
|
|
info("Waiting for help page to load in a new tab");
|
|
const tab = await tabPromise;
|
|
gBrowser.removeTab(tab);
|
|
|
|
// Clean up.
|
|
gBrowser.removeCurrentTab();
|
|
await SpecialPowers.popPrefEnv();
|
|
});
|
|
|
|
/**
|
|
* Verifies the state of pref related toggles and checkboxes.
|
|
*
|
|
* @param {object} stateByElementID
|
|
* Maps toggle/checkbox element IDs to booleans. Each boolean
|
|
* is the expected state of the corresponding ID.
|
|
* @param {object} attr
|
|
* Attribute to check against the expected state. The "pressed"
|
|
* attribute is verified by default, since this is mostly used
|
|
* for toggle buttons.
|
|
*/
|
|
function assertPrefUIState(stateByElementID, attr = "pressed") {
|
|
let doc = gBrowser.selectedBrowser.contentDocument;
|
|
let container = doc.getElementById(CONTAINER_ID);
|
|
Assert.ok(BrowserTestUtils.is_visible(container), "The container is visible");
|
|
for (let [id, state] of Object.entries(stateByElementID)) {
|
|
let element = doc.getElementById(id);
|
|
Assert.equal(element[attr], state, "Expected state for ID: " + id);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Verifies the state of the info box.
|
|
*
|
|
* @param {string} expectedL10nID
|
|
* The l10n ID of the string that should be visible in the info box, null if
|
|
* the info box should be hidden.
|
|
*/
|
|
async function assertInfoBox(expectedL10nID) {
|
|
info("Checking info box with expected l10n ID: " + expectedL10nID);
|
|
let doc = gBrowser.selectedBrowser.contentDocument;
|
|
let infoBox = doc.getElementById(INFO_BOX_ID);
|
|
await TestUtils.waitForCondition(
|
|
() => BrowserTestUtils.is_visible(infoBox) == !!expectedL10nID,
|
|
"Waiting for expected info box visibility: " + !!expectedL10nID
|
|
);
|
|
|
|
let infoIcon = infoBox.querySelector(".info-icon");
|
|
Assert.equal(
|
|
BrowserTestUtils.is_visible(infoIcon),
|
|
!!expectedL10nID,
|
|
"The info icon is visible iff a description should be shown"
|
|
);
|
|
|
|
let learnMore = infoBox.querySelector("." + LEARN_MORE_CLASS);
|
|
Assert.ok(learnMore, "Found the info box learn more link");
|
|
Assert.equal(
|
|
BrowserTestUtils.is_visible(learnMore),
|
|
!!expectedL10nID,
|
|
"The info box learn more link is visible iff a description should be shown"
|
|
);
|
|
|
|
if (expectedL10nID) {
|
|
let infoText = doc.getElementById(INFO_TEXT_ID);
|
|
Assert.equal(
|
|
infoText.dataset.l10nId,
|
|
expectedL10nID,
|
|
"Info text has expected l10n ID"
|
|
);
|
|
}
|
|
}
|