Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android'
- Manifest: toolkit/content/tests/chrome/chrome.toml
<?xml version="1.0"?>
<window title="Autocomplete Widget Test 3"
<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);
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 {
// 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>
<p id="display">
</p>
<div id="content" style="display: none">
</div>
<pre id="test">
</pre>
</body>
</window>