diff options
Diffstat (limited to 'accessible/tests/mochitest/autocomplete.js')
-rw-r--r-- | accessible/tests/mochitest/autocomplete.js | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/accessible/tests/mochitest/autocomplete.js b/accessible/tests/mochitest/autocomplete.js new file mode 100644 index 0000000000..1fa4a450db --- /dev/null +++ b/accessible/tests/mochitest/autocomplete.js @@ -0,0 +1,199 @@ +const nsISupports = Ci.nsISupports; +const nsIAutoCompleteResult = Ci.nsIAutoCompleteResult; +const nsIAutoCompleteSearch = Ci.nsIAutoCompleteSearch; +const nsIFactory = Ci.nsIFactory; +const nsIUUIDGenerator = Ci.nsIUUIDGenerator; +const nsIComponentRegistrar = Ci.nsIComponentRegistrar; + +var gDefaultAutoCompleteSearch = null; + +/** + * Register 'test-a11y-search' AutoCompleteSearch. + * + * @param aValues [in] set of possible results values + * @param aComments [in] set of possible results descriptions + */ +function initAutoComplete(aValues, aComments) { + var allResults = new ResultsHeap(aValues, aComments); + gDefaultAutoCompleteSearch = new AutoCompleteSearch( + "test-a11y-search", + allResults + ); + registerAutoCompleteSearch( + gDefaultAutoCompleteSearch, + "Accessibility Test AutoCompleteSearch" + ); +} + +/** + * Unregister 'test-a11y-search' AutoCompleteSearch. + */ +function shutdownAutoComplete() { + unregisterAutoCompleteSearch(gDefaultAutoCompleteSearch); + gDefaultAutoCompleteSearch.cid = null; + gDefaultAutoCompleteSearch = null; +} + +/** + * Register the given AutoCompleteSearch. + * + * @param aSearch [in] AutoCompleteSearch object + * @param aDescription [in] description of the search object + */ +function registerAutoCompleteSearch(aSearch, aDescription) { + var name = "@mozilla.org/autocomplete/search;1?name=" + aSearch.name; + + var uuidGenerator = Cc["@mozilla.org/uuid-generator;1"].getService( + nsIUUIDGenerator + ); + var cid = uuidGenerator.generateUUID(); + + var componentManager = Components.manager.QueryInterface( + nsIComponentRegistrar + ); + componentManager.registerFactory(cid, aDescription, name, aSearch); + + // Keep the id on the object so we can unregister later. + aSearch.cid = cid; +} + +/** + * Unregister the given AutoCompleteSearch. + */ +function unregisterAutoCompleteSearch(aSearch) { + var componentManager = Components.manager.QueryInterface( + nsIComponentRegistrar + ); + componentManager.unregisterFactory(aSearch.cid, aSearch); +} + +/** + * A container to keep all possible results of autocomplete search. + */ +function ResultsHeap(aValues, aComments) { + this.values = aValues; + this.comments = aComments; +} + +ResultsHeap.prototype = { + constructor: ResultsHeap, + + /** + * Return AutoCompleteResult for the given search string. + */ + getAutoCompleteResultFor(aSearchString) { + var values = [], + comments = []; + for (var idx = 0; idx < this.values.length; idx++) { + if (this.values[idx].includes(aSearchString)) { + values.push(this.values[idx]); + comments.push(this.comments[idx]); + } + } + return new AutoCompleteResult(values, comments); + }, +}; + +/** + * nsIAutoCompleteSearch implementation. + * + * @param aName [in] the name of autocomplete search + * @param aAllResults [in] ResultsHeap object + */ +function AutoCompleteSearch(aName, aAllResults) { + this.name = aName; + this.allResults = aAllResults; +} + +AutoCompleteSearch.prototype = { + constructor: AutoCompleteSearch, + + // nsIAutoCompleteSearch implementation + startSearch(aSearchString, aSearchParam, aPreviousResult, aListener) { + var result = this.allResults.getAutoCompleteResultFor(aSearchString); + aListener.onSearchResult(this, result); + }, + + stopSearch() {}, + + // nsISupports implementation + QueryInterface: ChromeUtils.generateQI([ + "nsIFactory", + "nsIAutoCompleteSearch", + ]), + + // nsIFactory implementation + createInstance(iid) { + return this.QueryInterface(iid); + }, + + // Search name. Used by AutoCompleteController. + name: null, + + // Results heap. + allResults: null, +}; + +/** + * nsIAutoCompleteResult implementation. + */ +function AutoCompleteResult(aValues, aComments) { + this.values = aValues; + this.comments = aComments; + + if (this.values.length) { + this.searchResult = nsIAutoCompleteResult.RESULT_SUCCESS; + } else { + this.searchResult = nsIAutoCompleteResult.NOMATCH; + } +} + +AutoCompleteResult.prototype = { + constructor: AutoCompleteResult, + + searchString: "", + searchResult: null, + + defaultIndex: 0, + + get matchCount() { + return this.values.length; + }, + + getValueAt(aIndex) { + return this.values[aIndex]; + }, + + getLabelAt(aIndex) { + return this.getValueAt(aIndex); + }, + + getCommentAt(aIndex) { + return this.comments[aIndex]; + }, + + getStyleAt(aIndex) { + return null; + }, + + getImageAt(aIndex) { + return ""; + }, + + getFinalCompleteValueAt(aIndex) { + return this.getValueAt(aIndex); + }, + + isRemovableAt(aRowIndex) { + return true; + }, + + removeValueAt(aRowIndex) {}, + + // nsISupports implementation + QueryInterface: ChromeUtils.generateQI(["nsIAutoCompleteResult"]), + + // Data + values: null, + comments: null, +}; |