Bug 1653534 - part 5: Fix new intermittent orange of editor/libeditor/crashtests/1424450.html r=m_kato

With the previous patch, 2 bugs become visible.

One is a `MOZ_ASSERT` in
`WhiteSpaceVisibilityKeeper::MakeSureToKeepVisibleStateOfWhiteSpacesAroundDeletingRange()`
is wrong.  When `TextFragmentData::GetReplaceRangeDataAtEndOfDeletionRange()`
returns a replace range, it may set the start to inclusive next character of
end to delete.  So, start of replace range may start after end to delete when
container of end to delete is not a text node and its next editable char point
is an ASCII white-space.  Therefore, this patch rewrite it with
`MOZ_ASSERT_IF` and `EditorDOMPoint::IsInTextNode()`.

The other is `TextFragmentData::GetReplaceRangeDataAtEndOfDeletionRange()`
and `TextFragmentData::GetReplaceRangeDataAtStartOfDeletionRange()` may call
`TextFragmentData::GetFirstASCIIWhiteSpacePointCollapsedTo()` and
`TextFragmentData::GetEndOfCollapsibleASCIIWhiteSpaces()` with a point in
preformatted text node.  Therefore, this patch adds the check into them.

Depends on D84323

Differential Revision: https://phabricator.services.mozilla.com/D84943
This commit is contained in:
Masayuki Nakano 2020-07-27 15:20:31 +00:00
parent 1665d4bfb2
commit 0f69748e1a
3 changed files with 9 additions and 10 deletions

View File

@ -1303,8 +1303,9 @@ nsresult WhiteSpaceVisibilityKeeper::
if (replaceRangeDataAtEnd.IsSet() && !replaceRangeDataAtEnd.Collapsed()) {
MOZ_ASSERT(rangeToDelete.EndRef().EqualsOrIsBefore(
replaceRangeDataAtEnd.EndRef()));
MOZ_ASSERT(replaceRangeDataAtEnd.StartRef().EqualsOrIsBefore(
rangeToDelete.EndRef()));
MOZ_ASSERT_IF(rangeToDelete.EndRef().IsInTextNode(),
replaceRangeDataAtEnd.StartRef().EqualsOrIsBefore(
rangeToDelete.EndRef()));
MOZ_ASSERT(rangeToDelete.StartRef().EqualsOrIsBefore(
replaceRangeDataAtEnd.StartRef()));
if (!replaceRangeDataAtEnd.HasReplaceString()) {
@ -1473,7 +1474,9 @@ WSRunScanner::TextFragmentData::GetReplaceRangeDataAtEndOfDeletionRange(
GetInclusiveNextEditableCharPoint(endToDelete);
if (!nextCharOfStartOfEnd.IsSet() ||
nextCharOfStartOfEnd.IsEndOfContainer() ||
!nextCharOfStartOfEnd.IsCharASCIISpace()) {
!nextCharOfStartOfEnd.IsCharASCIISpace() ||
EditorUtils::IsContentPreformatted(
*nextCharOfStartOfEnd.ContainerAsText())) {
return ReplaceRangeData();
}
if (nextCharOfStartOfEnd.IsStartOfContainer() ||
@ -1553,7 +1556,9 @@ WSRunScanner::TextFragmentData::GetReplaceRangeDataAtStartOfDeletionRange(
GetPreviousEditableCharPoint(startToDelete);
if (!atPreviousCharOfStart.IsSet() ||
atPreviousCharOfStart.IsEndOfContainer() ||
!atPreviousCharOfStart.IsCharASCIISpace()) {
!atPreviousCharOfStart.IsCharASCIISpace() ||
EditorUtils::IsContentPreformatted(
*atPreviousCharOfStart.ContainerAsText())) {
return ReplaceRangeData();
}
if (atPreviousCharOfStart.IsStartOfContainer() ||

View File

@ -364,6 +364,3 @@
[execCommand("delete", false, ""): "      [\]     b" (length of whiteSpace sequence: 11)]
expected: FAIL
[execCommand("delete", false, ""): "<span style=white-space:pre;> </span>&nbsp;[\]&nbsp;&nbsp;&nbsp;a"]
expected: FAIL

View File

@ -412,6 +412,3 @@
[execCommand("forwarddelete", false, ""): "<span><span>abc&nbsp;[\]</span> def</span>"]
expected: FAIL
[execCommand("forwarddelete", false, ""): "<span style=white-space:pre;> </span>[\]&nbsp;&nbsp;&nbsp;&nbsp;a"]
expected: FAIL