accessible/tests/mochitest/editabletext/editabletext.js

branch
TOR_BUG_9701
changeset 8
97036ab72558
equal deleted inserted replaced
-1:000000000000 0:c78b4deaca16
1 /**
2 * Perform all editable text tests.
3 */
4 function editableTextTestRun()
5 {
6 this.add = function add(aTest)
7 {
8 this.seq.push(aTest);
9 }
10
11 this.run = function run()
12 {
13 this.iterate();
14 }
15
16 this.index = 0;
17 this.seq = new Array();
18
19 this.iterate = function iterate()
20 {
21 if (this.index < this.seq.length) {
22 this.seq[this.index++].startTest(this);
23 return;
24 }
25
26 this.seq = null;
27 SimpleTest.finish();
28 }
29 }
30
31 /**
32 * Used to test nsIEditableTextAccessible methods.
33 */
34 function editableTextTest(aID)
35 {
36 /**
37 * Schedule a test, the given function with its arguments will be executed
38 * when preceding test is complete.
39 */
40 this.scheduleTest = function scheduleTest(aFunc)
41 {
42 // A data container acts like a dummy invoker, it's never invoked but
43 // it's used to generate real invoker when previous invoker was handled.
44 var dataContainer = {
45 func: aFunc,
46 funcArgs: Array.slice(arguments, 1)
47 };
48 this.mEventQueue.push(dataContainer);
49
50 if (!this.mEventQueueReady) {
51 this.unwrapNextTest();
52 this.mEventQueueReady = true;
53 }
54 }
55
56 /**
57 * setTextContents test.
58 */
59 this.setTextContents = function setTextContents(aValue)
60 {
61 var testID = "setTextContents '" + aValue + "' for " + prettyName(aID);
62
63 function setTextContentsInvoke()
64 {
65 var acc = getAccessible(aID, nsIAccessibleEditableText);
66 acc.setTextContents(aValue);
67 }
68
69 var insertTripple = aValue ? [0, aValue.length, aValue] : null;
70 var oldValue = getValue(aID);
71 var removeTripple = oldValue ? [0, oldValue.length, oldValue] : null;
72
73 this.generateTest(aID, removeTripple, insertTripple, setTextContentsInvoke,
74 getValueChecker(aID, aValue), testID);
75 }
76
77 /**
78 * insertText test.
79 */
80 this.insertText = function insertText(aStr, aPos, aResStr, aResPos)
81 {
82 var testID = "insertText '" + aStr + "' at " + aPos + " for " +
83 prettyName(aID);
84
85 function insertTextInvoke()
86 {
87 var acc = getAccessible(aID, nsIAccessibleEditableText);
88 acc.insertText(aStr, aPos);
89 }
90
91 var resPos = (aResPos != undefined) ? aResPos : aPos;
92 this.generateTest(aID, null, [resPos, resPos + aStr.length, aStr],
93 insertTextInvoke, getValueChecker(aID, aResStr), testID);
94 }
95
96 /**
97 * copyText test.
98 */
99 this.copyText = function copyText(aStartPos, aEndPos, aClipboardStr)
100 {
101 var testID = "copyText from " + aStartPos + " to " + aEndPos + " for " +
102 prettyName(aID);
103
104 function copyTextInvoke()
105 {
106 var acc = getAccessible(aID, nsIAccessibleEditableText);
107 acc.copyText(aStartPos, aEndPos);
108 }
109
110 this.generateTest(aID, null, null, copyTextInvoke,
111 getClipboardChecker(aID, aClipboardStr), testID);
112 }
113
114 /**
115 * copyText and pasteText test.
116 */
117 this.copyNPasteText = function copyNPasteText(aStartPos, aEndPos,
118 aPos, aResStr)
119 {
120 var testID = "copyText from " + aStartPos + " to " + aEndPos +
121 "and pasteText at " + aPos + " for " + prettyName(aID);
122
123 function copyNPasteTextInvoke()
124 {
125 var acc = getAccessible(aID, nsIAccessibleEditableText);
126 acc.copyText(aStartPos, aEndPos);
127 acc.pasteText(aPos);
128 }
129
130 this.generateTest(aID, null, [aStartPos, aEndPos, getTextFromClipboard],
131 copyNPasteInvoke, getValueChecker(aID, aResStr), testID);
132 }
133
134 /**
135 * cutText test.
136 */
137 this.cutText = function cutText(aStartPos, aEndPos, aResStr,
138 aResStartPos, aResEndPos)
139 {
140 var testID = "cutText from " + aStartPos + " to " + aEndPos + " for " +
141 prettyName(aID);
142
143 function cutTextInvoke()
144 {
145 var acc = getAccessible(aID, nsIAccessibleEditableText);
146 acc.cutText(aStartPos, aEndPos);
147 }
148
149 var resStartPos = (aResStartPos != undefined) ? aResStartPos : aStartPos;
150 var resEndPos = (aResEndPos != undefined) ? aResEndPos : aEndPos;
151 this.generateTest(aID, [resStartPos, resEndPos, getTextFromClipboard], null,
152 cutTextInvoke, getValueChecker(aID, aResStr), testID);
153 }
154
155 /**
156 * cutText and pasteText test.
157 */
158 this.cutNPasteText = function copyNPasteText(aStartPos, aEndPos,
159 aPos, aResStr)
160 {
161 var testID = "cutText from " + aStartPos + " to " + aEndPos +
162 " and pasteText at " + aPos + " for " + prettyName(aID);
163
164 function cutNPasteTextInvoke()
165 {
166 var acc = getAccessible(aID, nsIAccessibleEditableText);
167 acc.cutText(aStartPos, aEndPos);
168 acc.pasteText(aPos);
169 }
170
171 this.generateTest(aID, [aStartPos, aEndPos, getTextFromClipboard],
172 [aPos, -1, getTextFromClipboard],
173 cutNPasteTextInvoke, getValueChecker(aID, aResStr),
174 testID);
175 }
176
177 /**
178 * pasteText test.
179 */
180 this.pasteText = function pasteText(aPos, aResStr)
181 {
182 var testID = "pasteText at " + aPos + " for " + prettyName(aID);
183
184 function pasteTextInvoke()
185 {
186 var acc = getAccessible(aID, nsIAccessibleEditableText);
187 acc.pasteText(aPos);
188 }
189
190 this.generateTest(aID, null, [aPos, -1, getTextFromClipboard],
191 pasteTextInvoke, getValueChecker(aID, aResStr), testID);
192 }
193
194 /**
195 * deleteText test.
196 */
197 this.deleteText = function deleteText(aStartPos, aEndPos, aResStr)
198 {
199 var testID = "deleteText from " + aStartPos + " to " + aEndPos +
200 " for " + prettyName(aID);
201
202 var oldValue = getValue(aID).substring(aStartPos, aEndPos);
203 var removeTripple = oldValue ? [aStartPos, aEndPos, oldValue] : null;
204
205 function deleteTextInvoke()
206 {
207 var acc = getAccessible(aID, [nsIAccessibleEditableText]);
208 acc.deleteText(aStartPos, aEndPos);
209 }
210
211 this.generateTest(aID, removeTripple, null, deleteTextInvoke,
212 getValueChecker(aID, aResStr), testID);
213 }
214
215 //////////////////////////////////////////////////////////////////////////////
216 // Implementation details.
217
218 function getValue(aID)
219 {
220 var value = "";
221 var elm = getNode(aID);
222 if (elm instanceof Components.interfaces.nsIDOMNSEditableElement)
223 return elm.value;
224
225 if (elm instanceof Components.interfaces.nsIDOMHTMLDocument)
226 return elm.body.textContent;
227
228 return elm.textContent;
229 }
230
231 /**
232 * Common checkers.
233 */
234 function getValueChecker(aID, aValue)
235 {
236 var checker = {
237 check: function valueChecker_check()
238 {
239 is(getValue(aID), aValue, "Wrong value " + aValue);
240 }
241 };
242 return checker;
243 }
244
245 function getClipboardChecker(aID, aText)
246 {
247 var checker = {
248 check: function clipboardChecker_check()
249 {
250 is(getTextFromClipboard(), aText, "Wrong text in clipboard.");
251 }
252 };
253 return checker;
254 }
255
256 function getValueNClipboardChecker(aID, aValue, aText)
257 {
258 var valueChecker = getValueChecker(aID, aValue);
259 var clipboardChecker = getClipboardChecker(aID, aText);
260
261 var checker = {
262 check: function()
263 {
264 valueChecker.check();
265 clipboardChecker.check();
266 }
267 };
268 return checker;
269 }
270
271 /**
272 * Process next scheduled test.
273 */
274 this.unwrapNextTest = function unwrapNextTest()
275 {
276 var data = this.mEventQueue.mInvokers[this.mEventQueue.mIndex + 1];
277 if (data)
278 data.func.apply(this, data.funcArgs);
279 }
280
281 /**
282 * Used to generate an invoker object for the sheduled test.
283 */
284 this.generateTest = function generateTest(aID, aRemoveTriple, aInsertTriple,
285 aInvokeFunc, aChecker, aInvokerID)
286 {
287 var et = this;
288 var invoker = {
289 eventSeq: [],
290
291 invoke: aInvokeFunc,
292 finalCheck: function finalCheck()
293 {
294 aChecker.check();
295 et.unwrapNextTest(); // replace dummy invoker on real invoker object.
296 },
297 getID: function getID() { return aInvokerID; }
298 };
299
300 if (aRemoveTriple) {
301 var checker = new textChangeChecker(aID, aRemoveTriple[0],
302 aRemoveTriple[1], aRemoveTriple[2],
303 false);
304 invoker.eventSeq.push(checker);
305 }
306
307 if (aInsertTriple) {
308 var checker = new textChangeChecker(aID, aInsertTriple[0],
309 aInsertTriple[1], aInsertTriple[2],
310 true);
311 invoker.eventSeq.push(checker);
312 }
313
314 // Claim that we don't want to fail when no events are expected.
315 if (!aRemoveTriple && !aInsertTriple)
316 invoker.noEventsOnAction = true;
317
318 this.mEventQueue.mInvokers[this.mEventQueue.mIndex + 1] = invoker;
319 }
320
321 /**
322 * Run the tests.
323 */
324 this.startTest = function startTest(aTestRun)
325 {
326 var testRunObj = aTestRun;
327 var thisObj = this;
328 this.mEventQueue.onFinish = function finishCallback()
329 {
330 // Notify textRun object that all tests were finished.
331 testRunObj.iterate();
332
333 // Help GC to avoid leaks (refer to aTestRun from local variable, drop
334 // onFinish function).
335 thisObj.mEventQueue.onFinish = null;
336
337 return DO_NOT_FINISH_TEST;
338 }
339
340 this.mEventQueue.invoke();
341 }
342
343 this.mEventQueue = new eventQueue();
344 this.mEventQueueReady = false;
345 }
346

mercurial