Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test runs only with pattern: os != 'android'
- Manifest: browser/components/urlbar/tests/unit/xpcshell.toml
/* 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
- adds a visit for each transition type (recent and old)
- search
- test number of matches
- test each item's location in results
- verify recent visits rank higher than older visits
*/
testEngine_setup();
// A visit will be added for each transition.
const TRANSITIONS = {
link: PlacesUtils.history.TRANSITION_LINK,
redirectPermanent: PlacesUtils.history.TRANSITION_REDIRECT_PERMANENT,
redirectTemporary: PlacesUtils.history.TRANSITION_REDIRECT_TEMPORARY,
typed: PlacesUtils.history.TRANSITION_TYPED,
bookmark: PlacesUtils.history.TRANSITION_BOOKMARK,
embed: PlacesUtils.history.TRANSITION_EMBED,
download: PlacesUtils.history.TRANSITION_DOWNLOAD,
framedLink: PlacesUtils.history.TRANSITION_FRAMED_LINK,
reload: PlacesUtils.history.TRANSITION_RELOAD,
};
// Despite visits being added for EMBED, DOWNLOAD, FRAMED_LINK, and RELOAD,
// we don't actually expect them to show up in results.
const EXPECTED_TRANSITION_ORDER = [
// High bucket.
PlacesUtils.history.TRANSITION_BOOKMARK,
PlacesUtils.history.TRANSITION_TYPED,
// Medium bucket.
PlacesUtils.history.TRANSITION_REDIRECT_TEMPORARY,
PlacesUtils.history.TRANSITION_REDIRECT_PERMANENT,
PlacesUtils.history.TRANSITION_LINK,
];
async function createTestEntries(searchTerm) {
const testEntries = [];
for (let [transitionName, transitionType] of Object.entries(TRANSITIONS)) {
let uri = Services.io.newURI(
`https://${searchTerm}.com/${transitionName}/`
);
let title = `${searchTerm} ${transitionName} test`;
if (transitionType === PlacesUtils.history.TRANSITION_BOOKMARK) {
await PlacesTestUtils.addBookmarkWithDetails({
uri,
title,
});
}
await PlacesTestUtils.addVisits({
uri,
title,
transition: transitionType,
});
if (transitionType === PlacesUtils.history.TRANSITION_TYPED) {
PlacesUtils.history.markPageAsTyped(uri);
}
testEntries.push({
uri,
title,
transitionType,
transitionName,
age: "recent",
});
}
// 180 days ago in microseconds.
// This number was chosen because we want a safe value that is so old, even
// a higher bucket wouldn't allow it to remain higher than a more recent
// visit that was in a lower non-zero bucket.
const OLD_TIME = (Date.now() - 180 * 24 * 60 * 60 * 1000) * 1000;
for (let [transitionName, transitionType] of Object.entries(TRANSITIONS)) {
let uri = Services.io.newURI(
`https://${searchTerm}.com/old/${transitionName}/`
);
let title = `${searchTerm} ${transitionName} test`;
if (transitionType === PlacesUtils.history.TRANSITION_BOOKMARK) {
await PlacesTestUtils.addBookmarkWithDetails({
uri,
title,
});
}
await PlacesTestUtils.addVisits({
uri,
title,
transition: transitionType,
visitDate: OLD_TIME,
});
if (transitionType === PlacesUtils.history.TRANSITION_TYPED) {
PlacesUtils.history.markPageAsTyped(uri);
}
testEntries.push({
uri,
title,
transitionType,
transitionName,
age: "old",
});
}
return testEntries;
}
add_task(async function test_frecency() {
const searchTerm = "frecency";
const testEntries = await createTestEntries(searchTerm);
// Disable autoFill for this test.
Services.prefs.setBoolPref("browser.urlbar.autoFill", false);
Services.prefs.setBoolPref("browser.urlbar.suggest.searches", false);
Services.prefs.setBoolPref(
"browser.urlbar.scotchBonnet.enableOverride",
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");
Services.prefs.clearUserPref("browser.urlbar.scotchBonnet.enableOverride");
});
// Make sure there's enough results returned
Services.prefs.setIntPref(
"browser.urlbar.maxRichResults",
// +1 for the heuristic search result.
testEntries.length + 1
);
await PlacesTestUtils.promiseAsyncUpdates();
// Perform the search.
let context = createContext(searchTerm, { isPrivate: false });
let expectedResults = [
makeSearchResult(context, {
engineName: SUGGESTIONS_ENGINE_NAME,
heuristic: true,
}),
];
// Add entries in expected recent frecency order.
for (let expectedTransition of EXPECTED_TRANSITION_ORDER) {
let entry = testEntries.find(
e => e.transitionType == expectedTransition && e.age == "recent"
);
if (expectedTransition === PlacesUtils.history.TRANSITION_BOOKMARK) {
expectedResults.push(
makeBookmarkResult(context, { uri: entry.uri.spec, title: entry.title })
);
} else {
expectedResults.push(
makeVisitResult(context, { uri: entry.uri.spec, title: entry.title })
);
}
}
// Add entries in expected recent frecency order.
for (let expectedTransition of EXPECTED_TRANSITION_ORDER) {
let entry = testEntries.find(
e => e.transitionType == expectedTransition && e.age == "old"
);
if (expectedTransition === PlacesUtils.history.TRANSITION_BOOKMARK) {
expectedResults.push(
makeBookmarkResult(context, { uri: entry.uri.spec, title: entry.title })
);
} else {
expectedResults.push(
makeVisitResult(context, { uri: entry.uri.spec, title: entry.title })
);
}
}
await check_results({
context,
matches: expectedResults,
});
});