Fix failing test from bug 525788. r=roc
authorSimon Montagu <smontagu@smontagu.org>
Thu, 24 Dec 2009 12:29:27 +0200
changeset 36649 fa1e6f870ff1ab78f54c2e78d5aca999b98cf6e8
parent 36648 36ea022cd2a228924571f02a1a7ddceed1a40d8b
child 36650 91bb153b4f8731d62580b05298491a7bf02d5045
push id1
push userroot
push dateMon, 20 Oct 2014 17:29:22 +0000
reviewersroc
bugs525788
milestone1.9.3a1pre
Fix failing test from bug 525788. r=roc
content/base/test/test_range_bounds.html
--- a/content/base/test/test_range_bounds.html
+++ b/content/base/test/test_range_bounds.html
@@ -1,38 +1,43 @@
 <!DOCTYPE HTML>
 <html>
 <!--
 https://bugzilla.mozilla.org/show_bug.cgi?id=421640
 -->
 <head>
   <title>Test for Bug 396392</title>
+  <meta http-equiv="content-type" content="text/html; charset=UTF-8">
   <script type="text/javascript" src="/MochiKit/packed.js"></script>
   <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
   <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
   <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
 </head>
 <body>
 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=396392">Mozilla Bug Range getClientRects and getBoundingClientRect</a>
 <div id="content" style="font-face:monospace;font-size:12px;width:100px">
 <p>000000<span>0</span></p><div>00000<span>0</span></div><p>0000<span>0000</span>0000</p>
 </div>
+<div id="mixeddir" style="font-face:monospace;font-size:12px;width:100px"><span>english <bdo dir="rtl">rtl-overide english</bdo> word</span></div>
 <pre id="test">
 <script class="testbody" type="text/javascript">
 
