/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /** * Test for bug 406358 to make sure frecency works for empty input/search, but * this also tests for non-empty inputs as well. Because the interactions among * DIFFERENT* visit counts and visit dates is not well defined, this test * holds one of the two values constant when modifying the other. * * Also test bug 419068 to make sure tagged pages don't necessarily have to be * first in the results. * * Also test bug 426166 to make sure that the results of autocomplete searches * are stable. Note that failures of this test will be intermittent by nature * since we are testing to make sure that the unstable sort algorithm used * by SQLite is not changing the order of the results on us. */ testEngine_setup(); async function task_setCountDate(uri, count, date) { // We need visits so that frecency can be computed over multiple visits let visits = []; for (let i = 0; i < count; i++) { visits.push({ uri, visitDate: date, transition: PlacesUtils.history.TRANSITION_TYPED, }); } await PlacesTestUtils.addVisits(visits); } async function setBookmark(uri) { await PlacesUtils.bookmarks.insert({ parentGuid: PlacesUtils.bookmarks.menuGuid, url: uri, title: "bleh", }); } async function tagURI(uri, tags) { await PlacesUtils.bookmarks.insert({ parentGuid: PlacesUtils.bookmarks.unfiledGuid, url: uri, title: "bleh", }); PlacesUtils.tagging.tagURI(uri, tags); } var uri1 = Services.io.newURI("http://site.tld/1"); var uri2 = Services.io.newURI("http://site.tld/2"); var uri3 = Services.io.newURI("http://aaaaaaaaaa/1"); var uri4 = Services.io.newURI("http://aaaaaaaaaa/2"); // d1 is younger (should show up higher) than d2 (PRTime is in usecs not msec) // Make sure the dates fall into different frecency groups var d1 = new Date(Date.now() - 1000 * 60 * 60) * 1000; var d2 = new Date(Date.now() - 1000 * 60 * 60 * 24 * 10) * 1000; // c1 is larger (should show up higher) than c2 var c1 = 10; var c2 = 1; var tests = [ // test things without a search term async function () { info("Test 0: same count, different date"); await task_setCountDate(uri1, c1, d1); await task_setCountDate(uri2, c1, d2); await tagURI(uri1, ["site"]); let context = createContext(" ", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, query: " ", }), // uri1 is a visit result despite being a tagged bookmark because we // are searching for the empty string. By default, the empty string // filters to history. uri1 will be displayed as a bookmark later in the // test when we are searching with a non-empty string. makeVisitResult(context, { uri: uri1.spec, title: "bleh", }), makeVisitResult(context, { uri: uri2.spec, title: `test visit for ${uri2.spec}`, }), ], }); }, async function () { info("Test 1: same count, different date"); await task_setCountDate(uri1, c1, d2); await task_setCountDate(uri2, c1, d1); await tagURI(uri1, ["site"]); let context = createContext(" ", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, query: " ", }), makeVisitResult(context, { uri: uri2.spec, title: `test visit for ${uri2.spec}`, }), makeVisitResult(context, { uri: uri1.spec, title: "bleh", }), ], }); }, async function () { info("Test 2: different count, same date"); await task_setCountDate(uri1, c1, d1); await task_setCountDate(uri2, c2, d1); await tagURI(uri1, ["site"]); let context = createContext(" ", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, query: " ", }), makeVisitResult(context, { uri: uri1.spec, title: "bleh", }), makeVisitResult(context, { uri: uri2.spec, title: `test visit for ${uri2.spec}`, }), ], }); }, async function () { info("Test 3: different count, same date"); await task_setCountDate(uri1, c2, d1); await task_setCountDate(uri2, c1, d1); await tagURI(uri1, ["site"]); let context = createContext(" ", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, query: " ", }), makeVisitResult(context, { uri: uri2.spec, title: `test visit for ${uri2.spec}`, }), makeVisitResult(context, { uri: uri1.spec, title: "bleh", }), ], }); }, // test things with a search term async function () { info("Test 4: same count, different date"); await task_setCountDate(uri1, c1, d1); await task_setCountDate(uri2, c1, d2); await tagURI(uri1, ["site"]); let context = createContext("site", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), makeBookmarkResult(context, { uri: uri1.spec, title: "bleh", tags: ["site"], }), makeVisitResult(context, { uri: uri2.spec, title: `test visit for ${uri2.spec}`, }), ], }); }, async function () { info("Test 5: same count, different date"); await task_setCountDate(uri1, c1, d2); await task_setCountDate(uri2, c1, d1); await tagURI(uri1, ["site"]); let context = createContext("site", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), makeVisitResult(context, { uri: uri2.spec, title: `test visit for ${uri2.spec}`, }), makeBookmarkResult(context, { uri: uri1.spec, title: "bleh", tags: ["site"], }), ], }); }, async function () { info("Test 6: different count, same date"); await task_setCountDate(uri1, c1, d1); await task_setCountDate(uri2, c2, d1); await tagURI(uri1, ["site"]); let context = createContext("site", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), makeBookmarkResult(context, { uri: uri1.spec, title: "bleh", tags: ["site"], }), makeVisitResult(context, { uri: uri2.spec, title: `test visit for ${uri2.spec}`, }), ], }); }, async function () { info("Test 7: different count, same date"); await task_setCountDate(uri1, c2, d1); await task_setCountDate(uri2, c1, d1); await tagURI(uri1, ["site"]); let context = createContext("site", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), makeVisitResult(context, { uri: uri2.spec, title: `test visit for ${uri2.spec}`, }), makeBookmarkResult(context, { uri: uri1.spec, title: "bleh", tags: ["site"], }), ], }); }, // There are multiple tests for 8, hence the multiple functions // Bug 426166 section async function () { info("Test 8.1a: same count, same date"); await setBookmark(uri3); await setBookmark(uri4); let context = createContext("a", { isPrivate: false }); let bookmarkResults = [ makeBookmarkResult(context, { uri: uri4.spec, title: "bleh", }), makeBookmarkResult(context, { uri: uri3.spec, title: "bleh", }), ]; await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), ...bookmarkResults, ], }); context = createContext("aa", { isPrivate: false }); await check_results({ context, matches: [ // We need to continuously redefine the heuristic search result because it // is the only one that changes with the search string. makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), ...bookmarkResults, ], }); context = createContext("aaa", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), ...bookmarkResults, ], }); context = createContext("aaaa", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), ...bookmarkResults, ], }); context = createContext("aaa", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), ...bookmarkResults, ], }); context = createContext("aa", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), ...bookmarkResults, ], }); context = createContext("a", { isPrivate: false }); await check_results({ context, matches: [ makeSearchResult(context, { engineName: SUGGESTIONS_ENGINE_NAME, heuristic: true, }), ...bookmarkResults, ], }); }, ]; add_task(async function test_frecency() { Services.prefs.setBoolPref("browser.urlbar.autoFill", false); // always search in history + bookmarks, no matter what the default is Services.prefs.setBoolPref("browser.urlbar.suggest.history", true); Services.prefs.setBoolPref("browser.urlbar.suggest.bookmark", true); Services.prefs.setBoolPref("browser.urlbar.suggest.openpage", false); Services.prefs.setBoolPref("browser.urlbar.suggest.searches", false); Services.prefs.setBoolPref("browser.urlbar.suggest.engines", false); Services.prefs.setBoolPref("browser.urlbar.suggest.quickactions", false); for (let test of tests) { await PlacesUtils.bookmarks.eraseEverything(); await PlacesUtils.history.clear(); await test(); } for (let type of [ "history", "bookmark", "openpage", "searches", "engines", "quickactions", ]) { Services.prefs.clearUserPref("browser.urlbar.suggest." + type); Services.prefs.clearUserPref("browser.urlbar.autoFill"); } });