Files
tubestation/layout/generic/test/test_selection_preventDefault.html
Sean Feng e46b69d89c Bug 85686 - Mimic Chromium's getSelection().toString() behaviour r=masayuki,dom-core,webidl,smaug
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
2025-03-17 13:36:16 +00:00

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>