forked from mirrors/gecko-dev
		
	 01c298aca6
			
		
	
	
		01c298aca6
		
	
	
	
	
		
			
			Also fixes existing code which fails the rule. MozReview-Commit-ID: CkLFgsspGMU --HG-- extra : rebase_source : 86a43837659aa2ad83a87eab53b7aa8d39ccf55b
		
			
				
	
	
		
			254 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			254 lines
		
	
	
	
		
			6 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;
 | |
|   if (this._values.length > 0) {
 | |
|     this.searchResult = Ci.nsIAutoCompleteResult.RESULT_SUCCESS;
 | |
|   } else {
 | |
|     this.searchResult = Ci.nsIAutoCompleteResult.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);
 | |
|   },
 | |
| 
 | |
|   removeValueAt(aRowIndex, aRemoveFromDb) {},
 | |
| 
 | |
|   // 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(outer, 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 = Cc["@mozilla.org/uuid-generator;1"].
 | |
|                       getService(Ci.nsIUUIDGenerator);
 | |
|   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");
 | |
| }
 |