1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/accessible/tests/mochitest/editabletext/editabletext.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,346 @@ 1.4 +/** 1.5 + * Perform all editable text tests. 1.6 + */ 1.7 +function editableTextTestRun() 1.8 +{ 1.9 + this.add = function add(aTest) 1.10 + { 1.11 + this.seq.push(aTest); 1.12 + } 1.13 + 1.14 + this.run = function run() 1.15 + { 1.16 + this.iterate(); 1.17 + } 1.18 + 1.19 + this.index = 0; 1.20 + this.seq = new Array(); 1.21 + 1.22 + this.iterate = function iterate() 1.23 + { 1.24 + if (this.index < this.seq.length) { 1.25 + this.seq[this.index++].startTest(this); 1.26 + return; 1.27 + } 1.28 + 1.29 + this.seq = null; 1.30 + SimpleTest.finish(); 1.31 + } 1.32 +} 1.33 + 1.34 +/** 1.35 + * Used to test nsIEditableTextAccessible methods. 1.36 + */ 1.37 +function editableTextTest(aID) 1.38 +{ 1.39 + /** 1.40 + * Schedule a test, the given function with its arguments will be executed 1.41 + * when preceding test is complete. 1.42 + */ 1.43 + this.scheduleTest = function scheduleTest(aFunc) 1.44 + { 1.45 + // A data container acts like a dummy invoker, it's never invoked but 1.46 + // it's used to generate real invoker when previous invoker was handled. 1.47 + var dataContainer = { 1.48 + func: aFunc, 1.49 + funcArgs: Array.slice(arguments, 1) 1.50 + }; 1.51 + this.mEventQueue.push(dataContainer); 1.52 + 1.53 + if (!this.mEventQueueReady) { 1.54 + this.unwrapNextTest(); 1.55 + this.mEventQueueReady = true; 1.56 + } 1.57 + } 1.58 + 1.59 + /** 1.60 + * setTextContents test. 1.61 + */ 1.62 + this.setTextContents = function setTextContents(aValue) 1.63 + { 1.64 + var testID = "setTextContents '" + aValue + "' for " + prettyName(aID); 1.65 + 1.66 + function setTextContentsInvoke() 1.67 + { 1.68 + var acc = getAccessible(aID, nsIAccessibleEditableText); 1.69 + acc.setTextContents(aValue); 1.70 + } 1.71 + 1.72 + var insertTripple = aValue ? [0, aValue.length, aValue] : null; 1.73 + var oldValue = getValue(aID); 1.74 + var removeTripple = oldValue ? [0, oldValue.length, oldValue] : null; 1.75 + 1.76 + this.generateTest(aID, removeTripple, insertTripple, setTextContentsInvoke, 1.77 + getValueChecker(aID, aValue), testID); 1.78 + } 1.79 + 1.80 + /** 1.81 + * insertText test. 1.82 + */ 1.83 + this.insertText = function insertText(aStr, aPos, aResStr, aResPos) 1.84 + { 1.85 + var testID = "insertText '" + aStr + "' at " + aPos + " for " + 1.86 + prettyName(aID); 1.87 + 1.88 + function insertTextInvoke() 1.89 + { 1.90 + var acc = getAccessible(aID, nsIAccessibleEditableText); 1.91 + acc.insertText(aStr, aPos); 1.92 + } 1.93 + 1.94 + var resPos = (aResPos != undefined) ? aResPos : aPos; 1.95 + this.generateTest(aID, null, [resPos, resPos + aStr.length, aStr], 1.96 + insertTextInvoke, getValueChecker(aID, aResStr), testID); 1.97 + } 1.98 + 1.99 + /** 1.100 + * copyText test. 1.101 + */ 1.102 + this.copyText = function copyText(aStartPos, aEndPos, aClipboardStr) 1.103 + { 1.104 + var testID = "copyText from " + aStartPos + " to " + aEndPos + " for " + 1.105 + prettyName(aID); 1.106 + 1.107 + function copyTextInvoke() 1.108 + { 1.109 + var acc = getAccessible(aID, nsIAccessibleEditableText); 1.110 + acc.copyText(aStartPos, aEndPos); 1.111 + } 1.112 + 1.113 + this.generateTest(aID, null, null, copyTextInvoke, 1.114 + getClipboardChecker(aID, aClipboardStr), testID); 1.115 + } 1.116 + 1.117 + /** 1.118 + * copyText and pasteText test. 1.119 + */ 1.120 + this.copyNPasteText = function copyNPasteText(aStartPos, aEndPos, 1.121 + aPos, aResStr) 1.122 + { 1.123 + var testID = "copyText from " + aStartPos + " to " + aEndPos + 1.124 + "and pasteText at " + aPos + " for " + prettyName(aID); 1.125 + 1.126 + function copyNPasteTextInvoke() 1.127 + { 1.128 + var acc = getAccessible(aID, nsIAccessibleEditableText); 1.129 + acc.copyText(aStartPos, aEndPos); 1.130 + acc.pasteText(aPos); 1.131 + } 1.132 + 1.133 + this.generateTest(aID, null, [aStartPos, aEndPos, getTextFromClipboard], 1.134 + copyNPasteInvoke, getValueChecker(aID, aResStr), testID); 1.135 + } 1.136 + 1.137 + /** 1.138 + * cutText test. 1.139 + */ 1.140 + this.cutText = function cutText(aStartPos, aEndPos, aResStr, 1.141 + aResStartPos, aResEndPos) 1.142 + { 1.143 + var testID = "cutText from " + aStartPos + " to " + aEndPos + " for " + 1.144 + prettyName(aID); 1.145 + 1.146 + function cutTextInvoke() 1.147 + { 1.148 + var acc = getAccessible(aID, nsIAccessibleEditableText); 1.149 + acc.cutText(aStartPos, aEndPos); 1.150 + } 1.151 + 1.152 + var resStartPos = (aResStartPos != undefined) ? aResStartPos : aStartPos; 1.153 + var resEndPos = (aResEndPos != undefined) ? aResEndPos : aEndPos; 1.154 + this.generateTest(aID, [resStartPos, resEndPos, getTextFromClipboard], null, 1.155 + cutTextInvoke, getValueChecker(aID, aResStr), testID); 1.156 + } 1.157 + 1.158 + /** 1.159 + * cutText and pasteText test. 1.160 + */ 1.161 + this.cutNPasteText = function copyNPasteText(aStartPos, aEndPos, 1.162 + aPos, aResStr) 1.163 + { 1.164 + var testID = "cutText from " + aStartPos + " to " + aEndPos + 1.165 + " and pasteText at " + aPos + " for " + prettyName(aID); 1.166 + 1.167 + function cutNPasteTextInvoke() 1.168 + { 1.169 + var acc = getAccessible(aID, nsIAccessibleEditableText); 1.170 + acc.cutText(aStartPos, aEndPos); 1.171 + acc.pasteText(aPos); 1.172 + } 1.173 + 1.174 + this.generateTest(aID, [aStartPos, aEndPos, getTextFromClipboard], 1.175 + [aPos, -1, getTextFromClipboard], 1.176 + cutNPasteTextInvoke, getValueChecker(aID, aResStr), 1.177 + testID); 1.178 + } 1.179 + 1.180 + /** 1.181 + * pasteText test. 1.182 + */ 1.183 + this.pasteText = function pasteText(aPos, aResStr) 1.184 + { 1.185 + var testID = "pasteText at " + aPos + " for " + prettyName(aID); 1.186 + 1.187 + function pasteTextInvoke() 1.188 + { 1.189 + var acc = getAccessible(aID, nsIAccessibleEditableText); 1.190 + acc.pasteText(aPos); 1.191 + } 1.192 + 1.193 + this.generateTest(aID, null, [aPos, -1, getTextFromClipboard], 1.194 + pasteTextInvoke, getValueChecker(aID, aResStr), testID); 1.195 + } 1.196 + 1.197 + /** 1.198 + * deleteText test. 1.199 + */ 1.200 + this.deleteText = function deleteText(aStartPos, aEndPos, aResStr) 1.201 + { 1.202 + var testID = "deleteText from " + aStartPos + " to " + aEndPos + 1.203 + " for " + prettyName(aID); 1.204 + 1.205 + var oldValue = getValue(aID).substring(aStartPos, aEndPos); 1.206 + var removeTripple = oldValue ? [aStartPos, aEndPos, oldValue] : null; 1.207 + 1.208 + function deleteTextInvoke() 1.209 + { 1.210 + var acc = getAccessible(aID, [nsIAccessibleEditableText]); 1.211 + acc.deleteText(aStartPos, aEndPos); 1.212 + } 1.213 + 1.214 + this.generateTest(aID, removeTripple, null, deleteTextInvoke, 1.215 + getValueChecker(aID, aResStr), testID); 1.216 + } 1.217 + 1.218 + ////////////////////////////////////////////////////////////////////////////// 1.219 + // Implementation details. 1.220 + 1.221 + function getValue(aID) 1.222 + { 1.223 + var value = ""; 1.224 + var elm = getNode(aID); 1.225 + if (elm instanceof Components.interfaces.nsIDOMNSEditableElement) 1.226 + return elm.value; 1.227 + 1.228 + if (elm instanceof Components.interfaces.nsIDOMHTMLDocument) 1.229 + return elm.body.textContent; 1.230 + 1.231 + return elm.textContent; 1.232 + } 1.233 + 1.234 + /** 1.235 + * Common checkers. 1.236 + */ 1.237 + function getValueChecker(aID, aValue) 1.238 + { 1.239 + var checker = { 1.240 + check: function valueChecker_check() 1.241 + { 1.242 + is(getValue(aID), aValue, "Wrong value " + aValue); 1.243 + } 1.244 + }; 1.245 + return checker; 1.246 + } 1.247 + 1.248 + function getClipboardChecker(aID, aText) 1.249 + { 1.250 + var checker = { 1.251 + check: function clipboardChecker_check() 1.252 + { 1.253 + is(getTextFromClipboard(), aText, "Wrong text in clipboard."); 1.254 + } 1.255 + }; 1.256 + return checker; 1.257 + } 1.258 + 1.259 + function getValueNClipboardChecker(aID, aValue, aText) 1.260 + { 1.261 + var valueChecker = getValueChecker(aID, aValue); 1.262 + var clipboardChecker = getClipboardChecker(aID, aText); 1.263 + 1.264 + var checker = { 1.265 + check: function() 1.266 + { 1.267 + valueChecker.check(); 1.268 + clipboardChecker.check(); 1.269 + } 1.270 + }; 1.271 + return checker; 1.272 + } 1.273 + 1.274 + /** 1.275 + * Process next scheduled test. 1.276 + */ 1.277 + this.unwrapNextTest = function unwrapNextTest() 1.278 + { 1.279 + var data = this.mEventQueue.mInvokers[this.mEventQueue.mIndex + 1]; 1.280 + if (data) 1.281 + data.func.apply(this, data.funcArgs); 1.282 + } 1.283 + 1.284 + /** 1.285 + * Used to generate an invoker object for the sheduled test. 1.286 + */ 1.287 + this.generateTest = function generateTest(aID, aRemoveTriple, aInsertTriple, 1.288 + aInvokeFunc, aChecker, aInvokerID) 1.289 + { 1.290 + var et = this; 1.291 + var invoker = { 1.292 + eventSeq: [], 1.293 + 1.294 + invoke: aInvokeFunc, 1.295 + finalCheck: function finalCheck() 1.296 + { 1.297 + aChecker.check(); 1.298 + et.unwrapNextTest(); // replace dummy invoker on real invoker object. 1.299 + }, 1.300 + getID: function getID() { return aInvokerID; } 1.301 + }; 1.302 + 1.303 + if (aRemoveTriple) { 1.304 + var checker = new textChangeChecker(aID, aRemoveTriple[0], 1.305 + aRemoveTriple[1], aRemoveTriple[2], 1.306 + false); 1.307 + invoker.eventSeq.push(checker); 1.308 + } 1.309 + 1.310 + if (aInsertTriple) { 1.311 + var checker = new textChangeChecker(aID, aInsertTriple[0], 1.312 + aInsertTriple[1], aInsertTriple[2], 1.313 + true); 1.314 + invoker.eventSeq.push(checker); 1.315 + } 1.316 + 1.317 + // Claim that we don't want to fail when no events are expected. 1.318 + if (!aRemoveTriple && !aInsertTriple) 1.319 + invoker.noEventsOnAction = true; 1.320 + 1.321 + this.mEventQueue.mInvokers[this.mEventQueue.mIndex + 1] = invoker; 1.322 + } 1.323 + 1.324 + /** 1.325 + * Run the tests. 1.326 + */ 1.327 + this.startTest = function startTest(aTestRun) 1.328 + { 1.329 + var testRunObj = aTestRun; 1.330 + var thisObj = this; 1.331 + this.mEventQueue.onFinish = function finishCallback() 1.332 + { 1.333 + // Notify textRun object that all tests were finished. 1.334 + testRunObj.iterate(); 1.335 + 1.336 + // Help GC to avoid leaks (refer to aTestRun from local variable, drop 1.337 + // onFinish function). 1.338 + thisObj.mEventQueue.onFinish = null; 1.339 + 1.340 + return DO_NOT_FINISH_TEST; 1.341 + } 1.342 + 1.343 + this.mEventQueue.invoke(); 1.344 + } 1.345 + 1.346 + this.mEventQueue = new eventQueue(); 1.347 + this.mEventQueueReady = false; 1.348 +} 1.349 +