summaryrefslogtreecommitdiffstats
path: root/toolkit/content/tests/chrome/test_autocomplete3.xhtml
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/content/tests/chrome/test_autocomplete3.xhtml')
-rw-r--r--toolkit/content/tests/chrome/test_autocomplete3.xhtml200
1 files changed, 200 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/test_autocomplete3.xhtml b/toolkit/content/tests/chrome/test_autocomplete3.xhtml
new file mode 100644
index 0000000000..a1b9ef84ea
--- /dev/null
+++ b/toolkit/content/tests/chrome/test_autocomplete3.xhtml
@@ -0,0 +1,200 @@
+<?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>