forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			255 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			255 lines
		
	
	
	
		
			5.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 | |
| /* vim:set ts=2 sw=2 sts=2 et: */
 | |
| /* This Source Code Form is subject to the terms of the Mozilla Public
 | |
|  * License, v. 2.0. If a copy of the MPL was not distributed with this
 | |
|  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 | |
| 
 | |
| /**
 | |
|  * Unit test for Bug 438861 - Previous search results not returned to multiple
 | |
|  * searches.
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * 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,
 | |
| 
 | |
|   // Array of AutoCompleteSearch names
 | |
|   searches: null,
 | |
| 
 | |
|   minResultsForPopup: 0,
 | |
|   timeout: 10,
 | |
|   searchParam: "",
 | |
|   textValue: "",
 | |
|   disableAutoComplete: false,
 | |
|   completeDefaultIndex: false,
 | |
| 
 | |
|   get searchCount() {
 | |
|     return this.searches.length;
 | |
|   },
 | |
| 
 | |
|   getSearchAt(aIndex) {
 | |
|     return this.searches[aIndex];
 | |
|   },
 | |
| 
 | |
|   onSearchBegin() {},
 | |
|   onSearchComplete() {},
 | |
| 
 | |
|   popupOpen: false,
 | |
| 
 | |
|   popup: {
 | |
|     setSelectedIndex(aIndex) {},
 | |
|     invalidate() {},
 | |
| 
 | |
|     // nsISupports implementation
 | |
|     QueryInterface: ChromeUtils.generateQI(["nsIAutoCompletePopup"]),
 | |
|   },
 | |
| 
 | |
|   // nsISupports implementation
 | |
|   QueryInterface: ChromeUtils.generateQI(["nsIAutoCompleteInput"]),
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * nsIAutoCompleteResult implementation
 | |
|  */
 | |
| function AutoCompleteResult(aValues, aComments, aStyles) {
 | |
|   this._values = aValues;
 | |
|   this._comments = aComments;
 | |
|   this._styles = aStyles;
 | |
|   this.searchResult = this._values.length
 | |
|     ? Ci.nsIAutoCompleteResult.RESULT_SUCCESS
 | |
|     : Ci.nsIAutoCompleteResult.RESULT_NOMATCH;
 | |
| }
 | |
| AutoCompleteResult.prototype = {
 | |
|   constructor: AutoCompleteResult,
 | |
| 
 | |
|   // Arrays
 | |
|   _values: null,
 | |
|   _comments: null,
 | |
|   _styles: null,
 | |
| 
 | |
|   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 this._styles[aIndex];
 | |
|   },
 | |
| 
 | |
|   getImageAt(aIndex) {
 | |
|     return "";
 | |
|   },
 | |
| 
 | |
|   getFinalCompleteValueAt(aIndex) {
 | |
|     return this.getValueAt(aIndex);
 | |
|   },
 | |
| 
 | |
|   isRemovableAt(aRowIndex) {
 | |
|     return true;
 | |
|   },
 | |
| 
 | |
|   removeValueAt(aRowIndex) {},
 | |
| 
 | |
|   // nsISupports implementation
 | |
|   QueryInterface: ChromeUtils.generateQI(["nsIAutoCompleteResult"]),
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * nsIAutoCompleteSearch implementation that always returns
 | |
|  * the same result set.
 | |
|  */
 | |
| function AutoCompleteSearch(aName, aResult) {
 | |
|   this.name = aName;
 | |
|   this._result = aResult;
 | |
| }
 | |
