DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Mercurial (5350524bb654)

VCS Links

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
<!DOCTYPE>
<html>
<head>
<title>selection preventDefault test</title>
<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" />

<style type="text/css">
  #fixedDiv1 {
    position: fixed;
    right: 0;
    overflow: scroll;
    width: 200px;
    top: 0;
  }
  input {
    font-size: 16px;
    height: 16px;
    width: 80px;
    margin: 0;
    padding: 0;
  }
</style>

</head>
<body>
<input id="input" type="text" value="iiiiiiiii iiiiiiiii iiiiiiiii">
<div id="fixedDiv1" class="testingDiv">
dddddd dddddd dddddd
</div>
<pre id="test">
<script class="testbody" type="text/javascript">

var fixedDiv1 = document.getElementById("fixedDiv1");
var input = document.getElementById("input");

function test()
{
  function getSelectionForEditor(aEditorElement)
  {
    const nsIDOMNSEditableElement =
      SpecialPowers.Ci.nsIDOMNSEditableElement;
    return SpecialPowers.wrap(aEditorElement)
             .QueryInterface(nsIDOMNSEditableElement).editor.selection;
  }

  function clear()
  {
    var sel = window.getSelection();
    if (sel.rangeCount > 0)
      sel.collapseToEnd();
    sel = getSelectionForEditor(input);
    if (sel.rangeCount > 0)
      sel.collapseToEnd();
  }

  const kFalse = 0;
  const kTrue  = 1;
  const kToDo  = 2;

  function check(aFixedDiv1ShouldBeSelected,
                 aInputShouldBeSelected,
                 aTestingDescription)
  {
    function checkCharacter(aSelectedText,
                            aShouldBeIncludedCharacter,
                            aSouldBeSelected,
                            aElementName)
    {
      var boolvalue = aSouldBeSelected & kTrue;
      var f = aSouldBeSelected & kToDo ? todo : ok;
      var str = aSelectedText.replace('\n', '\\n');
      if (boolvalue) {
        f(aSelectedText.indexOf(aShouldBeIncludedCharacter) >= 0,
          "The contents of " + aElementName +
          " aren't selected (" + aTestingDescription +
          "): Selected String: \"" + str + "\"");
      } else {
        f(aSelectedText.indexOf(aShouldBeIncludedCharacter) < 0,
          "The contents of " + aElementName +
          " are selected (" + aTestingDescription +
          "): Selected String: \"" + str + "\"");
      }
    }

    var sel = window.getSelection().toString();
    checkCharacter(sel, "d", aFixedDiv1ShouldBeSelected, "fixedDiv1");

    // input contents must not be included on the parent
    // selection.
    checkCharacter(sel, "i", false, "input (checking on parent)");

    var selInput = getSelectionForEditor(input).toString();
    checkCharacter(selInput, "i", aInputShouldBeSelected, "input");
  }

  function eventHandler(evt) {
    evt.preventDefault();
  }

  // prevent default action on mousedown should prevent selection
  fixedDiv1.addEventListener("mousedown", eventHandler);
  synthesizeMouse(fixedDiv1, 30, 5, { type: "mousedown" });
  synthesizeMouse(fixedDiv1, 40, 5, { type: "mousemove" });
  synthesizeMouse(fixedDiv1, 40, 5, { type: "mouseup" });
  check(kFalse, kFalse, "fixedDiv1-fixedDiv1-mousedown");
  clear();

  input.addEventListener("mousedown", eventHandler);
  synthesizeMouse(input, 20, 5, { type: "mousedown" });
  synthesizeMouse(input, 40, 5, { type: "mousemove" });
  synthesizeMouse(input, 40, 5, { type: "mouseup" });
  check(kFalse, kFalse, "input-input-mousedown");
  clear();

  // clean up mousedown listener
  [fixedDiv1, input].forEach(function(element) {
     element.removeEventListener("mousedown", eventHandler);
  });

  // prevent default action on mouseup should not affect the selection state
  fixedDiv1.addEventListener("mouseup", eventHandler);
  synthesizeMouse(fixedDiv1, 30, 5, { type: "mousedown" });
  synthesizeMouse(fixedDiv1, 40, 5, { type: "mousemove" });
  synthesizeMouse(fixedDiv1, 40, 5, { type: "mouseup" });
  check(kTrue, kFalse, "fixedDiv1-fixedDiv1-mouseup");
  clear();

  input.addEventListener("mouseup", eventHandler);
  synthesizeMouse(input, 20, 5, { type: "mousedown" });
  synthesizeMouse(input, 40, 5, { type: "mousemove" });
  synthesizeMouse(input, 40, 5, { type: "mouseup" });
  check(kFalse, kTrue, "input-input-mouseup");
  clear();

  [fixedDiv1, input].forEach(function(element) {
     element.removeEventListener("mouseup", eventHandler);
  });

  // touchmove event should not affect the selection state
  synthesizeTouch(fixedDiv1, 30, 5, { type: "touchstart" });
  synthesizeTouch(fixedDiv1, 40, 5, { type: "touchmove" });
  check(kFalse, kFalse, "fixedDiv1-fixedDiv1-touchmove");
  synthesizeTouch(fixedDiv1, 40, 5, { type: "touchend" });
  clear();

  synthesizeTouch(input, 20, 5, { type: "touchstart" });
  synthesizeTouch(input, 40, 5, { type: "touchmove" });
  check(kFalse, kFalse, "input-input-touchmove");
  synthesizeTouch(input, 40, 5, { type: "touchend" });
  clear();

  fixedDiv1.addEventListener("touchmove", eventHandler);
  synthesizeTouch(fixedDiv1, 30, 5, { type: "touchstart" });
  synthesizeTouch(fixedDiv1, 40, 5, { type: "touchmove" });
  check(kFalse, kFalse, "fixedDiv1-fixedDiv1-touchmove-preventDefault");
  synthesizeTouch(fixedDiv1, 40, 5, { type: "touchend" });
  clear();

  input.addEventListener("touchmove", eventHandler);
  synthesizeTouch(input, 20, 5, { type: "touchstart" });
  synthesizeTouch(input, 40, 5, { type: "touchmove" });
  check(kFalse, kFalse, "input-input-touchmove-preventDefault");
  synthesizeTouch(input, 40, 5, { type: "touchend" });
  clear();

  SimpleTest.finish();
}
window.onload = function() { setTimeout(test, 0); };
SimpleTest.waitForExplicitFinish();
</script>
</pre>
</body>
</html>