summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/unit/test_UrlbarPrefs.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/unit/test_UrlbarPrefs.js')
-rw-r--r--browser/components/urlbar/tests/unit/test_UrlbarPrefs.js449
1 files changed, 449 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/unit/test_UrlbarPrefs.js b/browser/components/urlbar/tests/unit/test_UrlbarPrefs.js
new file mode 100644
index 0000000000..c681aca387
--- /dev/null
+++ b/browser/components/urlbar/tests/unit/test_UrlbarPrefs.js
@@ -0,0 +1,449 @@
+/* Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+add_task(function test() {
+ Assert.throws(
+ () => UrlbarPrefs.get("browser.migration.version"),
+ /Trying to access an unknown pref/,
+ "Should throw when passing an untracked pref"
+ );
+
+ Assert.throws(
+ () => UrlbarPrefs.set("browser.migration.version", 100),
+ /Trying to access an unknown pref/,
+ "Should throw when passing an untracked pref"
+ );
+ Assert.throws(
+ () => UrlbarPrefs.set("maxRichResults", "10"),
+ /Invalid value/,
+ "Should throw when passing an invalid value type"
+ );
+
+ Assert.deepEqual(UrlbarPrefs.get("formatting.enabled"), true);
+ UrlbarPrefs.set("formatting.enabled", false);
+ Assert.deepEqual(UrlbarPrefs.get("formatting.enabled"), false);
+
+ Assert.deepEqual(UrlbarPrefs.get("maxRichResults"), 10);
+ UrlbarPrefs.set("maxRichResults", 6);
+ Assert.deepEqual(UrlbarPrefs.get("maxRichResults"), 6);
+
+ Assert.deepEqual(UrlbarPrefs.get("autoFill.stddevMultiplier"), 0.0);
+ UrlbarPrefs.set("autoFill.stddevMultiplier", 0.01);
+ // Due to rounding errors, floats are slightly imprecise, so we can't
+ // directly compare what we set to what we retrieve.
+ Assert.deepEqual(
+ parseFloat(UrlbarPrefs.get("autoFill.stddevMultiplier").toFixed(2)),
+ 0.01
+ );
+});
+
+// Tests UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: true }).
+add_task(function makeResultGroups_true() {
+ Assert.deepEqual(
+ UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: true }),
+ {
+ children: [
+ // heuristic
+ {
+ maxResultCount: 1,
+ children: [
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_TEST },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_EXTENSION },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_SEARCH_TIP },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_OMNIBOX },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_ENGINE_ALIAS },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_BOOKMARK_KEYWORD },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_AUTOFILL },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_PRELOADED },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_TOKEN_ALIAS_ENGINE },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_HISTORY_URL },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_FALLBACK },
+ ],
+ },
+ // extensions using the omnibox API
+ {
+ group: UrlbarUtils.RESULT_GROUP.OMNIBOX,
+ },
+ // main group
+ {
+ flexChildren: true,
+ children: [
+ // suggestions
+ {
+ flex: 2,
+ children: [
+ {
+ flexChildren: true,
+ children: [
+ {
+ flex: 2,
+ group: UrlbarUtils.RESULT_GROUP.FORM_HISTORY,
+ },
+ {
+ flex: 4,
+ group: UrlbarUtils.RESULT_GROUP.REMOTE_SUGGESTION,
+ },
+ ],
+ },
+ {
+ group: UrlbarUtils.RESULT_GROUP.TAIL_SUGGESTION,
+ },
+ ],
+ },
+ // general
+ {
+ group: UrlbarUtils.RESULT_GROUP.GENERAL_PARENT,
+ flex: 1,
+ children: [
+ {
+ availableSpan: 3,
+ group: UrlbarUtils.RESULT_GROUP.INPUT_HISTORY,
+ },
+ {
+ flexChildren: true,
+ children: [
+ {
+ flex: 1,
+ group: UrlbarUtils.RESULT_GROUP.REMOTE_TAB,
+ },
+ {
+ flex: 2,
+ group: UrlbarUtils.RESULT_GROUP.GENERAL,
+ },
+ {
+ flex: 2,
+ group: UrlbarUtils.RESULT_GROUP.ABOUT_PAGES,
+ },
+ {
+ flex: 1,
+ group: UrlbarUtils.RESULT_GROUP.PRELOADED,
+ },
+ ],
+ },
+ {
+ group: UrlbarUtils.RESULT_GROUP.INPUT_HISTORY,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ }
+ );
+});
+
+// Tests UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: false }).
+add_task(function makeResultGroups_false() {
+ Assert.deepEqual(
+ UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: false }),
+
+ {
+ children: [
+ // heuristic
+ {
+ maxResultCount: 1,
+ children: [
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_TEST },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_EXTENSION },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_SEARCH_TIP },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_OMNIBOX },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_ENGINE_ALIAS },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_BOOKMARK_KEYWORD },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_AUTOFILL },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_PRELOADED },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_TOKEN_ALIAS_ENGINE },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_HISTORY_URL },
+ { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_FALLBACK },
+ ],
+ },
+ // extensions using the omnibox API
+ {
+ group: UrlbarUtils.RESULT_GROUP.OMNIBOX,
+ },
+ // main group
+ {
+ flexChildren: true,
+ children: [
+ // general
+ {
+ group: UrlbarUtils.RESULT_GROUP.GENERAL_PARENT,
+ flex: 2,
+ children: [
+ {
+ availableSpan: 3,
+ group: UrlbarUtils.RESULT_GROUP.INPUT_HISTORY,
+ },
+ {
+ flexChildren: true,
+ children: [
+ {
+ flex: 1,
+ group: UrlbarUtils.RESULT_GROUP.REMOTE_TAB,
+ },
+ {
+ flex: 2,
+ group: UrlbarUtils.RESULT_GROUP.GENERAL,
+ },
+ {
+ flex: 2,
+ group: UrlbarUtils.RESULT_GROUP.ABOUT_PAGES,
+ },
+ {
+ flex: 1,
+ group: UrlbarUtils.RESULT_GROUP.PRELOADED,
+ },
+ ],
+ },
+ {
+ group: UrlbarUtils.RESULT_GROUP.INPUT_HISTORY,
+ },
+ ],
+ },
+ // suggestions
+ {
+ flex: 1,
+ children: [
+ {
+ flexChildren: true,
+ children: [
+ {
+ flex: 2,
+ group: UrlbarUtils.RESULT_GROUP.FORM_HISTORY,
+ },
+ {
+ flex: 4,
+ group: UrlbarUtils.RESULT_GROUP.REMOTE_SUGGESTION,
+ },
+ ],
+ },
+ {
+ group: UrlbarUtils.RESULT_GROUP.TAIL_SUGGESTION,
+ },
+ ],
+ },
+ ],
+ },
+ ],
+ }
+ );
+});
+
+// Tests interaction between showSearchSuggestionsFirst and resultGroups.
+add_task(function showSearchSuggestionsFirst_resultGroups() {
+ // Check initial values.
+ Assert.equal(
+ UrlbarPrefs.get("showSearchSuggestionsFirst"),
+ true,
+ "showSearchSuggestionsFirst is true initially"
+ );
+ Assert.deepEqual(
+ UrlbarPrefs.resultGroups,
+ UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: true }),
+ "resultGroups is the same as the groups for which howSearchSuggestionsFirst is true"
+ );
+
+ // Set showSearchSuggestionsFirst = false.
+ UrlbarPrefs.set("showSearchSuggestionsFirst", false);
+ Assert.deepEqual(
+ UrlbarPrefs.resultGroups,
+ UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: false }),
+ "resultGroups is updated after setting showSearchSuggestionsFirst = false"
+ );
+
+ // Set showSearchSuggestionsFirst = true.
+ UrlbarPrefs.set("showSearchSuggestionsFirst", true);
+ Assert.deepEqual(
+ UrlbarPrefs.resultGroups,
+ UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: true }),
+ "resultGroups is updated after setting showSearchSuggestionsFirst = true"
+ );
+
+ // Set showSearchSuggestionsFirst = false again so we can clear it next.
+ UrlbarPrefs.set("showSearchSuggestionsFirst", false);
+ Assert.deepEqual(
+ UrlbarPrefs.resultGroups,
+ UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: false }),
+ "resultGroups is updated after setting showSearchSuggestionsFirst = false"
+ );
+
+ // Clear showSearchSuggestionsFirst.
+ Services.prefs.clearUserPref("browser.urlbar.showSearchSuggestionsFirst");
+ Assert.deepEqual(
+ UrlbarPrefs.resultGroups,
+ UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: true }),
+ "resultGroups is updated immediately after clearing showSearchSuggestionsFirst"
+ );
+ Assert.equal(
+ UrlbarPrefs.get("showSearchSuggestionsFirst"),
+ true,
+ "showSearchSuggestionsFirst defaults to true after clearing it"
+ );
+ Assert.deepEqual(
+ UrlbarPrefs.resultGroups,
+ UrlbarPrefs.makeResultGroups({ showSearchSuggestionsFirst: true }),
+ "resultGroups remains correct after getting showSearchSuggestionsFirst"
+ );
+});
+
+// Tests UrlbarPrefs.initializeShowSearchSuggestionsFirstPref() and the
+// interaction between matchGroups, showSearchSuggestionsFirst, and
+// resultGroups. It's a little complex, but the flow is:
+//
+// 1. The old matchGroups pref has some value
+// 2. UrlbarPrefs.initializeShowSearchSuggestionsFirstPref() is called to
+// translate matchGroups into the newer showSearchSuggestionsFirst pref
+// 3. The update to showSearchSuggestionsFirst causes the new resultGroups
+// pref to be set
+add_task(function initializeShowSearchSuggestionsFirstPref() {
+ // Each value in `tests`: [matchGroups, expectedShowSearchSuggestionsFirst]
+ let tests = [
+ ["suggestion:4,general:Infinity", true],
+ ["suggestion:4,general:5", true],
+ ["suggestion:1,general:5,suggestion:Infinity", true],
+ ["suggestion:Infinity", true],
+ ["suggestion:4", true],
+
+ ["foo:1,suggestion:4,general:Infinity", true],
+ ["foo:2,suggestion:4,general:5", true],
+ ["foo:3,suggestion:1,general:5,suggestion:Infinity", true],
+ ["foo:4,suggestion:Infinity", true],
+ ["foo:5,suggestion:4", true],
+
+ ["general:5,suggestion:Infinity", false],
+ ["general:5,suggestion:4", false],
+ ["general:1,suggestion:4,general:Infinity", false],
+ ["general:Infinity", false],
+ ["general:5", false],
+
+ ["foo:1,general:5,suggestion:Infinity", false],
+ ["foo:2,general:5,suggestion:4", false],
+ ["foo:3,general:1,suggestion:4,general:Infinity", false],
+ ["foo:4,general:Infinity", false],
+ ["foo:5,general:5", false],
+
+ ["", true],
+ ["bogus groups", true],
+ ];
+
+ for (let [matchGroups, expectedValue] of tests) {
+ info("Running test: " + JSON.stringify({ matchGroups, expectedValue }));
+ Services.prefs.clearUserPref("browser.urlbar.showSearchSuggestionsFirst");
+
+ // Set matchGroups.
+ Services.prefs.setCharPref("browser.urlbar.matchGroups", matchGroups);
+
+ // Call initializeShowSearchSuggestionsFirstPref.
+ UrlbarPrefs.initializeShowSearchSuggestionsFirstPref();
+
+ // Both showSearchSuggestionsFirst and resultGroups should be updated.
+ Assert.equal(
+ Services.prefs.getBoolPref("browser.urlbar.showSearchSuggestionsFirst"),
+ expectedValue,
+ "showSearchSuggestionsFirst has the expected value"
+ );
+ Assert.deepEqual(
+ UrlbarPrefs.resultGroups,
+ UrlbarPrefs.makeResultGroups({
+ showSearchSuggestionsFirst: expectedValue,
+ }),
+ "resultGroups should be updated with the appropriate default"
+ );
+ }
+
+ Services.prefs.clearUserPref("browser.urlbar.matchGroups");
+});
+
+// Tests whether observer.onNimbusChanged works.
+add_task(async function onNimbusChanged() {
+ Services.prefs.setBoolPref(
+ "browser.urlbar.autoFill.adaptiveHistory.enabled",
+ false
+ );
+
+ // Add an observer that throws an Error and an observer that does not define
+ // anything to check whether the other observers can get notifications.
+ UrlbarPrefs.addObserver({
+ onPrefChanged(pref) {
+ throw new Error("From onPrefChanged");
+ },
+ onNimbusChanged(pref) {
+ throw new Error("From onNimbusChanged");
+ },
+ });
+ UrlbarPrefs.addObserver({});
+
+ const observer = {
+ onPrefChanged(pref) {
+ this.prefChangedList.push(pref);
+ },
+ onNimbusChanged(pref) {
+ this.nimbusChangedList.push(pref);
+ },
+ };
+ observer.prefChangedList = [];
+ observer.nimbusChangedList = [];
+ UrlbarPrefs.addObserver(observer);
+
+ const doCleanup = await UrlbarTestUtils.initNimbusFeature({
+ autoFillAdaptiveHistoryEnabled: true,
+ });
+ Assert.equal(observer.prefChangedList.length, 0);
+ Assert.ok(
+ observer.nimbusChangedList.includes("autoFillAdaptiveHistoryEnabled")
+ );
+ doCleanup();
+});
+
+// Tests whether observer.onPrefChanged works.
+add_task(async function onPrefChanged() {
+ const doCleanup = await UrlbarTestUtils.initNimbusFeature({
+ autoFillAdaptiveHistoryEnabled: false,
+ });
+ Services.prefs.setBoolPref(
+ "browser.urlbar.autoFill.adaptiveHistory.enabled",
+ false
+ );
+
+ // Add an observer that throws an Error and an observer that does not define
+ // anything to check whether the other observers can get notifications.
+ UrlbarPrefs.addObserver({
+ onPrefChanged(pref) {
+ throw new Error("From onPrefChanged");
+ },
+ onNimbusChanged(pref) {
+ throw new Error("From onNimbusChanged");
+ },
+ });
+ UrlbarPrefs.addObserver({});
+
+ const deferred = PromiseUtils.defer();
+ const observer = {
+ onPrefChanged(pref) {
+ this.prefChangedList.push(pref);
+ deferred.resolve();
+ },
+ onNimbusChanged(pref) {
+ this.nimbusChangedList.push(pref);
+ deferred.resolve();
+ },
+ };
+ observer.prefChangedList = [];
+ observer.nimbusChangedList = [];
+ UrlbarPrefs.addObserver(observer);
+
+ Services.prefs.setBoolPref(
+ "browser.urlbar.autoFill.adaptiveHistory.enabled",
+ true
+ );
+ await deferred.promise;
+ Assert.equal(observer.prefChangedList.length, 1);
+ Assert.equal(observer.prefChangedList[0], "autoFill.adaptiveHistory.enabled");
+ Assert.equal(observer.nimbusChangedList.length, 0);
+
+ Services.prefs.clearUserPref(
+ "browser.urlbar.autoFill.adaptiveHistory.enabled"
+ );
+ doCleanup();
+});