| AutoCompleteSearch.prototype = {
 | |
|   constructor: AutoCompleteSearch,
 | |
| 
 | |
|   // Search name. Used by AutoCompleteController
 | |
|   name: null,
 | |
| 
 | |
|   // AutoCompleteResult
 | |
|   _result: null,
 | |
| 
 | |
|   _previousResult: null,
 | |
| 
 | |
|   /**
 | |
|    * Return the same result set for every search
 | |
|    */
 | |
|   startSearch(aSearchString, aSearchParam, aPreviousResult, aListener) {
 | |
|     this._previousResult = aPreviousResult;
 | |
|     aListener.onSearchResult(this, this._result);
 | |
|   },
 | |
| 
 | |
|   stopSearch() {},
 | |
| 
 | |
|   // nsISupports implementation
 | |
|   QueryInterface: ChromeUtils.generateQI([
 | |
|     "nsIFactory",
 | |
|     "nsIAutoCompleteSearch",
 | |
|   ]),
 | |
| 
 | |
|   // nsIFactory implementation
 | |
|   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) {
 | |
|   var name = "@mozilla.org/autocomplete/search;1?name=" + aSearch.name;
 | |
| 
 | |
|   var uuidGenerator = Services.uuid;
 | |
|   var cid = uuidGenerator.generateUUID();
 | |
| 
 | |
|   var desc = "Test AutoCompleteSearch";
 | |
| 
 | |
|   var 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) {
 | |
|   var componentManager = Components.manager.QueryInterface(
 | |
|     Ci.nsIComponentRegistrar
 | |
|   );
 | |
|   componentManager.unregisterFactory(aSearch.cid, aSearch);
 | |
| }
 | |
| 
 | |
| /**
 | |
|  */
 | |
| function run_test() {
 | |
|   // Make an AutoCompleteSearch that always returns nothing
 | |
|   var search1 = new AutoCompleteSearch(
 | |
|     "test-previous-result1",
 | |
|     new AutoCompleteResult(["hello1"], [""], [""])
 | |
|   );
 | |
| 
 | |
|   var search2 = new AutoCompleteSearch(
 | |
|     "test-previous-result2",
 | |
|     new AutoCompleteResult(["hello2"], [""], [""])
 | |
|   );
 | |
| 
 | |
|   // Register search so AutoCompleteController can find them
 | |
|   registerAutoCompleteSearch(search1);
 | |
|   registerAutoCompleteSearch(search2);
 | |
| 
 | |
|   var controller = Cc["@mozilla.org/autocomplete/controller;1"].getService(
 | |
|     Ci.nsIAutoCompleteController
 | |
|   );
 | |
| 
 | |
|   // Make an AutoCompleteInput that uses our search
 | |
|   // and confirms results on search complete
 | |
|   var input = new AutoCompleteInput([search1.name, search2.name]);
 | |
|   var numSearchesStarted = 0;
 | |
| 
 | |
|   input.onSearchBegin = function () {
 | |
|     numSearchesStarted++;
 | |
|   };
 | |
| 
 | |
|   input.onSearchComplete = function () {
 | |
|     Assert.equal(
 | |
|       controller.searchStatus,
 | |
|       Ci.nsIAutoCompleteController.STATUS_COMPLETE_MATCH
 | |
|     );
 | |
|     Assert.equal(controller.matchCount, 2);
 | |
| 
 | |
|     if (numSearchesStarted == 1) {
 | |
|       Assert.equal(search1._previousResult, null);
 | |
|       Assert.equal(search2._previousResult, null);
 | |
| 
 | |
|       // Now start it again
 | |
|       controller.startSearch("test");
 | |
|       return;
 | |
|     }
 | |
|     Assert.notEqual(search1._previousResult, null);
 | |
|     Assert.notEqual(search2._previousResult, null);
 | |
| 
 | |
|     // Unregister searches
 | |
|     unregisterAutoCompleteSearch(search1);
 | |
|     unregisterAutoCompleteSearch(search2);
 | |
| 
 | |
|     do_test_finished();
 | |
|   };
 | |
| 
 | |
|   controller.input = input;
 | |
| 
 | |
|   // Search is asynchronous, so don't let the test finish immediately
 | |
|   do_test_pending();
 | |
| 
 | |
|   controller.startSearch("test");
 | |
| }
 | 
