summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/unit/test_000_frecency.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/unit/test_000_frecency.js')
-rw-r--r--browser/components/urlbar/tests/unit/test_000_frecency.js245
1 files changed, 245 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/unit/test_000_frecency.js b/browser/components/urlbar/tests/unit/test_000_frecency.js
new file mode 100644
index 0000000000..cef110963f
--- /dev/null
+++ b/browser/components/urlbar/tests/unit/test_000_frecency.js
@@ -0,0 +1,245 @@
+/* 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,
+ ],
+ });
+});