test_special_search.js (17998B)
1 /* This Source Code Form is subject to the terms of the Mozilla Public 2 * License, v. 2.0. If a copy of the MPL was not distributed with this 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 4 5 /** 6 * Test for bug 395161 that allows special searches that restrict results to 7 * history/bookmark/tagged items and title/url matches. 8 * 9 * Test 485122 by making sure results don't have tags when restricting result 10 * to just history either by default behavior or dynamic query restrict. 11 */ 12 13 testEngine_setup(); 14 15 function setSuggestPrefsToFalse() { 16 Services.prefs.setBoolPref("browser.urlbar.suggest.history", false); 17 Services.prefs.setBoolPref("browser.urlbar.suggest.bookmark", false); 18 } 19 20 const TRANSITION_TYPED = PlacesUtils.history.TRANSITION_TYPED; 21 22 add_task(async function test_special_searches() { 23 // High weight - Typed visit. 24 let uri1 = Services.io.newURI("http://url/"); 25 // Medium weight - Regular visit. 26 let uri2 = Services.io.newURI("http://url/2"); 27 // Medium weight - Regular visit. 28 let uri3 = Services.io.newURI("http://foo.bar/"); 29 // High weight - Typed visit. 30 let uri4 = Services.io.newURI("http://foo.bar/2"); 31 // High weight - Bookmark. 32 let uri5 = Services.io.newURI("http://url/star"); 33 // High weight - Bookmark, regular visit. 34 let uri6 = Services.io.newURI("http://url/star/2"); 35 // High weight - Bookmark, no visit. 36 let uri7 = Services.io.newURI("http://foo.bar/star"); 37 // High weight - Bookmark. 38 let uri8 = Services.io.newURI("http://foo.bar/star/2"); 39 // High weight - Bookmark, no visit. 40 let uri9 = Services.io.newURI("http://url/tag"); 41 // High weight - Bookmark, no visit. 42 let uri10 = Services.io.newURI("http://url/tag/2"); 43 // High weight - Bookmark, typed visit. 44 let uri11 = Services.io.newURI("http://foo.bar/tag"); 45 // High weight - Bookmark, 0 visits. 46 let uri12 = Services.io.newURI("http://foo.bar/tag/2"); 47 48 await PlacesTestUtils.addBookmarkWithDetails({ 49 uri: uri12, 50 title: "foo.bar", 51 tags: ["foo.bar"], 52 }); 53 await PlacesTestUtils.addBookmarkWithDetails({ 54 uri: uri11, 55 title: "title", 56 tags: ["foo.bar"], 57 }); 58 await PlacesTestUtils.addBookmarkWithDetails({ 59 uri: uri10, 60 title: "foo.bar", 61 tags: ["foo.bar"], 62 }); 63 await PlacesTestUtils.addBookmarkWithDetails({ 64 uri: uri9, 65 title: "title", 66 tags: ["foo.bar"], 67 }); 68 await PlacesTestUtils.addBookmarkWithDetails({ uri: uri8, title: "foo.bar" }); 69 await PlacesTestUtils.addBookmarkWithDetails({ uri: uri7, title: "title" }); 70 await PlacesTestUtils.addBookmarkWithDetails({ uri: uri6, title: "foo.bar" }); 71 await PlacesTestUtils.addBookmarkWithDetails({ uri: uri5, title: "title" }); 72 73 await PlacesTestUtils.addVisits([ 74 { uri: uri11, title: "title", transition: TRANSITION_TYPED }, 75 { uri: uri6, title: "foo.bar" }, 76 { uri: uri4, title: "foo.bar", transition: TRANSITION_TYPED }, 77 { uri: uri3, title: "title" }, 78 { uri: uri2, title: "foo.bar" }, 79 { uri: uri1, title: "title", transition: TRANSITION_TYPED }, 80 ]); 81 82 await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies(); 83 84 // Order of frecency when not restricting, descending: 85 // uri1 86 // uri4 87 // uri5 88 // uri6 89 // uri7 90 // uri8 91 // uri9 92 // uri10 93 // uri11 94 // uri12 95 // uri2 96 // uri3 97 // Because there are a lot of ties, the ordering is influenced by order in 98 // which they were inserted. 99 100 // Test restricting searches. 101 102 info("History restrict"); 103 let context = createContext(UrlbarTokenizer.RESTRICT.HISTORY, { 104 isPrivate: false, 105 }); 106 await check_results({ 107 context, 108 matches: [ 109 makeSearchResult(context, { 110 engineName: SUGGESTIONS_ENGINE_NAME, 111 heuristic: true, 112 }), 113 makeVisitResult(context, { uri: uri1.spec, title: "title" }), 114 makeVisitResult(context, { uri: uri4.spec, title: "foo.bar" }), 115 makeVisitResult(context, { uri: uri6.spec, title: "foo.bar" }), 116 makeVisitResult(context, { uri: uri11.spec, title: "title" }), 117 makeVisitResult(context, { uri: uri2.spec, title: "foo.bar" }), 118 makeVisitResult(context, { uri: uri3.spec, title: "title" }), 119 ], 120 }); 121 122 info("Star restrict"); 123 context = createContext(UrlbarTokenizer.RESTRICT.BOOKMARK, { 124 isPrivate: false, 125 }); 126 await check_results({ 127 context, 128 matches: [ 129 makeSearchResult(context, { 130 engineName: SUGGESTIONS_ENGINE_NAME, 131 heuristic: true, 132 }), 133 makeBookmarkResult(context, { uri: uri5.spec, title: "title" }), 134 makeBookmarkResult(context, { uri: uri6.spec, title: "foo.bar" }), 135 makeBookmarkResult(context, { uri: uri7.spec, title: "title" }), 136 makeBookmarkResult(context, { uri: uri8.spec, title: "foo.bar" }), 137 makeBookmarkResult(context, { 138 uri: uri9.spec, 139 title: "title", 140 }), 141 makeBookmarkResult(context, { 142 uri: uri10.spec, 143 title: "foo.bar", 144 }), 145 makeBookmarkResult(context, { 146 uri: uri11.spec, 147 title: "title", 148 }), 149 makeBookmarkResult(context, { 150 uri: uri12.spec, 151 title: "foo.bar", 152 }), 153 ], 154 }); 155 156 info("Tag restrict"); 157 context = createContext(UrlbarTokenizer.RESTRICT.TAG, { isPrivate: false }); 158 await check_results({ 159 context, 160 matches: [ 161 makeSearchResult(context, { 162 engineName: SUGGESTIONS_ENGINE_NAME, 163 heuristic: true, 164 }), 165 makeBookmarkResult(context, { 166 uri: uri9.spec, 167 title: "title", 168 }), 169 makeBookmarkResult(context, { 170 uri: uri10.spec, 171 title: "foo.bar", 172 }), 173 makeBookmarkResult(context, { 174 uri: uri11.spec, 175 title: "title", 176 }), 177 makeBookmarkResult(context, { 178 uri: uri12.spec, 179 title: "foo.bar", 180 }), 181 ], 182 }); 183 184 info("Special as first word"); 185 context = createContext(`${UrlbarTokenizer.RESTRICT.HISTORY} foo bar`, { 186 isPrivate: false, 187 }); 188 await check_results({ 189 context, 190 matches: [ 191 makeSearchResult(context, { 192 query: "foo bar", 193 alias: UrlbarTokenizer.RESTRICT.HISTORY, 194 source: UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, 195 heuristic: true, 196 }), 197 makeVisitResult(context, { uri: uri4.spec, title: "foo.bar" }), 198 makeVisitResult(context, { uri: uri6.spec, title: "foo.bar" }), 199 makeVisitResult(context, { uri: uri11.spec, title: "title" }), 200 makeVisitResult(context, { uri: uri2.spec, title: "foo.bar" }), 201 makeVisitResult(context, { uri: uri3.spec, title: "title" }), 202 ], 203 }); 204 205 info("Special as last word"); 206 context = createContext(`foo bar ${UrlbarTokenizer.RESTRICT.HISTORY}`, { 207 isPrivate: false, 208 }); 209 await check_results({ 210 context, 211 matches: [ 212 makeSearchResult(context, { 213 engineName: SUGGESTIONS_ENGINE_NAME, 214 heuristic: true, 215 }), 216 makeVisitResult(context, { uri: uri4.spec, title: "foo.bar" }), 217 makeVisitResult(context, { uri: uri6.spec, title: "foo.bar" }), 218 makeVisitResult(context, { uri: uri11.spec, title: "title" }), 219 makeVisitResult(context, { uri: uri2.spec, title: "foo.bar" }), 220 makeVisitResult(context, { uri: uri3.spec, title: "title" }), 221 ], 222 }); 223 224 // Test restricting and matching searches with a term. 225 226 info(`foo ${UrlbarTokenizer.RESTRICT.HISTORY} -> history`); 227 context = createContext(`foo ${UrlbarTokenizer.RESTRICT.HISTORY}`, { 228 isPrivate: false, 229 }); 230 await check_results({ 231 context, 232 matches: [ 233 makeSearchResult(context, { 234 engineName: SUGGESTIONS_ENGINE_NAME, 235 heuristic: true, 236 }), 237 makeVisitResult(context, { uri: uri4.spec, title: "foo.bar" }), 238 makeVisitResult(context, { uri: uri6.spec, title: "foo.bar" }), 239 makeVisitResult(context, { uri: uri11.spec, title: "title" }), 240 makeVisitResult(context, { uri: uri2.spec, title: "foo.bar" }), 241 makeVisitResult(context, { uri: uri3.spec, title: "title" }), 242 ], 243 }); 244 245 info(`foo ${UrlbarTokenizer.RESTRICT.BOOKMARK} -> is star`); 246 context = createContext(`foo ${UrlbarTokenizer.RESTRICT.BOOKMARK}`, { 247 isPrivate: false, 248 }); 249 await check_results({ 250 context, 251 matches: [ 252 makeSearchResult(context, { 253 engineName: SUGGESTIONS_ENGINE_NAME, 254 heuristic: true, 255 }), 256 makeBookmarkResult(context, { uri: uri6.spec, title: "foo.bar" }), 257 makeBookmarkResult(context, { uri: uri7.spec, title: "title" }), 258 makeBookmarkResult(context, { uri: uri8.spec, title: "foo.bar" }), 259 makeBookmarkResult(context, { 260 uri: uri9.spec, 261 title: "title", 262 tags: ["foo.bar"], 263 }), 264 makeBookmarkResult(context, { 265 uri: uri10.spec, 266 title: "foo.bar", 267 tags: ["foo.bar"], 268 }), 269 makeBookmarkResult(context, { 270 uri: uri11.spec, 271 title: "title", 272 tags: ["foo.bar"], 273 }), 274 makeBookmarkResult(context, { 275 uri: uri12.spec, 276 title: "foo.bar", 277 tags: ["foo.bar"], 278 }), 279 ], 280 }); 281 282 info(`foo ${UrlbarTokenizer.RESTRICT.TITLE} -> in title`); 283 context = createContext(`foo ${UrlbarTokenizer.RESTRICT.TITLE}`, { 284 isPrivate: false, 285 }); 286 await check_results({ 287 context, 288 matches: [ 289 makeSearchResult(context, { 290 engineName: SUGGESTIONS_ENGINE_NAME, 291 heuristic: true, 292 }), 293 makeVisitResult(context, { uri: uri4.spec, title: "foo.bar" }), 294 makeBookmarkResult(context, { uri: uri6.spec, title: "foo.bar" }), 295 makeBookmarkResult(context, { uri: uri8.spec, title: "foo.bar" }), 296 makeVisitResult(context, { uri: uri9.spec, title: "title" }), 297 makeVisitResult(context, { uri: uri10.spec, title: "foo.bar" }), 298 makeVisitResult(context, { uri: uri11.spec, title: "title" }), 299 makeVisitResult(context, { uri: uri12.spec, title: "foo.bar" }), 300 makeVisitResult(context, { uri: uri2.spec, title: "foo.bar" }), 301 ], 302 }); 303 304 info(`foo ${UrlbarTokenizer.RESTRICT.URL} -> in url`); 305 context = createContext(`foo ${UrlbarTokenizer.RESTRICT.URL}`, { 306 isPrivate: false, 307 }); 308 await check_results({ 309 context, 310 matches: [ 311 makeSearchResult(context, { 312 engineName: SUGGESTIONS_ENGINE_NAME, 313 heuristic: true, 314 }), 315 makeVisitResult(context, { uri: uri4.spec, title: "foo.bar" }), 316 makeBookmarkResult(context, { uri: uri7.spec, title: "title" }), 317 makeBookmarkResult(context, { uri: uri8.spec, title: "foo.bar" }), 318 makeVisitResult(context, { uri: uri11.spec, title: "title" }), 319 makeVisitResult(context, { uri: uri12.spec, title: "foo.bar" }), 320 makeVisitResult(context, { uri: uri3.spec, title: "title" }), 321 ], 322 }); 323 324 info(`foo ${UrlbarTokenizer.RESTRICT.TAG} -> is tag`); 325 context = createContext(`foo ${UrlbarTokenizer.RESTRICT.TAG}`, { 326 isPrivate: false, 327 }); 328 await check_results({ 329 context, 330 matches: [ 331 makeSearchResult(context, { 332 engineName: SUGGESTIONS_ENGINE_NAME, 333 heuristic: true, 334 }), 335 makeBookmarkResult(context, { 336 uri: uri9.spec, 337 title: "title", 338 tags: ["foo.bar"], 339 }), 340 makeBookmarkResult(context, { 341 uri: uri10.spec, 342 title: "foo.bar", 343 tags: ["foo.bar"], 344 }), 345 makeBookmarkResult(context, { 346 uri: uri11.spec, 347 title: "title", 348 tags: ["foo.bar"], 349 }), 350 makeBookmarkResult(context, { 351 uri: uri12.spec, 352 title: "foo.bar", 353 tags: ["foo.bar"], 354 }), 355 ], 356 }); 357 358 // Test conflicting restrictions. 359 360 info( 361 `conflict ${UrlbarTokenizer.RESTRICT.TITLE} ${UrlbarTokenizer.RESTRICT.URL} -> url wins` 362 ); 363 await PlacesTestUtils.addVisits([ 364 { 365 uri: `http://conflict.com/${UrlbarTokenizer.RESTRICT.TITLE}`, 366 title: "test", 367 }, 368 { 369 uri: "http://conflict.com/", 370 title: `test${UrlbarTokenizer.RESTRICT.TITLE}`, 371 }, 372 ]); 373 context = createContext( 374 `conflict ${UrlbarTokenizer.RESTRICT.TITLE} ${UrlbarTokenizer.RESTRICT.URL}`, 375 { isPrivate: false } 376 ); 377 await check_results({ 378 context, 379 matches: [ 380 makeSearchResult(context, { 381 engineName: SUGGESTIONS_ENGINE_NAME, 382 heuristic: true, 383 }), 384 makeVisitResult(context, { 385 uri: `http://conflict.com/${UrlbarTokenizer.RESTRICT.TITLE}`, 386 title: "test", 387 }), 388 ], 389 }); 390 391 info( 392 `conflict ${UrlbarTokenizer.RESTRICT.HISTORY} ${UrlbarTokenizer.RESTRICT.BOOKMARK} -> bookmark wins` 393 ); 394 await PlacesTestUtils.addBookmarkWithDetails({ 395 uri: "http://bookmark.conflict.com/", 396 title: `conflict ${UrlbarTokenizer.RESTRICT.HISTORY}`, 397 }); 398 await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies(); 399 context = createContext( 400 `conflict ${UrlbarTokenizer.RESTRICT.HISTORY} ${UrlbarTokenizer.RESTRICT.BOOKMARK}`, 401 { isPrivate: false } 402 ); 403 await check_results({ 404 context, 405 matches: [ 406 makeSearchResult(context, { 407 engineName: SUGGESTIONS_ENGINE_NAME, 408 heuristic: true, 409 }), 410 makeBookmarkResult(context, { 411 uri: "http://bookmark.conflict.com/", 412 title: `conflict ${UrlbarTokenizer.RESTRICT.HISTORY}`, 413 }), 414 ], 415 }); 416 417 info( 418 `conflict ${UrlbarTokenizer.RESTRICT.BOOKMARK} ${UrlbarTokenizer.RESTRICT.TAG} -> tag wins` 419 ); 420 await PlacesTestUtils.addBookmarkWithDetails({ 421 uri: "http://tag.conflict.com/", 422 title: `conflict ${UrlbarTokenizer.RESTRICT.BOOKMARK}`, 423 tags: ["one"], 424 }); 425 await PlacesTestUtils.addBookmarkWithDetails({ 426 uri: "http://nontag.conflict.com/", 427 title: `conflict ${UrlbarTokenizer.RESTRICT.BOOKMARK}`, 428 }); 429 await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies(); 430 context = createContext( 431 `conflict ${UrlbarTokenizer.RESTRICT.BOOKMARK} ${UrlbarTokenizer.RESTRICT.TAG}`, 432 { isPrivate: false } 433 ); 434 await check_results({ 435 context, 436 matches: [ 437 makeSearchResult(context, { 438 engineName: SUGGESTIONS_ENGINE_NAME, 439 heuristic: true, 440 }), 441 makeBookmarkResult(context, { 442 uri: "http://tag.conflict.com/", 443 title: `conflict ${UrlbarTokenizer.RESTRICT.BOOKMARK}`, 444 }), 445 ], 446 }); 447 448 // Disable autoFill for the next tests, see test_autoFill_default_behavior.js 449 // for specific tests. 450 Services.prefs.setBoolPref("browser.urlbar.autoFill", false); 451 452 // Test default usage by setting certain browser.urlbar.suggest.* prefs 453 info("foo -> default history"); 454 setSuggestPrefsToFalse(); 455 Services.prefs.setBoolPref("browser.urlbar.suggest.history", true); 456 context = createContext("foo", { isPrivate: false }); 457 await check_results({ 458 context, 459 matches: [ 460 makeSearchResult(context, { 461 engineName: SUGGESTIONS_ENGINE_NAME, 462 heuristic: true, 463 }), 464 makeVisitResult(context, { uri: uri4.spec, title: "foo.bar" }), 465 makeVisitResult(context, { uri: uri6.spec, title: "foo.bar" }), 466 makeVisitResult(context, { uri: uri11.spec, title: "title" }), 467 makeVisitResult(context, { uri: uri2.spec, title: "foo.bar" }), 468 makeVisitResult(context, { uri: uri3.spec, title: "title" }), 469 ], 470 }); 471 472 info("foo -> default history, is star"); 473 setSuggestPrefsToFalse(); 474 Services.prefs.setBoolPref("browser.urlbar.suggest.history", true); 475 Services.prefs.setBoolPref("browser.urlbar.suggest.bookmark", true); 476 // The purpose of this test is to verify what is being sent by ProviderPlaces. 477 // It will send 10 results, but the heuristic result pushes the last result 478 // out of the panel. We set maxRichResults to a high value to test the full 479 // output of ProviderPlaces. 480 Services.prefs.setIntPref("browser.urlbar.maxRichResults", 20); 481 context = createContext("foo", { isPrivate: false }); 482 await check_results({ 483 context, 484 matches: [ 485 makeSearchResult(context, { 486 engineName: SUGGESTIONS_ENGINE_NAME, 487 heuristic: true, 488 }), 489 makeVisitResult(context, { uri: uri4.spec, title: "foo.bar" }), 490 makeBookmarkResult(context, { uri: uri6.spec, title: "foo.bar" }), 491 makeBookmarkResult(context, { uri: uri7.spec, title: "title" }), 492 makeBookmarkResult(context, { uri: uri8.spec, title: "foo.bar" }), 493 makeBookmarkResult(context, { 494 uri: uri9.spec, 495 title: "title", 496 tags: ["foo.bar"], 497 }), 498 makeBookmarkResult(context, { 499 uri: uri10.spec, 500 title: "foo.bar", 501 tags: ["foo.bar"], 502 }), 503 makeBookmarkResult(context, { 504 uri: uri11.spec, 505 title: "title", 506 tags: ["foo.bar"], 507 }), 508 makeBookmarkResult(context, { 509 uri: uri12.spec, 510 title: "foo.bar", 511 tags: ["foo.bar"], 512 }), 513 makeVisitResult(context, { uri: uri2.spec, title: "foo.bar" }), 514 makeVisitResult(context, { uri: uri3.spec, title: "title" }), 515 ], 516 }); 517 Services.prefs.clearUserPref("browser.urlbar.maxRichResults"); 518 519 info("foo -> is star"); 520 setSuggestPrefsToFalse(); 521 Services.prefs.setBoolPref("browser.urlbar.suggest.history", false); 522 Services.prefs.setBoolPref("browser.urlbar.suggest.bookmark", true); 523 context = createContext("foo", { isPrivate: false }); 524 await check_results({ 525 context, 526 matches: [ 527 makeSearchResult(context, { 528 engineName: SUGGESTIONS_ENGINE_NAME, 529 heuristic: true, 530 }), 531 makeBookmarkResult(context, { uri: uri6.spec, title: "foo.bar" }), 532 makeBookmarkResult(context, { uri: uri7.spec, title: "title" }), 533 makeBookmarkResult(context, { uri: uri8.spec, title: "foo.bar" }), 534 makeBookmarkResult(context, { 535 uri: uri9.spec, 536 title: "title", 537 tags: ["foo.bar"], 538 }), 539 makeBookmarkResult(context, { 540 uri: uri10.spec, 541 title: "foo.bar", 542 tags: ["foo.bar"], 543 }), 544 makeBookmarkResult(context, { 545 uri: uri11.spec, 546 title: "title", 547 tags: ["foo.bar"], 548 }), 549 makeBookmarkResult(context, { 550 uri: uri12.spec, 551 title: "foo.bar", 552 tags: ["foo.bar"], 553 }), 554 ], 555 }); 556 557 await cleanupPlaces(); 558 });