summaryrefslogtreecommitdiffstats
path: root/toolkit/content/tests/chrome/test_autocomplete4.xul
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/content/tests/chrome/test_autocomplete4.xul')
-rw-r--r--toolkit/content/tests/chrome/test_autocomplete4.xul280
1 files changed, 280 insertions, 0 deletions
diff --git a/toolkit/content/tests/chrome/test_autocomplete4.xul b/toolkit/content/tests/chrome/test_autocomplete4.xul
new file mode 100644
index 000000000..007e95661
--- /dev/null
+++ b/toolkit/content/tests/chrome/test_autocomplete4.xul
@@ -0,0 +1,280 @@
+<?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 4"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
+
+ <script type="application/javascript"
+ src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
+ <script type="application/javascript"
+ src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
+
+<textbox id="autocomplete"
+ type="autocomplete"
+ completedefaultindex="true"
+
+ onsearchcomplete="searchComplete();"
+ 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 = Components.interfaces.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: function() { return this._param; },
+ getCommentAt: function() { return null; },
+ getStyleAt: function() { return null; },
+ getImageAt: function() { return null; },
+ getFinalCompleteValueAt: function() { return this.getValueAt(); },
+ getLabelAt: function() { return null; },
+ removeValueAt: function() {}
+};
+
+// 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: function(iid) {
+ if (iid.equals(Components.interfaces.nsISupports) ||
+ iid.equals(Components.interfaces.nsIFactory) ||
+ iid.equals(Components.interfaces.nsIAutoCompleteSearch))
+ return this;
+
+ throw Components.results.NS_ERROR_NO_INTERFACE;
+ },
+
+ createInstance: function(outer, iid) {
+ return this.QueryInterface(iid);
+ },
+
+ startSearch: function(aString, aParam, aResult, aListener) {
+ var result = new nsAutoCompleteSimpleResult(aString);
+ aListener.onSearchResult(this, result);
+ },
+
+ stopSearch: function() {}
+};
+
+var componentManager = Components.manager
+ .QueryInterface(Components.interfaces.nsIComponentRegistrar);
+componentManager.registerFactory(autoCompleteSimpleID, "Test Simple Autocomplete",
+ autoCompleteSimpleName, autoCompleteSimple);
+
+
+// Test Bug 325842 - completeDefaultIndex
+
+SimpleTest.waitForExplicitFinish();
+setTimeout(nextTest, 0);
+
+var currentTest = null;
+
+// Note the entries for these tests (key) are incremental.
+const tests = [
+ {
+ desc: "HOME key remove selection",
+ key: "VK_HOME",
+ removeSelection: true,
+ result: "re",
+ start: 0, end: 0
+ },
+ {
+ desc: "LEFT key remove selection",
+ key: "VK_LEFT",
+ removeSelection: true,
+ result: "re",
+ start: 1, end: 1
+ },
+ { desc: "RIGHT key remove selection",
+ key: "VK_RIGHT",
+ removeSelection: true,
+ result: "re",
+ start: 2, end: 2
+ },
+ { desc: "ENTER key remove selection",
+ key: "VK_RETURN",
+ removeSelection: true,
+ result: "re",
+ start: 2, end: 2
+ },
+ {
+ desc: "HOME key",
+ key: "VK_HOME",
+ removeSelection: false,
+ result: "Result",
+ start: 0, end: 0
+ },
+ {
+ desc: "LEFT key",
+ key: "VK_LEFT",
+ removeSelection: false,
+ result: "Result",
+ start: 5, end: 5
+ },
+ { desc: "RIGHT key",
+ key: "VK_RIGHT",
+ removeSelection: false,
+ result: "Result",
+ start: 6, end: 6
+ },
+ { desc: "RETURN key",
+ key: "VK_RETURN",
+ removeSelection: false,
+ result: "Result",
+ start: 6, end: 6
+ },
+ { desc: "TAB key should confirm suggestion when forcecomplete is set",
+ key: "VK_TAB",
+ removeSelection: false,
+ forceComplete: true,
+ result: "Result",
+ start: 6, end: 6
+ },
+
+ { desc: "RIGHT key complete from middle",
+ key: "VK_RIGHT",
+ forceComplete: true,
+ completeFromMiddle: true,
+ result: "Result",
+ start: 6, end: 6
+ },
+ {
+ desc: "RIGHT key w/ minResultsForPopup=2",
+ key: "VK_RIGHT",
+ removeSelection: false,
+ minResultsForPopup: 2,
+ result: "Result",
+ start: 6, end: 6
+ },
+];
+
+function nextTest() {
+ if (!tests.length) {
+ // No more tests to run, finish.
+ setTimeout(function() {
+ // Unregister the factory so that we don't get in the way of other tests
+ componentManager.unregisterFactory(autoCompleteSimpleID, autoCompleteSimple);
+ SimpleTest.finish();
+ }, 0);
+ return;
+ }
+
+ var autocomplete = $("autocomplete");
+ autocomplete.value = "";
+ currentTest = tests.shift();
+
+ // HOME key works differently on Mac, so we skip tests using it.
+ if (currentTest.key == "VK_HOME" && navigator.platform.indexOf("Mac") != -1)
+ nextTest();
+ else
+ setTimeout(runCurrentTest, 0);
+}
+
+function runCurrentTest() {
+ var autocomplete = $("autocomplete");
+ if ("minResultsForPopup" in currentTest)
+ autocomplete.setAttribute("minresultsforpopup", currentTest.minResultsForPopup)
+ else
+ autocomplete.removeAttribute("minresultsforpopup");
+
+ autocomplete.focus();
+
+ if (!currentTest.completeFromMiddle) {
+ synthesizeKey("r", {});
+ synthesizeKey("e", {});
+ }
+ else {
+ synthesizeKey("l", {});
+ synthesizeKey("t", {});
+ }
+}
+
+function searchComplete() {
+ var autocomplete = $("autocomplete");
+ autocomplete.setAttribute("forcecomplete", currentTest.forceComplete ? true : false);
+
+ if (currentTest.completeFromMiddle) {
+ if (!currentTest.forceComplete) {
+ synthesizeKey(currentTest.key, {});
+ }
+ else if (!/ >> /.test(autocomplete.value)) {
+ // At this point we should have a value like "lt >> Result" showing.
+ throw new Error("Expected an middle-completed value, got " + autocomplete.value);
+ }
+
+ // For forceComplete a blur should cause a value from the results to get
+ // completed to. E.g. "lt >> Result" will turn into "Result".
+ if (currentTest.forceComplete)
+ autocomplete.blur();
+
+ checkResult();
+ return;
+ }
+
+ is(autocomplete.value, "result",
+ "Test '" + currentTest.desc + "': autocomplete.value should equal 'result'");
+
+ if (autocomplete.selectionStart == 2) { // Finished inserting "re" string.
+ if (currentTest.removeSelection) {
+ // remove current selection
+ synthesizeKey("VK_DELETE", {});
+ }
+
+ synthesizeKey(currentTest.key, {});
+
+ checkResult();
+ }
+}
+
+function checkResult() {
+ var autocomplete = $("autocomplete");
+
+ is(autocomplete.value, currentTest.result,
+ "Test '" + currentTest.desc + "': autocomplete.value should equal '" +
+ currentTest.result + "'");
+
+ is(autocomplete.selectionStart, currentTest.start,
+ "Test '" + currentTest.desc + "': autocomplete selection should start at " +
+ currentTest.start);
+
+ is(autocomplete.selectionEnd, currentTest.end,
+ "Test '" + currentTest.desc + "': autocomplete selection should end at " +
+ currentTest.end);
+
+ setTimeout(nextTest, 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>