mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-24 02:35:41 +00:00
a12225ccf4
MozReview-Commit-ID: JiD70fqK9EU
176 lines
5.8 KiB
XML
176 lines
5.8 KiB
XML
<?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 emphasis test"
|
|
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="richautocomplete" type="autocomplete"
|
|
autocompletesearch="simple"
|
|
onsearchcomplete="checkSearchCompleted();"
|
|
autocompletepopup="richpopup"/>
|
|
<panel id="richpopup" type="autocomplete-richlistbox" noautofocus="true"/>
|
|
|
|
<script class="testbody" type="application/javascript">
|
|
<![CDATA[
|
|
|
|
const ACR = Components.interfaces.nsIAutoCompleteResult;
|
|
|
|
// A global variable to hold the search result for the current search.
|
|
var resultText = "";
|
|
|
|
// This result can't be constructed in-line, because otherwise we leak memory.
|
|
function nsAutoCompleteSimpleResult(aString)
|
|
{
|
|
this.searchString = aString;
|
|
this.searchResult = ACR.RESULT_SUCCESS;
|
|
this.matchCount = 1;
|
|
}
|
|
|
|
nsAutoCompleteSimpleResult.prototype = {
|
|
searchString: null,
|
|
searchResult: ACR.RESULT_FAILURE,
|
|
defaultIndex: -1,
|
|
errorDescription: null,
|
|
matchCount: 0,
|
|
getValueAt: function() { return resultText; },
|
|
getCommentAt: function() { return this.getValueAt(); },
|
|
getStyleAt: function() { return null; },
|
|
getImageAt: function() { return null; },
|
|
getFinalCompleteValueAt: function() { return this.getValueAt(); },
|
|
getLabelAt: function() { return this.getValueAt(); },
|
|
removeValueAt: function() {}
|
|
};
|
|
|
|
// A basic autocomplete implementation that returns the string contained in 'resultText'.
|
|
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);
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
setTimeout(nextTest, 0);
|
|
|
|
/* Test cases have the following attributes:
|
|
* - search: A search string, to be emphasized in the result.
|
|
* - result: A fixed result string, so we can hardcode the expected emphasis.
|
|
* - emphasis: A list of chunks that should be emphasized or not, in strict alternation.
|
|
* - emphasizeFirst: Whether the first element of 'emphasis' should be emphasized;
|
|
* The emphasis of the other elements is defined by the strict alternation rule.
|
|
*/
|
|
let testcases = [
|
|
{ search: "test",
|
|
result: "A test string",
|
|
emphasis: ["A ", "test", " string"],
|
|
emphasizeFirst: false
|
|
},
|
|
{ search: "tea two",
|
|
result: "Tea for two, and two for tea...",
|
|
emphasis: ["Tea", " for ", "two", ", and ", "two", " for ", "tea", "..."],
|
|
emphasizeFirst: true
|
|
},
|
|
{ search: "tat",
|
|
result: "tatatat",
|
|
emphasis: ["tatatat"],
|
|
emphasizeFirst: true
|
|
},
|
|
{ search: "cheval valise",
|
|
result: "chevalise",
|
|
emphasis: ["chevalise"],
|
|
emphasizeFirst: true
|
|
}
|
|
];
|
|
let test = -1;
|
|
let currentTest = null;
|
|
|
|
function nextTest() {
|
|
test++;
|
|
|
|
if (test >= testcases.length) {
|
|
// Unregister the factory so that we don't get in the way of other tests
|
|
componentManager.unregisterFactory(autoCompleteSimpleID, autoCompleteSimple);
|
|
SimpleTest.finish();
|
|
return;
|
|
}
|
|
|
|
// blur the field to ensure that the popup is closed and that the previous
|
|
// search has stopped, then start a new search.
|
|
let autocomplete = $("richautocomplete");
|
|
autocomplete.blur();
|
|
autocomplete.focus();
|
|
|
|
currentTest = testcases[test];
|
|
resultText = currentTest.result;
|
|
autocomplete.value = currentTest.search;
|
|
synthesizeKey("VK_DOWN", {});
|
|
}
|
|
|
|
function checkSearchCompleted() {
|
|
let autocomplete = $("richautocomplete");
|
|
let result = autocomplete.popup.richlistbox.firstChild;
|
|
|
|
for (let attribute of [result._titleText, result._urlText]) {
|
|
is(attribute.childNodes.length, currentTest.emphasis.length,
|
|
"The element should have the expected number of children.");
|
|
for (let i = 0; i < currentTest.emphasis.length; i++) {
|
|
let node = attribute.childNodes[i];
|
|
// Emphasized parts strictly alternate.
|
|
if ((i % 2 == 0) == currentTest.emphasizeFirst) {
|
|
// Check that this part is correctly emphasized.
|
|
is(node.nodeName, "span", ". That child should be a span node");
|
|
ok(node.classList.contains("ac-emphasize-text"), ". That child should be emphasized");
|
|
is(node.textContent, currentTest.emphasis[i], ". That emphasis should be as expected.");
|
|
} else {
|
|
// Check that this part is _not_ emphasized.
|
|
is(node.nodeName, "#text", ". That child should be a text node");
|
|
is(node.textContent, currentTest.emphasis[i], ". That text should be as expected.");
|
|
}
|
|
}
|
|
}
|
|
|
|
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>
|