Bug 1568996 - Flush layout before calling nsFrameSelection::MoveCaret. r=masayuki

Differential Revision: https://phabricator.services.mozilla.com/D47532

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Makoto Kato 2019-10-07 08:18:33 +00:00
parent a37f19c3da
commit be2e7568aa
3 changed files with 79 additions and 0 deletions

View File

@ -525,6 +525,17 @@ nsresult TextEditor::DeleteSelectionAsAction(EDirection aDirection,
"operation "
"unless mutation event listener nests some operations");
// Although ExtendSelectionForDelete will use nsFrameSelection, if it
// still has dirty frame, nsFrameSelection doesn't extend selection
// since we block script.
RefPtr<PresShell> presShell = GetPresShell();
if (presShell) {
presShell->FlushPendingNotifications(FlushType::Layout);
if (NS_WARN_IF(Destroyed())) {
return NS_ERROR_EDITOR_DESTROYED;
}
}
EditAction editAction = EditAction::eDeleteSelection;
switch (aDirection) {
case nsIEditor::ePrevious:

View File

@ -261,6 +261,7 @@ skip-if = toolkit == 'android' # bug 1315898
[test_bug1497480.html]
skip-if = toolkit == 'android'
[test_bug1543312.html]
[test_bug1568996.html]
[test_bug1574596.html]
skip-if = os == "android" #Bug 1575739
[test_bug1581337.html]

View File

@ -0,0 +1,67 @@
<!DOCTYPE html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=1568996
-->
<html>
<head>
<title>Test for Bug 1568996</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" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1568996">Bug 1568996</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test"></pre>
<input id="input1">
<script>
add_task(async () => {
await new Promise((resolve) => {
SimpleTest.waitForFocus(() => {
SimpleTest.executeSoon(resolve);
}, window);
});
let input1 = document.getElementById("input1");
input1.value = "hello"
input1.focus();
input1.setSelectionRange(0, 0);
input1.addEventListener('keydown', () => {
let s = input1.selectionStart;
let e = input1.selectionEnd;
input1.value = input1.value.toUpperCase();
input1.setSelectionRange(s, e);
});
input1.addEventListener('input', () => {
let s = input1.selectionStart;
let e = input1.selectionEnd;
input1.value = input1.value.toLowerCase();
input1.setSelectionRange(s, e);
});
synthesizeKey('1');
synthesizeKey('KEY_Delete');
is(input1.value, "1ello", "Delete key should be worked");
synthesizeKey('B');
synthesizeKey('KEY_Delete');
synthesizeKey('KEY_Delete');
is(input1.value, "1blo", "Multiple delete key should be worked");
synthesizeKey('KEY_ArrowRight');
synthesizeKey('2');
synthesizeKey('KEY_Delete');
is(input1.value, "1bl2", "Delete key should be worked");
synthesizeKey('3');
is(input1.value, "1bl23", "charcter should be inserted");
synthesizeKey('KEY_Backspace');
is(input1.value, "1bl2", "Backspace key should be worked");
});
</script>
</body>
</html>