layout/generic/test/test_selection_expanding.html

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 <!DOCTYPE>
     2 <html>
     3 <head>
     4 <title>selection expanding test</title>
     5 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
     6 <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
     7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
     9 <style type="text/css">
    10   .testingDiv {
    11     font-size: 16px;
    12     width: 300px;
    13     height: 140px;
    14     background-color: white;
    15   }
    16   #fixedDiv1, #fixedDiv2 {
    17     position: fixed;
    18     right: 0;
    19     overflow: scroll;
    20     width: 200px;
    21   }
    22   #fixedDiv1 {
    23     top: 0;
    24   }
    25   #fixedDiv2 {
    26     top: 150px;
    27   }
    28   iframe, input, textarea {
    29     font-size: 16px;
    30     height: 16px;
    31     width: 80px;
    32     margin: 0;
    33     padding: 0;
    34   }
    35   #xbl {
    36     -moz-binding: url(selection_expanding_xbl.xml#binding);
    37   }
    38 </style>
    40 </head>
    41 <body>
    42 <div id="div1" class="testingDiv">
    43   aaaaaaa
    44   <iframe id="iframe" src="data:text/html,<style type='text/css'>*{margin: 0; padding: 0; font-size: 16px;}</style><div>ffffff ffffff ffffff ffffff</div>"></iframe>
    45   aaaaaaa aaaaaaa<br>aaaaaaa aaaaaaa aaaaaaa aaaaaaa<br>aaaaaaa
    46 </div>
    47 <div id="div2" class="testingDiv">
    48   bbbbbbb
    49   <input id="input" type="text" value="iiiiiiiii iiiiiiiii iiiiiiiii">
    50   bbbbbbb bbbbbbb<br>bbbbbbb bbbbbbb bbbbbbb<br>bbbbbbb
    51 </div>
    52 <div id="div3" class="testingDiv">
    53   ccccccc
    54   <textarea id="textarea">tttttt tttttt tttttt</textarea>
    55   ccccccc ccccccc<br>ccccccc ccccccc ccccccc ccccccc<br>ccccccc
    56   <div id="fixedDiv1" class="testingDiv">
    57     dddddd dddddd dddddd
    58   </div>
    59 </div>
    60 <div id="xbl">
    61   <p id="xbl_child">yyyyyyy yyyyyyy yyyyyyy</p>
    62 </div>
    63 <div id="fixedDiv2" class="testingDiv">
    64   eeeeee eeeeee eeeeee
    65 </div>
    66 <pre id="test">
    67 <script class="testbody" type="text/javascript">
    69 var div1 = document.getElementById("div1");
    70 var div2 = document.getElementById("div2");
    71 var div3 = document.getElementById("div3");
    72 var xbl = document.getElementById("xbl");
    73 var xbl_child = document.getElementById("xbl_child");
    74 var fixedDiv1 = document.getElementById("fixedDiv1");
    75 var fixedDiv2 = document.getElementById("fixedDiv2");
    76 var iframe = document.getElementById("iframe");
    77 var input = document.getElementById("input");
    78 var textarea = SpecialPowers.wrap(document.getElementById("textarea"));
    80 function test()
    81 {
    82   function getSelectionForEditor(aEditorElement)
    83   {
    84     const nsIDOMNSEditableElement = SpecialPowers.Ci.nsIDOMNSEditableElement;
    85     return SpecialPowers.wrap(aEditorElement).editor.selection;
    86   }
    88   function clear()
    89   {
    90     synthesizeMouse(div1, 10, 5, { type: "mouseup" });
    91     var sel = window.getSelection();
    92     if (sel.rangeCount > 0)
    93       sel.collapseToEnd();
    94     sel = iframe.contentWindow.getSelection();
    95     if (sel.rangeCount > 0)
    96       sel.collapseToEnd();
    97     sel = getSelectionForEditor(input);
    98     if (sel.rangeCount > 0)
    99       sel.collapseToEnd();
   100     sel = getSelectionForEditor(textarea);
   101     if (sel.rangeCount > 0)
   102       sel.collapseToEnd();
   104     div1.scrollTop = 0;
   105     div1.scrollLeft = 0;
   106     div2.scrollTop = 0;
   107     div2.scrollLeft = 0;
   108     div3.scrollTop = 0;
   109     div3.scrollLeft = 0;
   110   }
   112   const kFalse = 0;
   113   const kTrue  = 1;
   114   const kToDo  = 2;
   116   function check(aDiv1ShouldBeSelected,
   117                  aDiv2ShouldBeSelected,
   118                  aDiv3ShouldBeSelected,
   119                  aFixedDiv1ShouldBeSelected,
   120                  aXBLChildShouldBeSelected,
   121                  aFixedDiv2ShouldBeSelected,
   122                  aIFrameShouldBeSelected,
   123                  aInputShouldBeSelected,
   124                  aTextareaShouldBeSelected,
   125                  aTestingDescription)
   126   {
   127     function checkCharacter(aSelectedText,
   128                             aShouldBeIncludedCharacter,
   129                             aSouldBeSelected,
   130                             aElementName)
   131     {
   132       var boolvalue = aSouldBeSelected & kTrue;
   133       var f = aSouldBeSelected & kToDo ? todo : ok;
   134       var str = aSelectedText.replace('\n', '\\n');
   135       if (boolvalue) {
   136         f(aSelectedText.indexOf(aShouldBeIncludedCharacter) >= 0,
   137           "The contents of " + aElementName +
   138           " aren't selected (" + aTestingDescription +
   139           "): Selected String: \"" + str + "\"");
   140       } else {
   141         f(aSelectedText.indexOf(aShouldBeIncludedCharacter) < 0,
   142           "The contents of " + aElementName +
   143           " are selected (" + aTestingDescription +
   144           "): Selected String: \"" + str + "\"");
   145       }
   146     }
   148     var sel = window.getSelection().toString();
   149     checkCharacter(sel, "a", aDiv1ShouldBeSelected, "div1");
   150     checkCharacter(sel, "b", aDiv2ShouldBeSelected, "div2");
   151     checkCharacter(sel, "c", aDiv3ShouldBeSelected, "div3");
   152     checkCharacter(sel, "y", aXBLChildShouldBeSelected, "xbl_child");
   153     checkCharacter(sel, "d", aFixedDiv1ShouldBeSelected, "fixedDiv1");
   154     checkCharacter(sel, "e", aFixedDiv2ShouldBeSelected, "fixedDiv2");
   156     // iframe/input/xbl-bound contents must not be included on the parent
   157     // selection.
   158     checkCharacter(sel, "f", false, "iframe (checking on parent)");
   159     checkCharacter(sel, "i", false, "input (checking on parent)");
   160     checkCharacter(sel, "x", false, "XBL bound contents (checking on parent)");
   162     var selInIFrame = iframe.contentWindow.getSelection().toString();
   163     checkCharacter(selInIFrame, "f", aIFrameShouldBeSelected, "iframe");
   165     var selInput = getSelectionForEditor(input).toString();
   166     checkCharacter(selInput, "i", aInputShouldBeSelected, "input");
   167     var selTextarea = getSelectionForEditor(textarea).toString();
   168     checkCharacter(selTextarea, "t", aTextareaShouldBeSelected, "textarea");
   169   }
   171   // ***********************************************************
   172   // Set all divs to overflow: auto;
   173   const kOverflows = ["visible", "hidden", "scroll", "auto"];
   174   for (var i = 0; i < kOverflows.length; i++) {
   175     div1.style.overflow = kOverflows[i];
   176     div2.style.overflow = kOverflows[i];
   177     div3.style.overflow = kOverflows[i];
   179     // ***********************************************************
   180     // selection starting at div1
   181     synthesizeMouse(div1, 30, 5, { type: "mousedown" });
   183     // XXX if we move the mouse cursor to another document, the
   184     // nsFrameSelection::HandleDrag method is called on the another document's.
   186     // to iframe
   187     synthesizeMouse(iframe, 30, 5, { type: "mousemove" });
   188     check(kTrue | kToDo, kFalse, kFalse,
   189           kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   190           "div1-iframe, all boxes are overflow: " + kOverflows[i] + ";");
   192     // XXX if the overflow is visible, synthesizeMouse with the input element
   193     // or textarea element doesn't work fine.
   194     var isVisibleTesting = kOverflows[i] == "visible";
   195     var todoFlag = isVisibleTesting ? kToDo : 0;
   196     // to input
   197     synthesizeMouse(input, 30, 5, { type: "mousemove" });
   198     check(kTrue | todoFlag, kTrue | todoFlag, kFalse,
   199           kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   200          "div1-input, all boxes are overflow: " + kOverflows[i] + ";");
   202     // to textarea
   203     synthesizeMouse(textarea, 30, 5, { type: "mousemove" });
   204     check(kTrue | todoFlag, kTrue | todoFlag, kTrue | todoFlag,
   205           kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   206           "div1-textarea, all boxes are overflow: " + kOverflows[i] + ";");
   208     // to div2
   209     synthesizeMouse(div2, 30, 5, { type: "mousemove" });
   210     check(kTrue, kTrue, kFalse,
   211           kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   212           "div1-div2, all boxes are overflow: " + kOverflows[i] + ";");
   214     // to div3
   215     synthesizeMouse(div3, 30, 5, { type: "mousemove" });
   216     check(kTrue, kTrue, kTrue,
   217           kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   218           "div1-div3, all boxes are overflow: " + kOverflows[i] + ";");
   220     // to fixedDiv1 (child of div3)
   221     synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
   222     check(kTrue, kTrue, kTrue,
   223           kTrue, kFalse, kFalse, kFalse, kFalse, kFalse,
   224           "div1-fixedDiv1, all boxes are overflow: " + kOverflows[i] + ";");
   226     // to xbl_child
   227     synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   228     check(kTrue, kTrue, kTrue,
   229           kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
   230           "div1-xbl_child, all boxes are overflow: " + kOverflows[i] + ";");
   232     // to fixedDiv2 (sibling of div*)
   233     synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
   234     check(kTrue, kTrue, kTrue,
   235           kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   236           "div1-fixedDiv2, all boxes are overflow: " + kOverflows[i] + ";");
   238     clear();
   240     // ***********************************************************
   241     // selection starting at fixedDiv1
   242     synthesizeMouse(fixedDiv1, 30, 5, { type: "mousedown" });
   244     // to xbl_child
   245     synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   246     check(kFalse, kFalse, kFalse,
   247           kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
   248           "fixedDiv1-xbl_child, all boxes are overflow: " + kOverflows[i] + ";");
   250     // to fixedDiv2
   251     synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
   252     check(kFalse, kFalse, kFalse,
   253           kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   254           "fixedDiv1-fixedDiv2, all boxes are overflow: " + kOverflows[i] + ";");
   256     clear();
   258     // ***********************************************************
   259     // selection starting at fixedDiv2
   260     synthesizeMouse(fixedDiv2, 30, 5, { type: "mousedown" });
   262     // to xbl_child
   263     synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   264     check(kFalse, kFalse, kFalse,
   265           kFalse, kTrue, kTrue, kFalse, kFalse, kFalse,
   266           "fixedDiv2-xbl_child, all boxes are overflow: " + kOverflows[i] + ";");
   268     // to fixedDiv1
   269     synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
   270     check(kFalse, kFalse, kFalse,
   271           kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   272           "fixedDiv2-fixedDiv1, all boxes are overflow: " + kOverflows[i] + ";");
   274     clear();
   276     // ***********************************************************
   277     div2.style.overflow = "visible";
   279     // ***********************************************************
   280     // selection starting at div2
   281     synthesizeMouse(div2, 30, 5, { type: "mousedown" });
   283     // to div3
   284     synthesizeMouse(div3, 30, 5, { type: "mousemove" });
   285     check(kFalse, kTrue, kTrue,
   286           kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   287           "div2-div3, div3 is overflow: " + kOverflows[i] +
   288           ";, but div2 is overflow: visible;");
   290     // to fixedDiv1 (child of div3)
   291     synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
   292     check(kFalse, kTrue, kTrue,
   293           kTrue, kFalse, kFalse, kFalse, kFalse, kFalse,
   294           "div2-fixedDiv1, div3 is overflow: " + kOverflows[i] +
   295           ";, but div2 is overflow: visible;");
   297     // to xbl_child
   298     synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   299     check(kFalse, kTrue, kTrue,
   300           kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
   301           "div2-xbl_child, div3 is overflow: " + kOverflows[i] +
   302           ";, but div2 is overflow: visible;");
   304     // to fixedDiv2 (sibling of div*)
   305     synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
   306     check(kFalse, kTrue, kTrue,
   307           kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   308           "div2-fixedDiv2, div3 is overflow: " + kOverflows[i] +
   309           ";, but div2 is overflow: visible;");
   311     clear();
   313     // ***********************************************************
   314     // selection starting at div3
   315     synthesizeMouse(div3, 30, 5, { type: "mousedown" });
   317     // to div2
   318     synthesizeMouse(div2, 30, 5, { type: "mousemove" });
   319     check(kFalse, kTrue, kTrue,
   320           kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   321           "div3-div2, div3 is overflow: " + kOverflows[i] +
   322           ";, but div2 is overflow: visible;");
   324     // to fixedDiv1 (child of div3)
   325     synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
   326     check(kFalse, kFalse, kTrue,
   327           kTrue, kFalse, kFalse, kFalse, kFalse, kFalse,
   328           "div3-fixedDiv1, div3 is overflow: " + kOverflows[i] +
   329           ";, but div2 is overflow: visible;");
   331     // to xbl_child
   332     synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   333     check(kFalse, kFalse, kTrue,
   334           kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
   335           "div3-xbl_child, div3 is overflow: " + kOverflows[i] +
   336           ";, but div2 is overflow: visible;");
   338     // to fixedDiv2 (sibling of div*)
   339     synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
   340     check(kFalse, kFalse, kTrue,
   341           kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   342           "div3-fixedDiv2, div3 is overflow: " + kOverflows[i] +
   343           ";, but div2 is overflow: visible;");
   345     clear();
   346   }
   348   // ***********************************************************
   349   // selection starting at iframe
   350   synthesizeMouse(iframe, 30, 5, { type: "mousedown" });
   352   // inside iframe
   353   synthesizeMouse(iframe, 50, 5, { type: "mousemove" });
   354   check(kFalse, kFalse, kFalse,
   355         kFalse, kFalse, kFalse, kTrue, kFalse, kFalse,
   356         "iframe-iframe");
   358   // to div2
   359   synthesizeMouse(div2, 30, 5, { type: "mousemove" });
   360   check(kFalse, kFalse, kFalse,
   361         kFalse, kFalse, kFalse, kTrue, kFalse, kFalse,
   362         "iframe-div2");
   364   clear();
   366   // ***********************************************************
   367   // selection starting at input
   368   synthesizeMouse(input, 20, 5, { type: "mousedown" });
   370   // inside input
   371   synthesizeMouse(input, 40, 5, { type: "mousemove" });
   372   check(kFalse, kFalse, kFalse,
   373         kFalse, kFalse, kFalse, kFalse, kTrue, kFalse,
   374         "input-input");
   376   // to div3
   377   synthesizeMouse(div3, 30, 5, { type: "mousemove" });
   378   check(kFalse, kFalse, kFalse,
   379         kFalse, kFalse, kFalse, kFalse, kTrue, kFalse,
   380         "input-div3");
   382   clear();
   384   // ***********************************************************
   385   // selection starting at textarea
   386   synthesizeMouse(textarea, 30, 5, { type: "mousedown" });
   388   // inside textarea
   389   synthesizeMouse(textarea, 50, 5, { type: "mousemove" });
   390   check(kFalse, kFalse, kFalse,
   391         kFalse, kFalse, kFalse, kFalse, kFalse, kTrue,
   392         "textarea-textarea");
   394   // to div2
   395   synthesizeMouse(div2, 30, 5, { type: "mousemove" });
   396   check(kFalse, kFalse, kFalse,
   397         kFalse, kFalse, kFalse, kFalse, kFalse, kTrue,
   398         "textarea-div2");
   400   clear();
   402   SimpleTest.finish();
   403 }
   404 window.onload = function() { setTimeout(test, 0); };
   405 SimpleTest.waitForExplicitFinish();
   406 </script>
   407 </pre>
   408 </body>
   409 </html>

mercurial