+var isLTR=true;
 function isEmptyRect(rect, name) {
+  name = (isLTR ? 'isLTR ' : 'isRTL ') + name;
   is(rect.left, 0, name+'empty rect should have left = 0');
   is(rect.right, 0, name+'empty rect should have right = 0');
   is(rect.top, 0, name+'empty rect should have top = 0');
   is(rect.bottom, 0, name+'empty rect should have bottom = 0');
   is(rect.width, 0, name+'empty rect should have width = 0');
   is(rect.height, 0, name+'empty rect should have height = 0');
 }
 
 function isEmptyRectList(rectlist, name) {
+  name = (isLTR ? 'isLTR ' : 'isRTL ') + name;
   is(rectlist.length, 0, name + 'empty rectlist should have zero rects');
 }
 
 function _getRect(r) {
   if (r.length) //array
     return "{left:"+r[0]+",right:"+r[1]+",top:"+r[2]+",bottom:"+r[3]
       +",width:"+r[4]+",height:"+r[5]+"}";
   else
@@ -44,106 +49,132 @@ function runATest(obj) {
   var range = document.createRange();
   try {
     range.setStart(obj.range[0],obj.range[1]);
     if (obj.range.length>2) {
        range.setEnd(obj.range[2]||obj.range[0], obj.range[3]);
     }
     //test getBoundingClientRect()
     var rect = range.getBoundingClientRect();
-    var testname = 'range.getBoundingClientRect for ' + obj.name;
+    var testname = (isLTR ? 'isLTR ' : 'isRTL ') + 
+      'range.getBoundingClientRect for ' + obj.name;
     if (obj.rect) {
       is(_getRect(rect),_getRect(obj.rect), testname);
     } else {
       isEmptyRect(rect,testname+": ");
     }
     //test getClientRects()
     var rectlist = range.getClientRects();
-    testname = 'range.getClientRects for '+obj.name;
+    testname = (isLTR ? 'isLTR ' : 'isRTL ') +
+      'range.getClientRects for '+obj.name;
     if (!obj.rectList) {
       //rectList is not specified, use obj.rect to figure out rectList
       obj.rectList = obj.rect?[obj.rect]:[];
     }
     if (!obj.rectList.length) {
       isEmptyRectList(rectlist, testname+": ");
     } else {
       is(rectlist.length, obj.rectList.length, testname+' should return '+obj.rectList.length+' rects.');
+      if(!obj.rectList.forEach){
+        //convert RectList to a real array
+        obj.rectList=Array.prototype.slice.call(obj.rectList, 0);
+      }
       obj.rectList.forEach(function(rect,i) {
         is(_getRect(rectlist[i]),_getRect(rect),testname+": item at "+i);
       });
     }
   } finally {
     range.detach();
   }
 }
 /** Test for Bug 396392 **/
-function test() {
+function doTest(){
   var root = document.getElementById('content');
   var firstP = root.firstElementChild, spanInFirstP = firstP.childNodes[1],
     firstDiv = root.childNodes[2], spanInFirstDiv = firstDiv.childNodes[1],
     secondP = root.childNodes[3], spanInSecondP = secondP.childNodes[1];
   var firstPRect = firstP.getBoundingClientRect(),
     spanInFirstPRect = spanInFirstP.getBoundingClientRect(),
     firstDivRect = firstDiv.getBoundingClientRect(),
     spanInFirstDivRect = spanInFirstDiv.getBoundingClientRect(),
     secondPRect = secondP.getBoundingClientRect(),
     spanInSecondPRect = spanInSecondP.getBoundingClientRect();
   var widthPerchar = spanInSecondPRect.width / spanInSecondP.firstChild.length;
   var testcases = [
     {name:'nodesNotInDocument', range:[document.createTextNode('abc'), 1], 
       rect:null},
     {name:'collapsedInBlockNode', range:[firstP, 2], rect:null},
     {name:'collapsedAtBeginningOfTextNode', range:[firstP.firstChild, 0],
-      rect:[firstPRect.left, firstPRect.left, spanInFirstPRect.top, 
+      rect:[spanInFirstPRect.left - 6 * widthPerchar, 
+      spanInFirstPRect.left - 6 * widthPerchar, spanInFirstPRect.top, 
       spanInFirstPRect.bottom, 0, spanInFirstPRect.height]},
     {name:'collapsedWithinTextNode', range:[firstP.firstChild, 1], 
-      rect:[firstPRect.left+widthPerchar, firstPRect.left+widthPerchar,
+      rect:[spanInFirstPRect.left  - 5 * widthPerchar, 
+        spanInFirstPRect.left  - 5 * widthPerchar,
         spanInFirstPRect.top, spanInFirstPRect.bottom, 0, spanInFirstPRect.height]},
     {name:'collapsedAtEndOfTextNode', range:[firstP.firstChild, 6], 
-      rect:[firstPRect.left + 6*widthPerchar, firstPRect.left + 6*widthPerchar,
+      rect:[spanInFirstPRect.left, spanInFirstPRect.left,
         spanInFirstPRect.top, spanInFirstPRect.bottom, 0, spanInFirstPRect.height]},
     {name:'singleBlockNode', range:[root, 1, root, 2], rect:firstPRect},
     {name:'twoBlockNodes', range:[root, 1, root, 3],
       rect:[firstPRect.left, firstPRect.right, firstPRect.top,
         firstDivRect.bottom, firstPRect.width,
         firstDivRect.bottom - firstPRect.top],
       rectList:[firstPRect, firstDivRect]},
     {name:'endOfTextNodeToEndOfAnotherTextNodeInAnotherBlock',
       range:[spanInFirstP.firstChild, 1, firstDiv.firstChild, 5],
-      rect:[firstDivRect.left, firstDivRect.left + 5*widthPerchar,
+      rect:[spanInFirstDivRect.left - 5*widthPerchar, spanInFirstDivRect.left,
         spanInFirstDivRect.top, spanInFirstDivRect.bottom, 5 * widthPerchar, 
         spanInFirstDivRect.height]},
     {name:'startOfTextNodeToStartOfAnotherTextNodeInAnotherBlock', 
       range:[spanInFirstP.firstChild, 0, firstDiv.firstChild, 0],
       rect:[spanInFirstPRect.left, spanInFirstPRect.left + widthPerchar, spanInFirstPRect.top,
         spanInFirstPRect.bottom, widthPerchar, spanInFirstPRect.height]},
     {name:'endPortionOfATextNode', range:[firstP.firstChild, 3, 
         firstP.firstChild, 6],
-      rect:[firstPRect.left + 3*widthPerchar, firstPRect.left + 6*widthPerchar,
+      rect:[spanInFirstPRect.left - 3*widthPerchar, spanInFirstPRect.left,
         spanInFirstPRect.top, spanInFirstPRect.bottom, 3*widthPerchar, spanInFirstPRect.height]},
     {name:'startPortionOfATextNode', range:[firstP.firstChild, 0, 
         firstP.firstChild, 3],
-      rect:[firstPRect.left, firstPRect.left + 3*widthPerchar, spanInFirstPRect.top,
+      rect:[spanInFirstPRect.left - 6*widthPerchar, 
+        spanInFirstPRect.left - 3*widthPerchar, spanInFirstPRect.top,
         spanInFirstPRect.bottom, 3 * widthPerchar, spanInFirstPRect.height]},
     {name:'spanTextNodes', range:[secondP.firstChild, 1, secondP.lastChild, 1],
-      rect:[secondPRect.left + widthPerchar, spanInSecondPRect.right + 
+      rect:[spanInSecondPRect.left - 3*widthPerchar, spanInSecondPRect.right + 
         widthPerchar, spanInSecondPRect.top, spanInSecondPRect.bottom,
         spanInSecondPRect.width + 4*widthPerchar, spanInSecondPRect.height],
-      rectList:[[secondPRect.left + widthPerchar, spanInSecondPRect.left,
+      rectList:[[spanInSecondPRect.left - 3*widthPerchar, spanInSecondPRect.left,
         spanInSecondPRect.top, spanInSecondPRect.bottom, 3 * widthPerchar,
         spanInSecondPRect.height],
 	spanInSecondPRect,
 	[spanInSecondPRect.right, spanInSecondPRect.right + widthPerchar,
           spanInSecondPRect.top, spanInSecondPRect.bottom, widthPerchar,
           spanInSecondPRect.height]]}
   ];
-  testcases.forEach(function(tc) {
-    runATest(tc);
-  });
-  //alert(_getRect(rect));
+  testcases.forEach(runATest);
+}
+function testMixedDir(){
+  var root = document.getElementById('mixeddir');
+  var firstSpan = root.firstElementChild, firstSpanRect=firstSpan.getBoundingClientRect(),
+      firstSpanRectList = firstSpan.getClientRects();
+  runATest({name:'mixeddir',range:[firstSpan.firstChild,0,firstSpan.lastChild,firstSpan.lastChild.length],
+             rect: firstSpanRect, rectList:firstSpanRectList});
+}
+function test(){
+  //test ltr
+  doTest();
+  testMixedDir();
+
+  isLTR = false;
+  var root = document.getElementById('content');
+  root.dir = 'rtl';
+
+  //test rtl
+  doTest();
+  testMixedDir();
 
   SimpleTest.finish();
 }
 
 window.onload = function() {
   SimpleTest.waitForExplicitFinish();
   setTimeout(test, 0);
 };