accessible/tests/mochitest/editabletext/editabletext.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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   }
    11   this.run = function run()
    12   {
    13     this.iterate();
    14   }
    16   this.index = 0;
    17   this.seq = new Array();
    19   this.iterate = function iterate()
    20   {
    21     if (this.index < this.seq.length) {
    22       this.seq[this.index++].startTest(this);
    23       return;
    24     }
    26     this.seq = null;
    27     SimpleTest.finish();
    28   }
    29 }
    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);
    50     if (!this.mEventQueueReady) {
    51       this.unwrapNextTest();
    52       this.mEventQueueReady = true;
    53     }
    54   }
    56   /**
    57    * setTextContents test.
    58    */
    59   this.setTextContents = function setTextContents(aValue)
    60   {
    61     var testID = "setTextContents '" + aValue + "' for " + prettyName(aID);
    63     function setTextContentsInvoke()
    64     {
    65       var acc = getAccessible(aID, nsIAccessibleEditableText);
    66       acc.setTextContents(aValue);
    67     }
    69     var insertTripple = aValue ? [0, aValue.length, aValue] : null;
    70     var oldValue = getValue(aID);
    71     var removeTripple = oldValue ? [0, oldValue.length, oldValue] : null;
    73     this.generateTest(aID, removeTripple, insertTripple, setTextContentsInvoke,
    74                       getValueChecker(aID, aValue), testID);
    75   }
    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);
    85     function insertTextInvoke()
    86     {
    87       var acc = getAccessible(aID, nsIAccessibleEditableText);
    88       acc.insertText(aStr, aPos);
    89     }
    91     var resPos = (aResPos != undefined) ? aResPos : aPos;
    92     this.generateTest(aID, null, [resPos, resPos + aStr.length, aStr],
    93                       insertTextInvoke, getValueChecker(aID, aResStr), testID);
    94   }
    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);
   104     function copyTextInvoke()
   105     {
   106       var acc = getAccessible(aID, nsIAccessibleEditableText);
   107       acc.copyText(aStartPos, aEndPos);
   108     }
   110     this.generateTest(aID, null, null, copyTextInvoke,
   111                       getClipboardChecker(aID, aClipboardStr), testID);
   112   }
   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);
   123     function copyNPasteTextInvoke()
   124     {
   125       var acc = getAccessible(aID, nsIAccessibleEditableText);
   126       acc.copyText(aStartPos, aEndPos);
   127       acc.pasteText(aPos);
   128     }
   130     this.generateTest(aID, null, [aStartPos, aEndPos, getTextFromClipboard],
   131                       copyNPasteInvoke, getValueChecker(aID, aResStr), testID);
   132   }
   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);
   143     function cutTextInvoke()
   144     {
   145       var acc = getAccessible(aID, nsIAccessibleEditableText);
   146       acc.cutText(aStartPos, aEndPos);
   147     }
   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   }
   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);
   164     function cutNPasteTextInvoke()
   165     {
   166       var acc = getAccessible(aID, nsIAccessibleEditableText);
   167       acc.cutText(aStartPos, aEndPos);
   168       acc.pasteText(aPos);
   169     }
   171     this.generateTest(aID, [aStartPos, aEndPos, getTextFromClipboard],
   172                       [aPos, -1, getTextFromClipboard],
   173                       cutNPasteTextInvoke, getValueChecker(aID, aResStr),
   174                       testID);
   175   }
   177   /**
   178    * pasteText test.
   179    */
   180   this.pasteText = function pasteText(aPos, aResStr)
   181   {
   182     var testID = "pasteText at " + aPos + " for " + prettyName(aID);
   184     function pasteTextInvoke()
   185     {
   186       var acc = getAccessible(aID, nsIAccessibleEditableText);
   187       acc.pasteText(aPos);
   188     }
   190     this.generateTest(aID, null, [aPos, -1, getTextFromClipboard],
   191                       pasteTextInvoke, getValueChecker(aID, aResStr), testID);
   192   }
   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);
   202     var oldValue = getValue(aID).substring(aStartPos, aEndPos);
   203     var removeTripple = oldValue ? [aStartPos, aEndPos, oldValue] : null;
   205     function deleteTextInvoke()
   206     {
   207       var acc = getAccessible(aID, [nsIAccessibleEditableText]);
   208       acc.deleteText(aStartPos, aEndPos);
   209     }
   211     this.generateTest(aID, removeTripple, null, deleteTextInvoke,
   212                       getValueChecker(aID, aResStr), testID);
   213   }
   215   //////////////////////////////////////////////////////////////////////////////
   216   // Implementation details.
   218   function getValue(aID)
   219   {
   220     var value = "";
   221     var elm = getNode(aID);
   222     if (elm instanceof Components.interfaces.nsIDOMNSEditableElement)
   223       return elm.value;
   225     if (elm instanceof Components.interfaces.nsIDOMHTMLDocument)
   226       return elm.body.textContent;
   228     return elm.textContent;
   229   }
   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   }
   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   }
   256   function getValueNClipboardChecker(aID, aValue, aText)
   257   {
   258     var valueChecker = getValueChecker(aID, aValue);
   259     var clipboardChecker = getClipboardChecker(aID, aText);
   261     var checker = {
   262       check: function()
   263       {
   264         valueChecker.check();
   265         clipboardChecker.check();
   266       }
   267     };
   268     return checker;
   269   }
   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   }
   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: [],
   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     };
   300     if (aRemoveTriple) {
   301       var checker = new textChangeChecker(aID, aRemoveTriple[0],
   302                                           aRemoveTriple[1], aRemoveTriple[2],
   303                                           false);
   304       invoker.eventSeq.push(checker);
   305     }
   307     if (aInsertTriple) {
   308       var checker = new textChangeChecker(aID, aInsertTriple[0],
   309                                           aInsertTriple[1], aInsertTriple[2],
   310                                           true);
   311       invoker.eventSeq.push(checker);
   312     }
   314     // Claim that we don't want to fail when no events are expected.
   315     if (!aRemoveTriple && !aInsertTriple)
   316       invoker.noEventsOnAction = true;
   318     this.mEventQueue.mInvokers[this.mEventQueue.mIndex + 1] = invoker;
   319   }
   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();
   333       // Help GC to avoid leaks (refer to aTestRun from local variable, drop
   334       // onFinish function).
   335       thisObj.mEventQueue.onFinish = null;
   337       return DO_NOT_FINISH_TEST;
   338     }
   340     this.mEventQueue.invoke();
   341   }
   343   this.mEventQueue = new eventQueue();
   344   this.mEventQueueReady = false;
   345 }

mercurial