зеркало из https://github.com/mozilla/gecko-dev.git
176 строки
5.6 KiB
HTML
176 строки
5.6 KiB
HTML
<!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>
|