forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			200 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <?xml version="1.0"?>
 | |
| <?xml-stylesheet href="chrome://global/skin" type="text/css"?>
 | |
| <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" type="text/css"?>
 | |
| 
 | |
| <window title="Autocomplete Widget Test 3"
 | |
|         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
 | |
|         xmlns:html="http://www.w3.org/1999/xhtml">
 | |
| 
 | |
|   <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
 | |
|   <script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
 | |
| 
 | |
| <html:input id="autocomplete"
 | |
|             is="autocomplete-input"
 | |
|             autocompletesearch="simple"/>
 | |
| 
 | |
| <script class="testbody" type="application/javascript">
 | |
| <![CDATA[
 | |
| 
 | |
| // Set to indicate whether or not we want autoCompleteSimple to return a result
 | |
| var returnResult = true;
 | |
| 
 | |
| const ACR = Ci.nsIAutoCompleteResult;
 | |
| 
 | |
| // This result can't be constructed in-line, because otherwise we leak memory.
 | |
| function nsAutoCompleteSimpleResult(aString)
 | |
| {
 | |
|   this.searchString = aString;
 | |
|   if (returnResult) {
 | |
|     this.searchResult = ACR.RESULT_SUCCESS;
 | |
|     this.matchCount = 1;
 | |
|     this._param = "Result";
 | |
|   }
 | |
| }
 | |
| 
 | |
| nsAutoCompleteSimpleResult.prototype = {
 | |
|  _param: "",
 | |
|  searchString: null,
 | |
|  searchResult: ACR.RESULT_FAILURE,
 | |
|  defaultIndex: 0,
 | |
|  errorDescription: null,
 | |
|  matchCount: 0,
 | |
|  getValueAt() { return this._param; },
 | |
|  getCommentAt() { return null; },
 | |
|  getStyleAt() { return null; },
 | |
|  getImageAt() { return null; },
 | |
|  getFinalCompleteValueAt() { return this.getValueAt(); },
 | |
|  getLabelAt() { return null; },
 | |
|  removeValueAt() {}
 | |
| };
 | |
| 
 | |
| // A basic autocomplete implementation that either returns one result or none
 | |
| var autoCompleteSimpleID = Components.ID("0a2afbdb-f30e-47d1-9cb1-0cd160240aca");
 | |
| var autoCompleteSimpleName = "@mozilla.org/autocomplete/search;1?name=simple"
 | |
| var autoCompleteSimple = {
 | |
|   QueryInterface: ChromeUtils.generateQI(["nsIFactory", "nsIAutoCompleteSearch"]),
 | |
| 
 | |
|   createInstance(iid) {
 | |
|     return this.QueryInterface(iid);
 | |
|   },
 | |
| 
 | |
|   startSearch(aString, aParam, aResult, aListener) {
 | |
|     var result = new nsAutoCompleteSimpleResult(aString);
 | |
|     aListener.onSearchResult(this, result);
 | |
|   },
 | |
| 
 | |
|   stopSearch() {}
 | |
| };
 | |
| 
 | |
| var componentManager = Components.manager
 | |
|                                  .QueryInterface(Ci.nsIComponentRegistrar);
 | |
| componentManager.registerFactory(autoCompleteSimpleID, "Test Simple Autocomplete",
 | |
|                                  autoCompleteSimpleName, autoCompleteSimple);
 | |
| 
 | |
| let element = document.getElementById("autocomplete");
 | |
| 
 | |
| // Create stub to intercept `onSearchComplete` event.
 | |
| element.onSearchComplete = function(original) {
 | |
|   return function() {
 | |
|     original.apply(this, arguments);
 | |
|     checkResult();
 | |
|   };
 | |
| }(element.onSearchComplete);
 | |
| 
 | |
| // Test Bug 325842 - completeDefaultIndex
 | |
| 
 | |
| SimpleTest.waitForExplicitFinish();
 | |
| setTimeout(startTest, 0);
 | |
| 
 | |
| var currentTest = 0;
 | |
| 
 | |
| // Note the entries for these tests (key) are incremental.
 | |
| const tests = [
 | |
|   { completeDefaultIndex: "false", key: "r", result: "r",
 | |
|     start: 1, end: 1 },
 | |
|   { completeDefaultIndex: "true", key: "e", result: "result",
 | |
|     start: 2, end: 6 },
 | |
|   { completeDefaultIndex: "true", key: "t", result: "ret >> Result",
 | |
|     start: 3, end: 13 }
 | |
| ];
 | |
| 
 | |
| function startTest() {
 | |
|   var autocomplete = $("autocomplete");
 | |
| 
 | |
|   // These should not be set by default.
 | |
|   is(autocomplete.hasAttribute("completedefaultindex"), false,
 | |
|      "completedefaultindex not set by default");
 | |
| 
 | |
|   autocomplete.completeDefaultIndex = "true";
 | |
| 
 | |
|   is(autocomplete.getAttribute("completedefaultindex"), "true",
 | |
|      "completedefaultindex attribute set correctly");
 | |
|   is(autocomplete.completeDefaultIndex, true,
 | |
|      "autoFill getter returned correctly");
 | |
| 
 | |
|   autocomplete.completeDefaultIndex = "false";
 | |
| 
 | |
|   is(autocomplete.getAttribute("completedefaultindex"), "false",
 | |
|      "completedefaultindex attribute set to false correctly");
 | |
|   is(autocomplete.completeDefaultIndex, false,
 | |
|      "completeDefaultIndex getter returned false correctly");
 | |
| 
 | |
|   checkNext();
 | |
| }
 | |
| 
 | |
| function checkNext() {
 | |
|   var autocomplete = $("autocomplete");
 | |
| 
 | |
|   autocomplete.completeDefaultIndex = tests[currentTest].completeDefaultIndex;
 | |
|   autocomplete.focus();
 | |
| 
 | |
|   synthesizeKey(tests[currentTest].key);
 | |
| }
 | |
| 
 | |
| function checkResult() {
 | |
|   var autocomplete = $("autocomplete");
 | |
| 
 | |
|   is(autocomplete.value, tests[currentTest].result,
 | |
|      "Test " + currentTest + ": autocomplete.value should equal '" +
 | |
|      tests[currentTest].result + "'");
 | |
| 
 | |
|   is(autocomplete.selectionStart, tests[currentTest].start,
 | |
|      "Test " + currentTest + ": autocomplete selection should start at " +
 | |
|      tests[currentTest].start);
 | |
| 
 | |
|   is(autocomplete.selectionEnd, tests[currentTest].end,
 | |
|      "Test " + currentTest + ": autocomplete selection should end at " +
 | |
|      tests[currentTest].end);
 | |
| 
 | |
|   ++currentTest;
 | |
| 
 | |
|   if (currentTest < tests.length) {
 | |
|     setTimeout(checkNext, 0);
 | |
|   } else {
 | |
|     // TODO (bug 494809): Autocomplete-in-the-middle should take in count RTL
 | |
|     // and complete on KEY_ArrowRight or KEY_ArrowLeft based on that.  It should also revert
 | |
|     // what user has typed to far if he moves in the opposite direction.
 | |
|     if (!autocomplete.value.includes(">>")) {
 | |
|       // Test result if user accepts autocomplete suggestion.
 | |
|       synthesizeKey("KEY_ArrowRight");
 | |
|       is(
 | |
|         autocomplete.value,
 | |
|         "Result",
 | |
|         "Test complete: autocomplete.value should equal 'Result'"
 | |
|       );
 | |
|       is(
 | |
|         autocomplete.selectionStart,
 | |
|         6,
 | |
|         "Test complete: autocomplete selection should start at 6"
 | |
|       );
 | |
|       is(
 | |
|         autocomplete.selectionEnd,
 | |
|         6,
 | |
|         "Test complete: autocomplete selection should end at 6"
 | |
|       );
 | |
|     }
 | |
| 
 | |
|     setTimeout(function () {
 | |
|       // Unregister the factory so that we don't get in the way of other tests
 | |
|       componentManager.unregisterFactory(
 | |
|         autoCompleteSimpleID,
 | |
|         autoCompleteSimple
 | |
|       );
 | |
|       SimpleTest.finish();
 | |
|     }, 0);
 | |
|   }
 | |
| }
 | |
| 
 | |
| ]]>
 | |
| </script>
 | |
| 
 | |
| <body xmlns="http://www.w3.org/1999/xhtml">
 | |
| <p id="display">
 | |
| </p>
 | |
| <div id="content" style="display: none">
 | |
| </div>
 | |
| <pre id="test">
 | |
| </pre>
 | |
| </body>
 | |
| 
 | |
| </window>
 | 
