/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/publicdomain/zero/1.0/ */ ChromeUtils.defineESModuleGetters(this, { FormHistory: "resource://gre/modules/FormHistory.sys.mjs", }); add_setup(async function () { await SearchTestUtils.installSearchExtension({}, { setAsDefault: true }); let engine = Services.search.getEngineByName("Example"); await Services.search.moveEngine(engine, 0); }); add_task(async function test_remove_history() { const TEST_URL = "http://remove.me/from_urlbar/"; await PlacesTestUtils.addVisits(TEST_URL); registerCleanupFunction(async function () { await PlacesUtils.history.clear(); }); let promiseVisitRemoved = PlacesTestUtils.waitForNotification( "page-removed", events => events[0].url === TEST_URL ); await UrlbarTestUtils.promiseAutocompleteResultPopup({ window, value: "from_urlbar", }); let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 1); Assert.equal(result.url, TEST_URL, "Found the expected result"); let expectedResultCount = UrlbarTestUtils.getResultCount(window) - 1; EventUtils.synthesizeKey("KEY_ArrowDown"); Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), 1); EventUtils.synthesizeKey("KEY_Delete", { shiftKey: true }); const removeEvents = await promiseVisitRemoved; Assert.ok( removeEvents[0].isRemovedFromStore, "isRemovedFromStore should be true" ); await TestUtils.waitForCondition( () => UrlbarTestUtils.getResultCount(window) == expectedResultCount, "Waiting for the result to disappear" ); for (let i = 0; i < expectedResultCount; i++) { let details = await UrlbarTestUtils.getDetailsOfResultAt(window, i); Assert.notEqual( details.url, TEST_URL, "Should not find the test URL in the remaining results" ); } await UrlbarTestUtils.promisePopupClose(window); }); add_task(async function test_remove_form_history() { await SpecialPowers.pushPrefEnv({ set: [ ["browser.urlbar.suggest.searches", true], ["browser.urlbar.maxHistoricalSearchSuggestions", 1], ], }); let formHistoryValue = "foobar"; await UrlbarTestUtils.formHistory.add([formHistoryValue]); let formHistory = ( await UrlbarTestUtils.formHistory.search({ value: formHistoryValue, }) ).map(entry => entry.value); Assert.deepEqual( formHistory, [formHistoryValue], "Should find form history after adding it" ); let promiseRemoved = UrlbarTestUtils.formHistory.promiseChanged("remove"); await UrlbarTestUtils.promiseAutocompleteResultPopup({ window, value: "foo", }); let index = 1; let count = UrlbarTestUtils.getResultCount(window); for (; index < count; index++) { let result = await UrlbarTestUtils.getDetailsOfResultAt(window, index); if ( result.type == UrlbarUtils.RESULT_TYPE.SEARCH && result.source == UrlbarUtils.RESULT_SOURCE.HISTORY ) { break; } } Assert.ok(index < count, "Result found"); EventUtils.synthesizeKey("KEY_Tab", { repeat: index }); Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), index); EventUtils.synthesizeKey("KEY_Delete", { shiftKey: true }); await promiseRemoved; await TestUtils.waitForCondition( () => UrlbarTestUtils.getResultCount(window) == count - 1, "Waiting for the result to disappear" ); for (let i = 0; i < UrlbarTestUtils.getResultCount(window); i++) { let result = await UrlbarTestUtils.getDetailsOfResultAt(window, i); Assert.ok( result.type != UrlbarUtils.RESULT_TYPE.SEARCH || result.source != UrlbarUtils.RESULT_SOURCE.HISTORY, "Should not find the form history result in the remaining results" ); } await UrlbarTestUtils.promisePopupClose(window); formHistory = ( await UrlbarTestUtils.formHistory.search({ value: formHistoryValue, }) ).map(entry => entry.value); Assert.deepEqual( formHistory, [], "Should not find form history after removing it" ); await SpecialPowers.popPrefEnv(); }); // We shouldn't be able to remove a bookmark item. add_task(async function test_remove_bookmark_doesnt() { const TEST_URL = "http://dont.remove.me/from_urlbar/"; await PlacesUtils.bookmarks.insert({ parentGuid: PlacesUtils.bookmarks.unfiledGuid, title: "test", url: TEST_URL, }); registerCleanupFunction(async function () { await PlacesUtils.bookmarks.eraseEverything(); }); await UrlbarTestUtils.promiseAutocompleteResultPopup({ window, value: "from_urlbar", }); let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 1); Assert.equal(result.url, TEST_URL, "Found the expected result"); EventUtils.synthesizeKey("KEY_ArrowDown"); Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), 1); EventUtils.synthesizeKey("KEY_Delete", { shiftKey: true }); // We don't have an easy way of determining if the event was process or not, // so let any event queues clear before testing. await new Promise(resolve => setTimeout(resolve, 0)); await PlacesTestUtils.promiseAsyncUpdates(); Assert.ok( await PlacesUtils.bookmarks.fetch({ url: TEST_URL }), "Should still have the URL bookmarked." ); }); add_task(async function test_searchMode_removeRestyledHistory() { await SpecialPowers.pushPrefEnv({ set: [ ["browser.urlbar.suggest.searches", true], ["browser.urlbar.maxHistoricalSearchSuggestions", 1], ], }); let query = "ciao"; let url = `https://example.com/?q=${query}bar`; await PlacesTestUtils.addVisits(url); await BrowserTestUtils.withNewTab("about:robots", async function (browser) { await UrlbarTestUtils.promiseAutocompleteResultPopup({ window, value: query, }); await UrlbarTestUtils.enterSearchMode(window); let result = await UrlbarTestUtils.getDetailsOfResultAt(window, 1); Assert.equal(result.type, UrlbarUtils.RESULT_TYPE.SEARCH); Assert.equal(result.source, UrlbarUtils.RESULT_SOURCE.HISTORY); EventUtils.synthesizeKey("KEY_ArrowDown"); Assert.equal(UrlbarTestUtils.getSelectedRowIndex(window), 1); EventUtils.synthesizeKey("KEY_Delete", { shiftKey: true }); await TestUtils.waitForCondition( async () => !(await PlacesTestUtils.isPageInDB(url)), "Wait for url to be removed from history" ); Assert.equal( UrlbarTestUtils.getResultCount(window), 1, "Urlbar result should be removed" ); await UrlbarTestUtils.exitSearchMode(window, { clickClose: true }); await UrlbarTestUtils.promisePopupClose(window); }); await PlacesUtils.history.clear(); await SpecialPowers.popPrefEnv(); }); add_task(async function blockButton() { if (UrlbarPrefs.get("resultMenu")) { // This case is covered by browser_result_menu.js. return; } let url = "https://example.com/has-block-button"; let provider = new UrlbarTestUtils.TestProvider({ priority: Infinity, results: [ new UrlbarResult( UrlbarUtils.RESULT_TYPE.URL, UrlbarUtils.RESULT_SOURCE.OTHER_LOCAL, { url, isBlockable: true, blockL10n: { id: "firefox-suggest-urlbar-block" }, } ), ], }); // Implement the provider's `onEngagement()` so it removes the result. let onEngagementCallCount = 0; provider.onEngagement = (isPrivate, state, queryContext, details) => { onEngagementCallCount++; queryContext.view.controller.removeResult(details.result); }; UrlbarProvidersManager.registerProvider(provider); await UrlbarTestUtils.promiseAutocompleteResultPopup({ window, value: "test", }); Assert.equal( UrlbarTestUtils.getResultCount(window), 1, "There should be one result" ); let row = await UrlbarTestUtils.waitForAutocompleteResultAt(window, 0); Assert.equal( row.result.payload.url, url, "The result should be in the first row" ); let button = row.querySelector(".urlbarView-button-block"); Assert.ok(button, "The row should have a block button"); info("Tabbing down to block button"); EventUtils.synthesizeKey("KEY_Tab", { repeat: 2 }); Assert.equal( UrlbarTestUtils.getSelectedElement(window), button, "The block button should be selected after tabbing down" ); info("Pressing Enter on block button"); EventUtils.synthesizeKey("KEY_Enter"); Assert.equal( onEngagementCallCount, 1, "onEngagement() should have been called once" ); Assert.equal( UrlbarTestUtils.getResultCount(window), 0, "There should be no results after blocking" ); await UrlbarTestUtils.promisePopupClose(window); UrlbarProvidersManager.unregisterProvider(provider); });