summaryrefslogtreecommitdiffstats
path: root/toolkit/content/tests/chrome/test_autocomplete5.xhtml
blob: 7c252f355ea54f752f15ac780e557c7f84ca01de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
<?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 5"
        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"
            notifylegacyevents="true"/>

<script class="testbody" type="application/javascript">
<![CDATA[

const ACR = Ci.nsIAutoCompleteResult;

// 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;
  this._param = "SUCCESS";
}

nsAutoCompleteSimpleResult.prototype = {
 _param: "",
 searchString: null,
 searchResult: ACR.RESULT_FAILURE,
 defaultIndex: -1,
 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() {}
};


let element = document.getElementById("autocomplete");

// Create stub to intercept `onSearchBegin` event.
element.onSearchBegin = function(original) {
  return function() {
    original.apply(this, arguments);
    checkSearchBegin();
  };
}(element.onSearchBegin);

// Create stub to intercept `onSearchComplete` event.
element.onSearchComplete = function(original) {
  return function() {
    original.apply(this, arguments);
    checkSearchCompleted();
  };
}(element.onSearchComplete);

element.addEventListener("textEntered", checkTextEntered);
element.addEventListener("textReverted", checkTextReverted);

var componentManager = Components.manager
                                 .QueryInterface(Ci.nsIComponentRegistrar);
componentManager.registerFactory(autoCompleteSimpleID, "Test Simple Autocomplete",
                                 autoCompleteSimpleName, autoCompleteSimple);

SimpleTest.waitForExplicitFinish();
setTimeout(startTest, 0);

function startTest() {
  let autocomplete = $("autocomplete");

  // blur the field to ensure that the popup is closed and that the previous
  // search has stopped, then start a new search.
  autocomplete.blur();
  autocomplete.focus();
  sendString("r");
}

let hasTextEntered = false;
let hasSearchBegun = false;

function checkSearchBegin() {
  hasSearchBegun = true;
}

let test = 0;
function checkSearchCompleted() {
  is(hasSearchBegun, true, "onsearchbegin handler has been correctly called.");

  if (test == 0) {
    hasSearchBegun = false;
    synthesizeKey("KEY_Enter");
  } else if (test == 1) {
    hasSearchBegun = false;
    synthesizeKey("KEY_Escape");
  } else {
    throw new Error("checkSearchCompleted should only be called twice.");
  }
}

function checkTextEntered() {
  is(test, 0, "checkTextEntered should be reached from first test.");
  is(hasSearchBegun, false, "onsearchbegin handler should not be called on text revert.");

  // fire second test
  test++;

  let autocomplete = $("autocomplete");
  autocomplete.textValue = "";
  autocomplete.blur();
  autocomplete.focus();
  sendString("r");
}

function checkTextReverted() {
  is(test, 1, "checkTextReverted should be the second test reached.");
  is(hasSearchBegun, false, "onsearchbegin handler should not be called on text revert.");

  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>