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 autofilling the first result of a new search works
// correctly: autofill happens when it should and doesn't when it shouldn't.
"use strict";
add_setup(async function () {
await PlacesUtils.bookmarks.eraseEverything();
await PlacesUtils.history.clear();
await PlacesTestUtils.addVisits(["http://example.com/"]);
await PlacesFrecencyRecalculator.recalculateAnyOutdatedFrecencies();
// Disable placeholder completion. The point of this test is to make sure the
// first result is autofilled (or not) correctly. Autofilling the placeholder
// before the search starts interferes with that.
gURLBar._enableAutofillPlaceholder = false;
registerCleanupFunction(async () => {
gURLBar._enableAutofillPlaceholder = true;
});
});
// The first result should be autofilled when all conditions are met. This also
// does a sanity check to make sure that placeholder autofill is correctly
// disabled, which is helpful for all tasks here and is why this one is first.
add_task(async function successfulAutofill() {
// Do a simple search that should autofill. This will also set up the
// autofill placeholder string, which next we make sure is *not* autofilled.
await doInitialAutofillSearch();
// As a sanity check, do another search to make sure the placeholder is *not*
// autofilled. Make sure it's not autofilled by checking the input value and
// selection *before* the search completes. If placeholder autofill was not
// correctly disabled, then these assertions will fail.
gURLBar.value = "exa";
UrlbarTestUtils.fireInputEvent(window);
// before the search completes: no autofill
Assert.equal(gURLBar.value, "exa");
Assert.equal(gURLBar.selectionStart, "exa".length);
Assert.equal(gURLBar.selectionEnd, "exa".length);
await UrlbarTestUtils.promiseSearchComplete(window);
// after the search completes: successful autofill
let details = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
Assert.ok(details.autofill);
Assert.equal(gURLBar.value, "example.com/");
Assert.equal(gURLBar.selectionStart, "exa".length);
Assert.equal(gURLBar.selectionEnd, "example.com/".length);
});
// The first result should not be autofilled when it's not an autofill result.
add_task(async function firstResultNotAutofill() {
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
value: "foo",
fireInputEvent: true,
});
let details = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
Assert.ok(!details.autofill);
Assert.equal(gURLBar.value, "foo");
Assert.equal(gURLBar.selectionStart, "foo".length);
Assert.equal(gURLBar.selectionEnd, "foo".length);
});
// The first result should *not* be autofilled when the placeholder is not
// selected, the selection is empty, and the caret is *not* at the end of the
// search string.
add_task(async function caretNotAtEndOfSearchString() {
// To set up the placeholder, do an initial search that triggers autofill.
await doInitialAutofillSearch();
// Now do another search but set the caret to somewhere else besides the end
// of the new search string.
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
value: "exam",
selectionStart: "exa".length,
selectionEnd: "exa".length,
fireInputEvent: false,
});
// The first result should be an autofill result, but it should not have been
// autofilled.
let details = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
Assert.ok(details.autofill);
Assert.equal(gURLBar.value, "exam");
Assert.equal(gURLBar.selectionStart, "exa".length);
Assert.equal(gURLBar.selectionEnd, "exa".length);
await cleanUp();
});
// The first result should *not* be autofilled when the placeholder is not
// selected, the selection is *not* empty, and the caret is at the end of the
// search string.
add_task(async function selectionNotEmpty() {
// To set up the placeholder, do an initial search that triggers autofill.
await doInitialAutofillSearch();
// Now do another search. Set the selection end at the end of the search
// string, but make the selection non-empty.
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
value: "exam",
selectionStart: "exa".length,
selectionEnd: "exam".length,
});
// The first result should be an autofill result, but it should not have been
// autofilled.
let details = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
Assert.ok(details.autofill);
Assert.equal(gURLBar.value, "exam");
Assert.equal(gURLBar.selectionStart, "exa".length);
Assert.equal(gURLBar.selectionEnd, "exam".length);
await cleanUp();
});
// The first result should be autofilled when the placeholder is not selected,
// the selection is empty, and the caret is at the end of the search string.
add_task(async function successfulAutofillAfterSettingPlaceholder() {
// To set up the placeholder, do an initial search that triggers autofill.
await doInitialAutofillSearch();
// Now do another search.
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
value: "exam",
selectionStart: "exam".length,
selectionEnd: "exam".length,
});
// It should be autofilled.
let details = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
Assert.ok(details.autofill);
Assert.equal(gURLBar.value, "example.com/");
Assert.equal(gURLBar.selectionStart, "exam".length);
Assert.equal(gURLBar.selectionEnd, "example.com/".length);
await cleanUp();
});
// The first result should be autofilled when the placeholder *is* selected --
// more precisely, when the portion of the placeholder after the new search
// string is selected.
add_task(async function successfulAutofillPlaceholderSelected() {
// To set up the placeholder, do an initial search that triggers autofill.
await doInitialAutofillSearch();
// Now do another search and select the portion of the placeholder after the
// new search string.
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
value: "exam",
selectionStart: "exam".length,
selectionEnd: "example.com/".length,
});
// It should be autofilled.
let details = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
Assert.ok(details.autofill);
Assert.equal(gURLBar.value, "example.com/");
Assert.equal(gURLBar.selectionStart, "exam".length);
Assert.equal(gURLBar.selectionEnd, "example.com/".length);
await cleanUp();
});
async function doInitialAutofillSearch() {
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
value: "ex",
fireInputEvent: true,
});
let details = await UrlbarTestUtils.getDetailsOfResultAt(window, 0);
Assert.ok(details.autofill);
Assert.equal(gURLBar.value, "example.com/");
Assert.equal(gURLBar.selectionStart, "ex".length);
Assert.equal(gURLBar.selectionEnd, "example.com/".length);
}
async function cleanUp() {
// In some cases above, a test task searches for "exam" at the end, and then
// the next task searches for "ex". Autofill results will not be allowed in
// the next task in that case since the old search string starts with the new
// search string. To prevent one task from interfering with the next, do a
// search that changes the search string. Also close the popup while we're
// here, although that's not really necessary.
await UrlbarTestUtils.promiseAutocompleteResultPopup({
window,
value: "reset last search string",
});
await UrlbarTestUtils.promisePopupClose(window, () => {
EventUtils.synthesizeKey("KEY_Escape");
});
}