summaryrefslogtreecommitdiffstats
path: root/toolkit/components/autocomplete/tests/unit/test_stopSearch.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/autocomplete/tests/unit/test_stopSearch.js')
-rw-r--r--toolkit/components/autocomplete/tests/unit/test_stopSearch.js171
1 files changed, 171 insertions, 0 deletions
diff --git a/toolkit/components/autocomplete/tests/unit/test_stopSearch.js b/toolkit/components/autocomplete/tests/unit/test_stopSearch.js
new file mode 100644
index 0000000000..aecf572df0
--- /dev/null
+++ b/toolkit/components/autocomplete/tests/unit/test_stopSearch.js
@@ -0,0 +1,171 @@
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/publicdomain/zero/1.0/
+ */
+
+/**
+ * Purpose of the test is to check that a stopSearch call comes always before a
+ * startSearch call.
+ */
+
+/**
+ * Dummy nsIAutoCompleteInput source that returns
+ * the given list of AutoCompleteSearch names.
+ *
+ * Implements only the methods needed for this test.
+ */
+function AutoCompleteInput(aSearches) {
+ this.searches = aSearches;
+}
+AutoCompleteInput.prototype = {
+ constructor: AutoCompleteInput,
+ minResultsForPopup: 0,
+ timeout: 10,
+ searchParam: "",
+ textValue: "hello",
+ disableAutoComplete: false,
+ completeDefaultIndex: false,
+ set popupOpen(val) {}, // ignore
+ get popupOpen() {
+ return false;
+ },
+ get searchCount() {
+ return this.searches.length;
+ },
+ getSearchAt(aIndex) {
+ return this.searches[aIndex];
+ },
+ onSearchBegin() {},
+ onSearchComplete() {},
+ onTextReverted() {},
+ onTextEntered() {},
+ popup: {
+ selectBy() {},
+ invalidate() {},
+ set selectedIndex(val) {}, // ignore
+ get selectedIndex() {
+ return -1;
+ },
+ QueryInterface: ChromeUtils.generateQI(["nsIAutoCompletePopup"]),
+ },
+ QueryInterface: ChromeUtils.generateQI(["nsIAutoCompleteInput"]),
+};
+
+/**
+ * nsIAutoCompleteSearch implementation.
+ */
+function AutoCompleteSearch(aName) {
+ this.name = aName;
+}
+AutoCompleteSearch.prototype = {
+ constructor: AutoCompleteSearch,
+ stopSearchInvoked: true,
+ startSearch(aSearchString, aSearchParam, aPreviousResult, aListener) {
+ info("Check stop search has been called");
+ Assert.ok(this.stopSearchInvoked);
+ this.stopSearchInvoked = false;
+ },
+ stopSearch() {
+ this.stopSearchInvoked = true;
+ },
+ QueryInterface: ChromeUtils.generateQI([
+ "nsIFactory",
+ "nsIAutoCompleteSearch",
+ ]),
+ createInstance(iid) {
+ return this.QueryInterface(iid);
+ },
+};
+
+/**
+ * Helper to register an AutoCompleteSearch with the given name.
+ * Allows the AutoCompleteController to find the search.
+ */
+function registerAutoCompleteSearch(aSearch) {
+ let name = "@mozilla.org/autocomplete/search;1?name=" + aSearch.name;
+ let uuidGenerator = Services.uuid;
+ let cid = uuidGenerator.generateUUID();
+ let desc = "Test AutoCompleteSearch";
+ let componentManager = Components.manager.QueryInterface(
+ Ci.nsIComponentRegistrar
+ );
+ componentManager.registerFactory(cid, desc, name, aSearch);
+ // Keep the id on the object so we can unregister later
+ aSearch.cid = cid;
+}
+
+/**
+ * Helper to unregister an AutoCompleteSearch.
+ */
+function unregisterAutoCompleteSearch(aSearch) {
+ let componentManager = Components.manager.QueryInterface(
+ Ci.nsIComponentRegistrar
+ );
+ componentManager.unregisterFactory(aSearch.cid, aSearch);
+}
+
+var gTests = [
+ function (controller) {
+ info("handleText");
+ controller.input.textValue = "hel";
+ controller.handleText();
+ },
+ function (controller) {
+ info("handleStartComposition");
+ controller.handleStartComposition();
+ info("handleEndComposition");
+ controller.handleEndComposition();
+ // an input event always follows compositionend event.
+ controller.handleText();
+ },
+ function (controller) {
+ info("handleEscape");
+ controller.handleEscape();
+ },
+ function (controller) {
+ info("handleEnter");
+ controller.handleEnter(false);
+ },
+ function (controller) {
+ info("handleTab");
+ controller.handleTab();
+ },
+
+ function (controller) {
+ info("handleKeyNavigation");
+ // Hardcode KeyboardEvent.DOM_VK_RIGHT, because we can't easily
+ // include KeyboardEvent here.
+ controller.handleKeyNavigation(0x26 /* KeyboardEvent.DOM_VK_UP */);
+ },
+];
+
+add_task(async function () {
+ // Make an AutoCompleteSearch that always returns nothing
+ let search = new AutoCompleteSearch("test");
+ registerAutoCompleteSearch(search);
+
+ let controller = Cc["@mozilla.org/autocomplete/controller;1"].getService(
+ Ci.nsIAutoCompleteController
+ );
+
+ // Make an AutoCompleteInput that uses our search.
+ let input = new AutoCompleteInput([search.name]);
+ controller.input = input;
+
+ for (let testFn of gTests) {
+ input.onSearchBegin = function () {
+ executeSoon(() => testFn(controller));
+ };
+ let promise = new Promise(resolve => {
+ input.onSearchComplete = function () {
+ resolve();
+ };
+ });
+ controller.startSearch("hello");
+ await promise;
+ }
+
+ unregisterAutoCompleteSearch(search);
+ controller.stopSearch();
+ controller.input = null;
+});