Basically when getSelection().toString() is called, Chromium may return an serialization on a different content than Firefox. This patch tries to address this webcompat issue by mimicing the same behaviour. We should still address the spec issues, but this seems to be an acceptable compromise. Differential Revision: https://phabricator.services.mozilla.com/D239657
178 lines
5.5 KiB
HTML
178 lines
5.5 KiB
HTML
<!DOCTYPE>
|
|
<html>
|
|
<head>
|
|
<title>selection preventDefault test</title>
|
|
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<script 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;
|
|
-moz-appearance: none;
|
|
}
|
|
</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)
|
|
{
|
|
return SpecialPowers.wrap(aEditorElement).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.includes(aShouldBeIncludedCharacter),
|
|
"The contents of " + aElementName +
|
|
" aren't selected (" + aTestingDescription +
|
|
"): Selected String: \"" + str + "\"");
|
|
} else {
|
|
f(!aSelectedText.includes(aShouldBeIncludedCharacter),
|
|
"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",
|
|
SpecialPowers.getBoolPref("dom.selection.mimic_chrome_tostring.enabled")
|
|
? aInputShouldBeSelected
|
|
: 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>
|