tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

test_UrlbarPrefs.js (13374B)


      1 /* Any copyright is dedicated to the Public Domain.
      2 * http://creativecommons.org/publicdomain/zero/1.0/ */
      3 
      4 "use strict";
      5 
      6 add_task(function test() {
      7  Assert.throws(
      8    () => UrlbarPrefs.get("browser.migration.version"),
      9    /Trying to access an unknown pref/,
     10    "Should throw when passing an untracked pref"
     11  );
     12 
     13  Assert.throws(
     14    () => UrlbarPrefs.set("browser.migration.version", 100),
     15    /Trying to access an unknown pref/,
     16    "Should throw when passing an untracked pref"
     17  );
     18  Assert.throws(
     19    () => UrlbarPrefs.set("maxRichResults", "10"),
     20    /Invalid value/,
     21    "Should throw when passing an invalid value type"
     22  );
     23 
     24  Assert.deepEqual(UrlbarPrefs.get("formatting.enabled"), true);
     25  UrlbarPrefs.set("formatting.enabled", false);
     26  Assert.deepEqual(UrlbarPrefs.get("formatting.enabled"), false);
     27 
     28  Assert.deepEqual(UrlbarPrefs.get("maxRichResults"), 10);
     29  UrlbarPrefs.set("maxRichResults", 6);
     30  Assert.deepEqual(UrlbarPrefs.get("maxRichResults"), 6);
     31 
     32  Assert.deepEqual(UrlbarPrefs.get("autoFill.stddevMultiplier"), 0.0);
     33  UrlbarPrefs.set("autoFill.stddevMultiplier", 0.01);
     34  // Due to rounding errors, floats are slightly imprecise, so we can't
     35  // directly compare what we set to what we retrieve.
     36  Assert.deepEqual(
     37    parseFloat(UrlbarPrefs.get("autoFill.stddevMultiplier").toFixed(2)),
     38    0.01
     39  );
     40 });
     41 
     42 const EXPECTED_SUGGESTIONS_FIRST_GROUPS = {
     43  children: [
     44    // heuristic
     45    {
     46      maxResultCount: 1,
     47      children: [
     48        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_TEST },
     49        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_EXTENSION },
     50        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_SEARCH_TIP },
     51        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_OMNIBOX },
     52        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_ENGINE_ALIAS },
     53        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_BOOKMARK_KEYWORD },
     54        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_AUTOFILL },
     55        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_TOKEN_ALIAS_ENGINE },
     56        {
     57          group: UrlbarUtils.RESULT_GROUP.HEURISTIC_RESTRICT_KEYWORD_AUTOFILL,
     58        },
     59        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_HISTORY_URL },
     60        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_FALLBACK },
     61      ],
     62    },
     63    // extensions using the omnibox API
     64    {
     65      group: UrlbarUtils.RESULT_GROUP.OMNIBOX,
     66    },
     67    // main group
     68    {
     69      flexChildren: true,
     70      children: [
     71        // suggestions
     72        {
     73          flex: 2,
     74          children: [
     75            {
     76              flexChildren: true,
     77              children: [
     78                {
     79                  flex: 2,
     80                  group: UrlbarUtils.RESULT_GROUP.FORM_HISTORY,
     81                },
     82                {
     83                  flex: 99,
     84                  group: UrlbarUtils.RESULT_GROUP.RECENT_SEARCH,
     85                },
     86                {
     87                  flex: 4,
     88                  group: UrlbarUtils.RESULT_GROUP.REMOTE_SUGGESTION,
     89                },
     90              ],
     91            },
     92            {
     93              group: UrlbarUtils.RESULT_GROUP.TAIL_SUGGESTION,
     94            },
     95          ],
     96        },
     97        // general
     98        {
     99          group: UrlbarUtils.RESULT_GROUP.GENERAL_PARENT,
    100          flex: 1,
    101          children: [
    102            {
    103              availableSpan: 3,
    104              group: UrlbarUtils.RESULT_GROUP.INPUT_HISTORY,
    105            },
    106            {
    107              flexChildren: true,
    108              children: [
    109                {
    110                  flex: 1,
    111                  group: UrlbarUtils.RESULT_GROUP.REMOTE_TAB,
    112                },
    113                {
    114                  flex: 2,
    115                  group: UrlbarUtils.RESULT_GROUP.GENERAL,
    116                  orderBy: "frecency",
    117                },
    118                {
    119                  flex: 2,
    120                  group: UrlbarUtils.RESULT_GROUP.ABOUT_PAGES,
    121                },
    122                {
    123                  flex: 99,
    124                  group: UrlbarUtils.RESULT_GROUP.RESTRICT_SEARCH_KEYWORD,
    125                },
    126              ],
    127            },
    128            {
    129              group: UrlbarUtils.RESULT_GROUP.INPUT_HISTORY,
    130            },
    131          ],
    132        },
    133      ],
    134    },
    135  ],
    136 };
    137 
    138 const EXPECTED_NOT_SUGGESTIONS_FIRST_GROUPS = {
    139  children: [
    140    // heuristic
    141    {
    142      maxResultCount: 1,
    143      children: [
    144        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_TEST },
    145        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_EXTENSION },
    146        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_SEARCH_TIP },
    147        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_OMNIBOX },
    148        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_ENGINE_ALIAS },
    149        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_BOOKMARK_KEYWORD },
    150        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_AUTOFILL },
    151        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_TOKEN_ALIAS_ENGINE },
    152        {
    153          group: UrlbarUtils.RESULT_GROUP.HEURISTIC_RESTRICT_KEYWORD_AUTOFILL,
    154        },
    155        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_HISTORY_URL },
    156        { group: UrlbarUtils.RESULT_GROUP.HEURISTIC_FALLBACK },
    157      ],
    158    },
    159    // extensions using the omnibox API
    160    {
    161      group: UrlbarUtils.RESULT_GROUP.OMNIBOX,
    162    },
    163    // main group
    164    {
    165      flexChildren: true,
    166      children: [
    167        // general
    168        {
    169          group: UrlbarUtils.RESULT_GROUP.GENERAL_PARENT,
    170          flex: 2,
    171          children: [
    172            {
    173              availableSpan: 3,
    174              group: UrlbarUtils.RESULT_GROUP.INPUT_HISTORY,
    175            },
    176            {
    177              flexChildren: true,
    178              children: [
    179                {
    180                  flex: 1,
    181                  group: UrlbarUtils.RESULT_GROUP.REMOTE_TAB,
    182                },
    183                {
    184                  flex: 2,
    185                  group: UrlbarUtils.RESULT_GROUP.GENERAL,
    186                  orderBy: "frecency",
    187                },
    188                {
    189                  flex: 2,
    190                  group: UrlbarUtils.RESULT_GROUP.ABOUT_PAGES,
    191                },
    192                {
    193                  flex: 99,
    194                  group: UrlbarUtils.RESULT_GROUP.RESTRICT_SEARCH_KEYWORD,
    195                },
    196              ],
    197            },
    198            {
    199              group: UrlbarUtils.RESULT_GROUP.INPUT_HISTORY,
    200            },
    201          ],
    202        },
    203        // suggestions
    204        {
    205          flex: 1,
    206          children: [
    207            {
    208              flexChildren: true,
    209              children: [
    210                {
    211                  flex: 2,
    212                  group: UrlbarUtils.RESULT_GROUP.FORM_HISTORY,
    213                },
    214                {
    215                  flex: 99,
    216                  group: UrlbarUtils.RESULT_GROUP.RECENT_SEARCH,
    217                },
    218                {
    219                  flex: 4,
    220                  group: UrlbarUtils.RESULT_GROUP.REMOTE_SUGGESTION,
    221                },
    222              ],
    223            },
    224            {
    225              group: UrlbarUtils.RESULT_GROUP.TAIL_SUGGESTION,
    226            },
    227          ],
    228        },
    229      ],
    230    },
    231  ],
    232 };
    233 
    234 // Tests interaction between showSearchSuggestionsFirst and resultGroups.
    235 add_task(function showSearchSuggestionsFirst_resultGroups() {
    236  // Check initial values.
    237  Assert.equal(
    238    UrlbarPrefs.get("showSearchSuggestionsFirst"),
    239    true,
    240    "showSearchSuggestionsFirst is true initially"
    241  );
    242  Assert.deepEqual(
    243    UrlbarPrefs.getResultGroups({
    244      context: { sapName: "urlbar", searchString: "test" },
    245    }),
    246    EXPECTED_SUGGESTIONS_FIRST_GROUPS,
    247    "resultGroups is the same as the groups for which showSearchSuggestionsFirst is true"
    248  );
    249 
    250  UrlbarPrefs.set("showSearchSuggestionsFirst", false);
    251  Assert.deepEqual(
    252    UrlbarPrefs.getResultGroups({
    253      context: { sapName: "urlbar", searchString: "test" },
    254    }),
    255    EXPECTED_NOT_SUGGESTIONS_FIRST_GROUPS,
    256    "resultGroups is updated after setting showSearchSuggestionsFirst = false"
    257  );
    258 
    259  UrlbarPrefs.set("showSearchSuggestionsFirst", true);
    260  Assert.deepEqual(
    261    UrlbarPrefs.getResultGroups({
    262      context: { sapName: "urlbar", searchString: "test" },
    263    }),
    264    EXPECTED_SUGGESTIONS_FIRST_GROUPS,
    265    "resultGroups is updated after setting showSearchSuggestionsFirst = true"
    266  );
    267 
    268  // Set showSearchSuggestionsFirst = false again so we can clear it next.
    269  UrlbarPrefs.set("showSearchSuggestionsFirst", false);
    270  Assert.deepEqual(
    271    UrlbarPrefs.getResultGroups({
    272      context: { sapName: "urlbar", searchString: "test" },
    273    }),
    274    EXPECTED_NOT_SUGGESTIONS_FIRST_GROUPS,
    275    "resultGroups is updated after setting showSearchSuggestionsFirst = false"
    276  );
    277 
    278  // Clear showSearchSuggestionsFirst.
    279  Services.prefs.clearUserPref("browser.urlbar.showSearchSuggestionsFirst");
    280  Assert.deepEqual(
    281    UrlbarPrefs.getResultGroups({
    282      context: { sapName: "urlbar", searchString: "test" },
    283    }),
    284    EXPECTED_SUGGESTIONS_FIRST_GROUPS,
    285    "resultGroups is updated immediately after clearing showSearchSuggestionsFirst"
    286  );
    287  Assert.equal(
    288    UrlbarPrefs.get("showSearchSuggestionsFirst"),
    289    true,
    290    "showSearchSuggestionsFirst defaults to true after clearing it"
    291  );
    292 });
    293 
    294 // Tests whether observer.onNimbusChanged works.
    295 add_task(async function onNimbusChanged() {
    296  Services.prefs.setBoolPref(
    297    "browser.urlbar.autoFill.adaptiveHistory.enabled",
    298    false
    299  );
    300 
    301  // Add an observer that throws an Error and an observer that does not define
    302  // anything to check whether the other observers can get notifications.
    303  UrlbarPrefs.addObserver({
    304    onPrefChanged() {
    305      throw new Error("From onPrefChanged");
    306    },
    307    onNimbusChanged() {
    308      throw new Error("From onNimbusChanged");
    309    },
    310  });
    311  UrlbarPrefs.addObserver({});
    312 
    313  const observer = {
    314    onPrefChanged(pref) {
    315      this.prefChangedList.push(pref);
    316    },
    317    onNimbusChanged(pref) {
    318      this.nimbusChangedList.push(pref);
    319    },
    320  };
    321  observer.prefChangedList = [];
    322  observer.nimbusChangedList = [];
    323  UrlbarPrefs.addObserver(observer);
    324 
    325  const doCleanup = await UrlbarTestUtils.initNimbusFeature({
    326    autoFillAdaptiveHistoryEnabled: true,
    327  });
    328  Assert.equal(observer.prefChangedList.length, 0);
    329  Assert.ok(
    330    observer.nimbusChangedList.includes("autoFillAdaptiveHistoryEnabled")
    331  );
    332  await doCleanup();
    333 });
    334 
    335 // Tests whether observer.onPrefChanged works.
    336 add_task(async function onPrefChanged() {
    337  const doCleanup = await UrlbarTestUtils.initNimbusFeature({
    338    autoFillAdaptiveHistoryEnabled: false,
    339  });
    340  Services.prefs.setBoolPref(
    341    "browser.urlbar.autoFill.adaptiveHistory.enabled",
    342    false
    343  );
    344 
    345  // Add an observer that throws an Error and an observer that does not define
    346  // anything to check whether the other observers can get notifications.
    347  UrlbarPrefs.addObserver({
    348    onPrefChanged() {
    349      throw new Error("From onPrefChanged");
    350    },
    351    onNimbusChanged() {
    352      throw new Error("From onNimbusChanged");
    353    },
    354  });
    355  UrlbarPrefs.addObserver({});
    356 
    357  const deferred = Promise.withResolvers();
    358  const observer = {
    359    onPrefChanged(pref) {
    360      this.prefChangedList.push(pref);
    361      deferred.resolve();
    362    },
    363    onNimbusChanged(pref) {
    364      this.nimbusChangedList.push(pref);
    365      deferred.resolve();
    366    },
    367  };
    368  observer.prefChangedList = [];
    369  observer.nimbusChangedList = [];
    370  UrlbarPrefs.addObserver(observer);
    371 
    372  Services.prefs.setBoolPref(
    373    "browser.urlbar.autoFill.adaptiveHistory.enabled",
    374    true
    375  );
    376  await deferred.promise;
    377  Assert.equal(observer.prefChangedList.length, 1);
    378  Assert.equal(observer.prefChangedList[0], "autoFill.adaptiveHistory.enabled");
    379  Assert.equal(observer.nimbusChangedList.length, 0);
    380 
    381  Services.prefs.clearUserPref(
    382    "browser.urlbar.autoFill.adaptiveHistory.enabled"
    383  );
    384  await doCleanup();
    385 });
    386 
    387 // Tests add function.
    388 add_task(async function add() {
    389  info("Start from empty value");
    390  Services.prefs.setStringPref(
    391    "browser.urlbar.quicksuggest.realtimeOptIn.notNowTypes",
    392    ""
    393  );
    394  let result = UrlbarPrefs.get("quicksuggest.realtimeOptIn.notNowTypes");
    395  Assert.equal(result.size, 0);
    396  UrlbarPrefs.add("quicksuggest.realtimeOptIn.notNowTypes", "a");
    397  UrlbarPrefs.add("quicksuggest.realtimeOptIn.notNowTypes", "b");
    398  UrlbarPrefs.add("quicksuggest.realtimeOptIn.notNowTypes", "a");
    399  result = UrlbarPrefs.get("quicksuggest.realtimeOptIn.notNowTypes");
    400  Assert.equal(result.size, 2);
    401  Assert.ok(result.has("a"));
    402  Assert.ok(result.has("b"));
    403 
    404  info("Start from some values");
    405  Services.prefs.setStringPref(
    406    "browser.urlbar.quicksuggest.realtimeOptIn.notNowTypes",
    407    "a,b,c"
    408  );
    409  result = UrlbarPrefs.get("quicksuggest.realtimeOptIn.notNowTypes");
    410  Assert.equal(result.size, 3);
    411  UrlbarPrefs.add("quicksuggest.realtimeOptIn.notNowTypes", "a");
    412  UrlbarPrefs.add("quicksuggest.realtimeOptIn.notNowTypes", "b");
    413  UrlbarPrefs.add("quicksuggest.realtimeOptIn.notNowTypes", "a");
    414  UrlbarPrefs.add("quicksuggest.realtimeOptIn.notNowTypes", "d");
    415  result = UrlbarPrefs.get("quicksuggest.realtimeOptIn.notNowTypes");
    416  Assert.equal(result.size, 4);
    417  Assert.ok(result.has("a"));
    418  Assert.ok(result.has("b"));
    419  Assert.ok(result.has("c"));
    420  Assert.ok(result.has("d"));
    421 
    422  info("Test for singular value pref");
    423  Assert.throws(
    424    () => UrlbarPrefs.add("merino.providers", "a"),
    425    /The pref merino.providers should handle the values as Set but 'string'/
    426  );
    427  Assert.throws(
    428    () => UrlbarPrefs.add("addons.featureGate", true),
    429    /The pref addons.featureGate should handle the values as Set but 'boolean'/
    430  );
    431 });