/* 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");
}
});