summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/unit/test_autofill_adaptiveHistory.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/unit/test_autofill_adaptiveHistory.js')
-rw-r--r--browser/components/urlbar/tests/unit/test_autofill_adaptiveHistory.js1441
1 files changed, 1441 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/unit/test_autofill_adaptiveHistory.js b/browser/components/urlbar/tests/unit/test_autofill_adaptiveHistory.js
new file mode 100644
index 0000000000..94b29b913a
--- /dev/null
+++ b/browser/components/urlbar/tests/unit/test_autofill_adaptiveHistory.js
@@ -0,0 +1,1441 @@
+/* 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/. */
+
+"use strict";
+
+// Test for adaptive history autofill.
+
+testEngine_setup();
+
+registerCleanupFunction(async () => {
+ Services.prefs.clearUserPref("browser.urlbar.suggest.quickactions");
+});
+Services.prefs.setBoolPref("browser.urlbar.suggest.quickactions", false);
+
+const TEST_DATA = [
+ {
+ description: "Basic behavior for adaptive history autofill",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "URL that has www",
+ pref: true,
+ visitHistory: ["http://www.example.com/test"],
+ inputHistory: [{ uri: "http://www.example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://www.example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://www.example.com/test",
+ title: "test visit for http://www.example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "User's input starts with www",
+ pref: true,
+ visitHistory: ["http://www.example.com/test"],
+ inputHistory: [{ uri: "http://www.example.com/test", input: "www.exa" }],
+ userInput: "www.exa",
+ expected: {
+ autofilled: "www.example.com/test",
+ completed: "http://www.example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://www.example.com/test",
+ title: "test visit for http://www.example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "Case differences for user's input are ignored",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "EXA" }],
+ userInput: "eXA",
+ expected: {
+ autofilled: "eXAmple.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Case differences for user's input that starts with www are ignored",
+ pref: true,
+ visitHistory: ["http://www.example.com/test"],
+ inputHistory: [{ uri: "http://www.example.com/test", input: "www.exa" }],
+ userInput: "WWW.exa",
+ expected: {
+ autofilled: "WWW.example.com/test",
+ completed: "http://www.example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://www.example.com/test",
+ title: "test visit for http://www.example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "Mutiple case difference input history",
+ pref: true,
+ visitHistory: ["http://example.com/yes", "http://example.com/no"],
+ inputHistory: [
+ { uri: "http://example.com/yes", input: "exa" },
+ { uri: "http://example.com/yes", input: "EXA" },
+ { uri: "http://example.com/yes", input: "EXa" },
+ { uri: "http://example.com/yes", input: "eXa" },
+ { uri: "http://example.com/yes", input: "eXA" },
+ { uri: "http://example.com/no", input: "exa" },
+ { uri: "http://example.com/no", input: "exa" },
+ { uri: "http://example.com/no", input: "exa" },
+ ],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/yes",
+ completed: "http://example.com/yes",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/yes",
+ title: "test visit for http://example.com/yes",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/no",
+ title: "test visit for http://example.com/no",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Multiple input history count",
+ pref: true,
+ visitHistory: ["http://example.com/few", "http://example.com/many"],
+ inputHistory: [
+ { uri: "http://example.com/many", input: "exa" },
+ { uri: "http://example.com/few", input: "exa" },
+ { uri: "http://example.com/many", input: "examp" },
+ ],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/many",
+ completed: "http://example.com/many",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/many",
+ title: "test visit for http://example.com/many",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/few",
+ title: "test visit for http://example.com/few",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Multiple input history count with same input",
+ pref: true,
+ visitHistory: ["http://example.com/few", "http://example.com/many"],
+ inputHistory: [
+ { uri: "http://example.com/many", input: "exa" },
+ { uri: "http://example.com/few", input: "exa" },
+ { uri: "http://example.com/many", input: "exa" },
+ ],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/many",
+ completed: "http://example.com/many",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/many",
+ title: "test visit for http://example.com/many",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/few",
+ title: "test visit for http://example.com/few",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Multiple input history count with same input but different frecency",
+ pref: true,
+ visitHistory: [
+ "http://example.com/few",
+ "http://example.com/many",
+ "http://example.com/many",
+ ],
+ inputHistory: [
+ { uri: "http://example.com/many", input: "exa" },
+ { uri: "http://example.com/few", input: "exa" },
+ ],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/many",
+ completed: "http://example.com/many",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/many",
+ title: "test visit for http://example.com/many",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/few",
+ title: "test visit for http://example.com/few",
+ }),
+ ],
+ },
+ },
+ {
+ description: "User input is shorter than the input history",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "e",
+ expected: {
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "User input is longer than the input history",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "example",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "User input starts with input history and includes path of the url",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "example.com/te",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "User input starts with input history and but another url",
+ pref: true,
+ visitHistory: ["http://example.com/test", "http://example.org/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "example.o",
+ expected: {
+ autofilled: "example.org/",
+ completed: "http://example.org/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.org/",
+ fallbackTitle: "example.org",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.org/test",
+ title: "test visit for http://example.org/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "User input does not start with input history",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "notmatch" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "User input does not start with input history, but it includes as part of URL",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "test",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "User input does not start with visited URL",
+ pref: true,
+ visitHistory: ["http://mozilla.com/test"],
+ inputHistory: [{ uri: "http://mozilla.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://mozilla.com/test",
+ title: "test visit for http://mozilla.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Visited page is bookmarked",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ bookmarks: [{ uri: "http://example.com/test", title: "test bookmark" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test bookmark",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "Visit history and no bookamrk with HISTORY source",
+ pref: true,
+ source: UrlbarUtils.RESULT_SOURCE.HISTORY,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "Visit history and no bookamrk with BOOKMARK source",
+ pref: true,
+ source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "Bookmarked visit history with HISTORY source",
+ pref: true,
+ source: UrlbarUtils.RESULT_SOURCE.HISTORY,
+ visitHistory: ["http://example.com/test", "http://example.com/bookmarked"],
+ bookmarks: [
+ { uri: "http://example.com/bookmarked", title: "test bookmark" },
+ ],
+ inputHistory: [
+ {
+ uri: "http://example.com/test",
+ input: "exa",
+ },
+ {
+ uri: "http://example.com/bookmarked",
+ input: "exa",
+ },
+ ],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/bookmarked",
+ completed: "http://example.com/bookmarked",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/bookmarked",
+ title: "test bookmark",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Bookmarked visit history with BOOKMARK source",
+ pref: true,
+ source: UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ visitHistory: ["http://example.com/test", "http://example.com/bookmarked"],
+ bookmarks: [
+ { uri: "http://example.com/bookmarked", title: "test bookmark" },
+ ],
+ inputHistory: [
+ {
+ uri: "http://example.com/test",
+ input: "exa",
+ },
+ {
+ uri: "http://example.com/bookmarked",
+ input: "exa",
+ },
+ ],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/bookmarked",
+ completed: "http://example.com/bookmarked",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/bookmarked",
+ title: "test bookmark",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "No visit history with HISTORY source",
+ pref: true,
+ source: UrlbarUtils.RESULT_SOURCE.HISTORY,
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "No visit history with BOOKMARK source",
+ pref: true,
+ source: UrlbarUtils.RESULT_SOURCE.HISTORY,
+ bookmarks: [{ uri: "http://example.com/bookmarked", title: "test" }],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "Match with path expression",
+ pref: true,
+ visitHistory: [
+ "http://example.com/testMany",
+ "http://example.com/testMany",
+ "http://example.com/test",
+ ],
+ inputHistory: [{ uri: "http://example.com/test", input: "example.com/te" }],
+ userInput: "example.com/te",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/testMany",
+ title: "test visit for http://example.com/testMany",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Prefixed URL for input history and the same string for user input",
+ pref: true,
+ visitHistory: [
+ "http://example.com/testMany",
+ "http://example.com/testMany",
+ "http://example.com/test",
+ ],
+ inputHistory: [
+ { uri: "http://example.com/test", input: "http://example.com/test" },
+ ],
+ userInput: "http://example.com/test",
+ expected: {
+ autofilled: "http://example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/testMany",
+ title: "test visit for http://example.com/testMany",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Prefixed URL for input history and URL expression for user input",
+ pref: true,
+ visitHistory: [
+ "http://example.com/testMany",
+ "http://example.com/testMany",
+ "http://example.com/test",
+ ],
+ inputHistory: [
+ { uri: "http://example.com/test", input: "http://example.com/te" },
+ ],
+ userInput: "http://example.com/te",
+ expected: {
+ autofilled: "http://example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/testMany",
+ title: "test visit for http://example.com/testMany",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Prefixed URL for input history and path expression for user input",
+ pref: true,
+ visitHistory: [
+ "http://example.com/testMany",
+ "http://example.com/testMany",
+ "http://example.com/test",
+ ],
+ inputHistory: [
+ { uri: "http://example.com/test", input: "http://example.com/te" },
+ ],
+ userInput: "example.com/te",
+ expected: {
+ autofilled: "example.com/testMany",
+ completed: "http://example.com/testMany",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/testMany",
+ title: "test visit for http://example.com/testMany",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Prefixed URL for input history and 'http' for user input",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "http" }],
+ userInput: "http",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Prefixed URL for input history and 'http:' for user input",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "http:" }],
+ userInput: "http:",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Prefixed URL for input history and 'http:/' for user input",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "http:/" }],
+ userInput: "http:/",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Prefixed URL for input history and 'http://' for user input",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "http://" }],
+ userInput: "http://",
+ expected: {
+ autofilled: "http://example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "Prefixed URL for input history and 'http://e' for user input",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "http://e" }],
+ userInput: "http://e",
+ expected: {
+ autofilled: "http://example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Prefixed URL with www omitted for input history and 'http://e' for user input",
+ pref: true,
+ visitHistory: ["http://www.example.com/test"],
+ inputHistory: [{ uri: "http://www.example.com/test", input: "http://e" }],
+ userInput: "http://e",
+ expected: {
+ autofilled: "http://example.com/test",
+ completed: "http://www.example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://www.example.com/test",
+ title: "test visit for http://www.example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Those that match with fixed URL take precedence over those that match prefixed URL",
+ pref: true,
+ visitHistory: ["http://http.example.com/test", "http://example.com/test"],
+ inputHistory: [
+ { uri: "http://http.example.com/test", input: "http" },
+ { uri: "http://example.com/test", input: "http://example.com/test" },
+ ],
+ userInput: "http",
+ expected: {
+ autofilled: "http.example.com/test",
+ completed: "http://http.example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://http.example.com/test",
+ title: "test visit for http://http.example.com/test",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Input history is totally different string from the URL",
+ pref: true,
+ visitHistory: [
+ "http://example.com/testMany",
+ "http://example.com/testMany",
+ "http://example.com/test",
+ ],
+ inputHistory: [
+ { uri: "http://example.com/test", input: "totally-different-string" },
+ ],
+ userInput: "totally",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Input history is totally different string from the URL and there is a visit history whose URL starts with the input",
+ pref: true,
+ visitHistory: ["http://example.com/test", "http://totally.example.com"],
+ inputHistory: [
+ { uri: "http://example.com/test", input: "totally-different-string" },
+ ],
+ userInput: "totally",
+ expected: {
+ autofilled: "totally.example.com/",
+ completed: "http://totally.example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://totally.example.com/",
+ title: "test visit for http://totally.example.com/",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Use count threshold is as same as use count of input history",
+ pref: true,
+ useCountThreshold: 1 * 0.9 + 1,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [
+ { uri: "http://example.com/test", input: "exa" },
+ { uri: "http://example.com/test", input: "exa" },
+ ],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "Use count threshold is less than use count of input history",
+ pref: true,
+ useCountThreshold: 3,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [
+ { uri: "http://example.com/test", input: "exa" },
+ { uri: "http://example.com/test", input: "exa" },
+ { uri: "http://example.com/test", input: "exa" },
+ { uri: "http://example.com/test", input: "exa" },
+ ],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "Use count threshold is more than use count of input history",
+ pref: true,
+ useCountThreshold: 10,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [
+ { uri: "http://example.com/test", input: "exa" },
+ { uri: "http://example.com/test", input: "exa" },
+ { uri: "http://example.com/test", input: "exa" },
+ { uri: "http://example.com/test", input: "exa" },
+ { uri: "http://example.com/test", input: "exa" },
+ ],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "minCharsThreshold pref equals to the user input length",
+ pref: true,
+ minCharsThreshold: 3,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "minCharsThreshold pref is smaller than the user input length",
+ pref: true,
+ minCharsThreshold: 2,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description: "minCharsThreshold pref is larger than the user input length",
+ pref: true,
+ minCharsThreshold: 4,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Prioritize path component with case-sensitive and that is visited",
+ pref: true,
+ visitHistory: [
+ "http://example.com/TEST",
+ "http://example.com/TEST",
+ "http://example.com/test",
+ ],
+ inputHistory: [
+ { uri: "http://example.com/TEST", input: "example.com/test" },
+ { uri: "http://example.com/test", input: "example.com/test" },
+ ],
+ userInput: "example.com/test",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/TEST",
+ title: "test visit for http://example.com/TEST",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "Prioritize path component with case-sensitive but no visited data",
+ pref: true,
+ visitHistory: ["http://example.com/TEST"],
+ inputHistory: [
+ { uri: "http://example.com/TEST", input: "example.com/test" },
+ ],
+ userInput: "example.com/test",
+ expected: {
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ fallbackTitle: "example.com/test",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/TEST",
+ title: "test visit for http://example.com/TEST",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "With history and bookmarks sources, foreign_count == 0, frecency <= 0: No adaptive history autofill",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ frecency: 0,
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "With history source, visit_count == 0, foreign_count != 0: No adaptive history autofill",
+ pref: true,
+ source: UrlbarUtils.RESULT_SOURCE.HISTORY,
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ bookmarks: [{ uri: "http://example.com/test", title: "test bookmark" }],
+ userInput: "exa",
+ expected: {
+ results: [
+ context =>
+ makeSearchResult(context, {
+ engineName: "Suggestions",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "With history source, visit_count > 0, foreign_count != 0, frecency <= 20: No adaptive history autofill",
+ pref: true,
+ source: UrlbarUtils.RESULT_SOURCE.HISTORY,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ bookmarks: [{ uri: "http://example.com/test", title: "test bookmark" }],
+ frecency: 0,
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ ],
+ },
+ },
+ {
+ description:
+ "With history source, visit_count > 0, foreign_count == 0, frecency <= 20: No adaptive history autofill",
+ pref: true,
+ source: UrlbarUtils.RESULT_SOURCE.HISTORY,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ frecency: 0,
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Empty input string",
+ pref: true,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+ {
+ description: "Turn the pref off",
+ pref: false,
+ visitHistory: ["http://example.com/test"],
+ inputHistory: [{ uri: "http://example.com/test", input: "exa" }],
+ userInput: "exa",
+ expected: {
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ results: [
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ context =>
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ },
+ },
+];
+
+add_task(async function inputTest() {
+ for (const {
+ description,
+ pref,
+ minCharsThreshold,
+ useCountThreshold,
+ source,
+ visitHistory,
+ inputHistory,
+ bookmarks,
+ frecency,
+ userInput,
+ expected,
+ } of TEST_DATA) {
+ info(description);
+
+ UrlbarPrefs.set("autoFill.adaptiveHistory.enabled", pref);
+
+ if (!isNaN(minCharsThreshold)) {
+ UrlbarPrefs.set(
+ "autoFill.adaptiveHistory.minCharsThreshold",
+ minCharsThreshold
+ );
+ }
+
+ if (!isNaN(useCountThreshold)) {
+ UrlbarPrefs.set(
+ "autoFill.adaptiveHistory.useCountThreshold",
+ useCountThreshold
+ );
+ }
+
+ if (visitHistory && visitHistory.length) {
+ await PlacesTestUtils.addVisits(visitHistory);
+ }
+ for (const { uri, input } of inputHistory) {
+ await UrlbarUtils.addToInputHistory(uri, input);
+ }
+ for (const bookmark of bookmarks || []) {
+ await PlacesTestUtils.addBookmarkWithDetails(bookmark);
+ }
+
+ if (typeof frecency == "number") {
+ await PlacesUtils.withConnectionWrapper("test::setFrecency", db =>
+ db.execute(
+ `UPDATE moz_places SET frecency = :frecency WHERE url = :url`,
+ {
+ frecency,
+ url: visitHistory[0],
+ }
+ )
+ );
+ }
+
+ const sources = source
+ ? [source]
+ : [
+ UrlbarUtils.RESULT_SOURCE.HISTORY,
+ UrlbarUtils.RESULT_SOURCE.BOOKMARKS,
+ ];
+
+ const context = createContext(userInput, {
+ sources,
+ isPrivate: false,
+ });
+
+ await check_results({
+ context,
+ autofilled: expected.autofilled,
+ completed: expected.completed,
+ hasAutofillTitle: expected.hasAutofillTitle,
+ matches: expected.results.map(f => f(context)),
+ });
+
+ await cleanupPlaces();
+ UrlbarPrefs.clear("autoFill.adaptiveHistory.enabled");
+ UrlbarPrefs.clear("autoFill.adaptiveHistory.minCharsThreshold");
+ UrlbarPrefs.clear("autoFill.adaptiveHistory.useCountThreshold");
+ }
+});
+
+add_task(async function urlCase() {
+ UrlbarPrefs.set("autoFill.adaptiveHistory.enabled", true);
+
+ const testVisitFixed = "example.com/ABC/DEF";
+ const testVisitURL = `http://${testVisitFixed}`;
+ const testInput = "example";
+ await PlacesTestUtils.addVisits([testVisitURL]);
+ await UrlbarUtils.addToInputHistory(testVisitURL, testInput);
+
+ const userInput = "example.COM/abc/def";
+ for (let i = 1; i <= userInput.length; i++) {
+ const currentUserInput = userInput.substring(0, i);
+ const context = createContext(currentUserInput, { isPrivate: false });
+
+ if (currentUserInput.length < testInput.length) {
+ // Autofill with host.
+ await check_results({
+ context,
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ matches: [
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ makeVisitResult(context, {
+ uri: "http://example.com/ABC/DEF",
+ title: "test visit for http://example.com/ABC/DEF",
+ }),
+ ],
+ });
+ } else if (currentUserInput.length !== testVisitFixed.length) {
+ // Autofill using input history.
+ const autofilled = currentUserInput + testVisitFixed.substring(i);
+ await check_results({
+ context,
+ autofilled,
+ completed: "http://example.com/ABC/DEF",
+ matches: [
+ makeVisitResult(context, {
+ uri: "http://example.com/ABC/DEF",
+ title: "test visit for http://example.com/ABC/DEF",
+ heuristic: true,
+ }),
+ ],
+ });
+ } else {
+ // Autofill using user's input.
+ await check_results({
+ context,
+ autofilled: "example.COM/abc/def",
+ completed: "http://example.com/abc/def",
+ matches: [
+ makeVisitResult(context, {
+ uri: "http://example.com/abc/def",
+ fallbackTitle: "example.com/abc/def",
+ heuristic: true,
+ }),
+ makeVisitResult(context, {
+ uri: "http://example.com/ABC/DEF",
+ title: "test visit for http://example.com/ABC/DEF",
+ }),
+ ],
+ });
+ }
+ }
+
+ await cleanupPlaces();
+ UrlbarPrefs.clear("autoFill.adaptiveHistory.enabled");
+});
+
+add_task(async function decayTest() {
+ UrlbarPrefs.set("autoFill.adaptiveHistory.enabled", true);
+
+ await PlacesTestUtils.addVisits(["http://example.com/test"]);
+ await UrlbarUtils.addToInputHistory("http://example.com/test", "exa");
+
+ const initContext = createContext("exa", { isPrivate: false });
+ await check_results({
+ context: initContext,
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ matches: [
+ makeVisitResult(initContext, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ });
+
+ // The decay rate for a day is 0.975, as defined in PlacesFrecencyRecalculator
+ // Therefore, after 30 days, as use_count will be 0.975^30 = 0.468, we set the
+ // useCountThreshold 0.47 to not take the input history passed 30 days.
+ UrlbarPrefs.set("autoFill.adaptiveHistory.useCountThreshold", 0.47);
+
+ // Make 29 days later.
+ for (let i = 0; i < 29; i++) {
+ await Cc["@mozilla.org/places/frecency-recalculator;1"]
+ .getService(Ci.nsIObserver)
+ .wrappedJSObject.decay();
+ }
+ const midContext = createContext("exa", { isPrivate: false });
+ await check_results({
+ context: midContext,
+ autofilled: "example.com/test",
+ completed: "http://example.com/test",
+ matches: [
+ makeVisitResult(midContext, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ heuristic: true,
+ }),
+ ],
+ });
+
+ // Total 30 days later.
+ await Cc["@mozilla.org/places/frecency-recalculator;1"]
+ .getService(Ci.nsIObserver)
+ .wrappedJSObject.decay();
+ const context = createContext("exa", { isPrivate: false });
+ await check_results({
+ context,
+ autofilled: "example.com/",
+ completed: "http://example.com/",
+ matches: [
+ makeVisitResult(context, {
+ uri: "http://example.com/",
+ fallbackTitle: "example.com",
+ heuristic: true,
+ }),
+ makeVisitResult(context, {
+ uri: "http://example.com/test",
+ title: "test visit for http://example.com/test",
+ }),
+ ],
+ });
+
+ await cleanupPlaces();
+ UrlbarPrefs.clear("autoFill.adaptiveHistory.enabled");
+ UrlbarPrefs.clear("autoFill.adaptiveHistory.useCountThreshold");
+});