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 });