Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* 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/. */
/*
Autocomplete Frecency Tests
- add a visit for each score permutation
- search
- test number of matches
- test each item's location in results
*/
testEngine_setup();
try {
var histsvc = Cc["@mozilla.org/browser/nav-history-service;1"].getService(
Ci.nsINavHistoryService
);
} catch (ex) {
do_throw("Could not get services\n");
}
var bucketPrefs = [
["firstBucketCutoff", "firstBucketWeight"],
["secondBucketCutoff", "secondBucketWeight"],
["thirdBucketCutoff", "thirdBucketWeight"],
["fourthBucketCutoff", "fourthBucketWeight"],
[null, "defaultBucketWeight"],
];
var bonusPrefs = {
embedVisitBonus: PlacesUtils.history.TRANSITION_EMBED,
framedLinkVisitBonus: PlacesUtils.history.TRANSITION_FRAMED_LINK,
linkVisitBonus: PlacesUtils.history.TRANSITION_LINK,
typedVisitBonus: PlacesUtils.history.TRANSITION_TYPED,
bookmarkVisitBonus: PlacesUtils.history.TRANSITION_BOOKMARK,
downloadVisitBonus: PlacesUtils.history.TRANSITION_DOWNLOAD,
permRedirectVisitBonus: PlacesUtils.history.TRANSITION_REDIRECT_PERMANENT,
tempRedirectVisitBonus: PlacesUtils.history.TRANSITION_REDIRECT_TEMPORARY,
reloadVisitBonus: PlacesUtils.history.TRANSITION_RELOAD,
};
// create test data
var searchTerm = "frecency";
var results = [];
var now = Date.now();
var prefPrefix = "places.frecency.";
async function task_initializeBucket(bucket) {
let [cutoffName, weightName] = bucket;
// get pref values
let weight = Services.prefs.getIntPref(prefPrefix + weightName, 0);
let cutoff = Services.prefs.getIntPref(prefPrefix + cutoffName, 0);
if (cutoff < 1) {
return;
}
// generate a date within the cutoff period
let dateInPeriod = (now - (cutoff - 1) * 86400 * 1000) * 1000;
for (let [bonusName, visitType] of Object.entries(bonusPrefs)) {
let frecency = -1;
let calculatedURI = null;
let matchTitle = "";
let bonusValue = Services.prefs.getIntPref(prefPrefix + bonusName);
// unvisited (only for first cutoff date bucket)
if (
bonusName == "unvisitedBookmarkBonus" ||
bonusName == "unvisitedTypedBonus"
) {
if (cutoffName == "firstBucketCutoff") {
let points = Math.ceil((bonusValue / parseFloat(100.0)) * weight);
let visitCount = 1; // bonusName == "unvisitedBookmarkBonus" ? 1 : 0;
frecency = Math.ceil(visitCount * points);
calculatedURI = Services.io.newURI(
"http://" +
searchTerm +
".com/" +
bonusName +
":" +
bonusValue +
"/cutoff:" +
cutoff +
"/weight:" +
weight +
"/frecency:" +
frecency
);
if (bonusName == "unvisitedBookmarkBonus") {
matchTitle = searchTerm + "UnvisitedBookmark";
await PlacesUtils.bookmarks.insert({
parentGuid: PlacesUtils.bookmarks.unfiledGuid,
url: calculatedURI,
title: matchTitle,
});
} else {
matchTitle = searchTerm + "UnvisitedTyped";
await PlacesTestUtils.addVisits({
uri: calculatedURI,
title: matchTitle,
transition: visitType,
visitDate: now,
});
histsvc.markPageAsTyped(calculatedURI);
}
}
} else {
// visited
// visited bookmarks get the visited bookmark bonus twice
if (visitType == Ci.nsINavHistoryService.TRANSITION_BOOKMARK) {
bonusValue = bonusValue * 2;
}
let points = Math.ceil(
(1 * ((bonusValue / parseFloat(100.0)).toFixed(6) * weight)) / 1
);
if (!points) {
if (
visitType == Ci.nsINavHistoryService.TRANSITION_EMBED ||
visitType == Ci.nsINavHistoryService.TRANSITION_FRAMED_LINK ||
visitType == Ci.nsINavHistoryService.TRANSITION_DOWNLOAD ||
visitType == Ci.nsINavHistoryService.TRANSITION_RELOAD ||
bonusName == "defaultVisitBonus"
) {
frecency = 0;
} else {
frecency = -1;
}
} else {
frecency = points;
}
calculatedURI = Services.io.newURI(
"http://" +
searchTerm +
".com/" +
bonusName +
":" +
bonusValue +
"/cutoff:" +
cutoff +
"/weight:" +
weight +
"/frecency:" +
frecency
);
if (visitType == Ci.nsINavHistoryService.TRANSITION_BOOKMARK) {
matchTitle = searchTerm + "Bookmarked";
await PlacesUtils.bookmarks.insert({
parentGuid: PlacesUtils.bookmarks.unfiledGuid,
url: calculatedURI,
title: matchTitle,
});
} else {
matchTitle = calculatedURI.spec.substr(
calculatedURI.spec.lastIndexOf("/") + 1
);
}
await PlacesTestUtils.addVisits({
uri: calculatedURI,
transition: visitType,
visitDate: dateInPeriod,
});
}
if (calculatedURI && frecency) {
results.push([calculatedURI, frecency, matchTitle]);
await PlacesTestUtils.addVisits({
uri: calculatedURI,
title: matchTitle,
transition: visitType,
visitDate: dateInPeriod,
});
}
}
}
add_task(async function test_frecency() {
// Disable autoFill for this test.
Services.prefs.setBoolPref("browser.urlbar.autoFill", false);
Services.prefs.setBoolPref("browser.urlbar.suggest.searches", 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.bookmarks", true);
registerCleanupFunction(() => {
Services.prefs.clearUserPref("browser.urlbar.suggest.history");
Services.prefs.clearUserPref("browser.urlbar.suggest.bookmarks");
Services.prefs.clearUserPref("browser.urlbar.autoFill");
Services.prefs.clearUserPref("browser.urlbar.suggest.searches");
});
for (let bucket of bucketPrefs) {
await task_initializeBucket(bucket);
}
// Sort results by frecency. Break ties by alphabetical URL.
results.sort((a, b) => {
let frecencyDiff = b[1] - a[1];
if (frecencyDiff == 0) {
return a[0].spec.localeCompare(b[0].spec);
}
return frecencyDiff;
});
// Make sure there's enough results returned
Services.prefs.setIntPref(
"browser.urlbar.maxRichResults",
// +1 for the heuristic search result.
results.length + 1
);
await PlacesTestUtils.promiseAsyncUpdates();
let context = createContext(searchTerm, { isPrivate: false });
let urlbarResults = [];
for (let result of results) {
let url = result[0].spec;
if (url.toLowerCase().includes("bookmark")) {
urlbarResults.push(
makeBookmarkResult(context, {
uri: url,
title: result[2],
})
);
} else {
urlbarResults.push(
makeVisitResult(context, {
uri: url,
title: result[2],
})
);
}
}
await check_results({
context,
matches: [
makeSearchResult(context, {
engineName: SUGGESTIONS_ENGINE_NAME,
heuristic: true,
}),
...urlbarResults,
],
});
});