Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
// This test makes sure that autofill works as expected when typing, character
// by character.
"use strict";
add_setup(async function () {
await cleanUp();
});
add_task(async function origin() {
await PlacesTestUtils.addVisits(["http://example.com/"]);
await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();
// all lowercase
await typeAndCheck([
["e", "example.com/"],
["x", "example.com/"],
["a", "example.com/"],
["m", "example.com/"],
["p", "example.com/"],
["l", "example.com/"],
["e", "example.com/"],
[".", "example.com/"],
["c", "example.com/"],
["o", "example.com/"],
["m", "example.com/"],
["/", "example.com/"],
]);
gURLBar.value = "";
// mixed case
await typeAndCheck([
["E", "Example.com/"],
["x", "Example.com/"],
["A", "ExAmple.com/"],
["m", "ExAmple.com/"],
["P", "ExAmPle.com/"],
["L", "ExAmPLe.com/"],
["e", "ExAmPLe.com/"],
[".", "ExAmPLe.com/"],
["C", "ExAmPLe.Com/"],
["o", "ExAmPLe.Com/"],
["M", "ExAmPLe.CoM/"],
["/", "ExAmPLe.CoM/"],
]);
await cleanUp();
});
add_task(async function url() {
await PlacesTestUtils.addVisits(["http://example.com/foo/bar"]);
await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();
// all lowercase
await typeAndCheck([
["e", "example.com/"],
["x", "example.com/"],
["a", "example.com/"],
["m", "example.com/"],
["p", "example.com/"],
["l", "example.com/"],
["e", "example.com/"],
[".", "example.com/"],
["c", "example.com/"],
["o", "example.com/"],
["m", "example.com/"],
["/", "example.com/"],
["f", "example.com/foo/"],
["o", "example.com/foo/"],
["o", "example.com/foo/"],
["/", "example.com/foo/"],
["b", "example.com/foo/bar"],
["a", "example.com/foo/bar"],
["r", "example.com/foo/bar"],
]);
gURLBar.value = "";
// mixed case
await typeAndCheck([
["E", "Example.com/"],
["x", "Example.com/"],
["A", "ExAmple.com/"],
["m", "ExAmple.com/"],
["P", "ExAmPle.com/"],
["L", "ExAmPLe.com/"],
["e", "ExAmPLe.com/"],
[".", "ExAmPLe.com/"],
["C", "ExAmPLe.Com/"],
["o", "ExAmPLe.Com/"],
["M", "ExAmPLe.CoM/"],
["/", "ExAmPLe.CoM/"],
["f", "ExAmPLe.CoM/foo/"],
["o", "ExAmPLe.CoM/foo/"],
["o", "ExAmPLe.CoM/foo/"],
["/", "ExAmPLe.CoM/foo/"],
["b", "ExAmPLe.CoM/foo/bar"],
["a", "ExAmPLe.CoM/foo/bar"],
["r", "ExAmPLe.CoM/foo/bar"],
]);
await cleanUp();
});
add_task(async function tokenAlias() {
// We have built-in engine aliases that may conflict with the one we choose
// here in terms of autofill, so be careful and choose a weird alias.
await SearchTestUtils.installSearchExtension({ keyword: "@__example" });
// all lowercase
await typeAndCheck([
["@", "@"],
["_", "@__example "],
["_", "@__example "],
["e", "@__example "],
["x", "@__example "],
["a", "@__example "],
["m", "@__example "],
["p", "@__example "],
["l", "@__example "],
["e", "@__example "],
]);
gURLBar.value = "";
// mixed case
await typeAndCheck([
["@", "@"],
["_", "@__example "],
["_", "@__example "],
["E", "@__Example "],
["x", "@__Example "],
["A", "@__ExAmple "],
["m", "@__ExAmple "],
["P", "@__ExAmPle "],
["L", "@__ExAmPLe "],
["e", "@__ExAmPLe "],
]);
await cleanUp();
});
async function typeAndCheck(values) {
gURLBar.focus();
for (let i = 0; i < values.length; i++) {
let [char, expectedInputValue] = values[i];
info(
`Typing: i=${i} char=${char} ` +
`substring="${expectedInputValue.substring(0, i + 1)}"`
);
EventUtils.synthesizeKey(char);
if (i == 0 && char == "@") {
// A single "@" doesn't trigger autofill, so skip the checks below. (It
// shows all the @ aliases.)
continue;
}
await UrlbarTestUtils.promiseSearchComplete(window);
let restIsSpaces = !expectedInputValue.substring(i + 1).trim();
Assert.equal(gURLBar.value, expectedInputValue);
Assert.equal(gURLBar.selectionStart, i + 1);
Assert.equal(gURLBar.selectionEnd, expectedInputValue.length);
if (restIsSpaces) {
// Autofilled @ aliases have a trailing space. We should check that the
// space is autofilled when each preceding character is typed, but once
// the final non-space char is typed, autofill actually stops and the
// trailing space is not autofilled. (Which is maybe not the way it
// should work...) Skip the check below.
continue;
}
let details = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
Assert.ok(details.autofill);
}
}
async function cleanUp() {
gURLBar.value = "";
await UrlbarTestUtils.promisePopupClose(window, () => {
EventUtils.synthesizeKey("KEY_Escape");
});
await PlacesUtils.bookmarks.eraseEverything();
await PlacesUtils.history.clear();
}