From cc436269129f9ff77842addf8ec010d1da2248cc Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Wed, 15 Feb 2023 23:00:12 +0000 Subject: [PATCH] Bug 1810902 - Make `HTMLEditUtils::GetRangeSelectingAllContentInAllListItems` return correct range r=m_kato `AutoDeleteRangesHandler::Run` shrink the range not to delete list item if the list is not empty. However, due to the bug of `HTMLEditUtils::GetRangeSelectingAllContentInAllListItems`, it may get empty range (in the testcase, first the only `
  • ` element is the list has empty text node as first child, and the range is collapsed into it). Therefore, `AutoDeleteRangesHandler::Run` gives up to delete the list items, but does not update the `Selection`. Therefore, from the caller point of view, `Selection` is unexpectedly not collapsed even after deleting `Selection`. Therefore, this patch also makes `AutoDeleteRangeHandler::Run` collapse `Selection` if it gives up to delete something. Differential Revision: https://phabricator.services.mozilla.com/D169044 --- editor/libeditor/HTMLEditUtils.h | 13 ++------ editor/libeditor/HTMLEditorDeleteHandler.cpp | 8 +++++ ...place-root-list-element-in-designMode.html | 33 +++++++++++++++++++ .../web-platform/tests/editing/data/delete.js | 7 ++++ .../tests/editing/data/forwarddelete.js | 7 ++++ 5 files changed, 57 insertions(+), 11 deletions(-) create mode 100644 testing/web-platform/tests/editing/crashtests/inserthtml-to-replace-root-list-element-in-designMode.html diff --git a/editor/libeditor/HTMLEditUtils.h b/editor/libeditor/HTMLEditUtils.h index dbdce02ecef1..f02c67b4c418 100644 --- a/editor/libeditor/HTMLEditUtils.h +++ b/editor/libeditor/HTMLEditUtils.h @@ -1457,17 +1457,8 @@ class HTMLEditUtils final { return EditorDOMRangeType(); } return EditorDOMRangeType( - typename EditorDOMRangeType::PointType( - firstListItem->GetFirstChild() && - firstListItem->GetFirstChild()->IsText() - ? firstListItem->GetFirstChild() - : static_cast(firstListItem), - 0u), - EditorDOMRangeType::PointType::AtEndOf( - lastListItem->GetLastChild() && - lastListItem->GetLastChild()->IsText() - ? *lastListItem->GetFirstChild() - : static_cast(*lastListItem))); + typename EditorDOMRangeType::PointType(firstListItem, 0u), + EditorDOMRangeType::PointType::AtEndOf(*lastListItem)); } /** diff --git a/editor/libeditor/HTMLEditorDeleteHandler.cpp b/editor/libeditor/HTMLEditorDeleteHandler.cpp index 2ead3acc01a6..784570808432 100644 --- a/editor/libeditor/HTMLEditorDeleteHandler.cpp +++ b/editor/libeditor/HTMLEditorDeleteHandler.cpp @@ -3372,6 +3372,14 @@ HTMLEditor::AutoDeleteRangesHandler::HandleDeleteNonCollapsedRanges( } if (NS_WARN_IF(aRangesToDelete.FirstRangeRef()->Collapsed())) { // Hmm, there is nothing to delete...? + // In this case, the callers want collapsed selection. Therefore, we need + // to change the `Selection` here. + nsresult rv = aHTMLEditor.CollapseSelectionTo( + aRangesToDelete.GetFirstRangeStartPoint()); + if (NS_FAILED(rv)) { + NS_WARNING("EditorBase::CollapseSelectionTo() failed"); + return Err(rv); + } return EditActionResult::HandledResult(); } MOZ_ASSERT(aRangesToDelete.IsFirstRangeEditable(aEditingHost)); diff --git a/testing/web-platform/tests/editing/crashtests/inserthtml-to-replace-root-list-element-in-designMode.html b/testing/web-platform/tests/editing/crashtests/inserthtml-to-replace-root-list-element-in-designMode.html new file mode 100644 index 000000000000..c751a5bebcdf --- /dev/null +++ b/testing/web-platform/tests/editing/crashtests/inserthtml-to-replace-root-list-element-in-designMode.html @@ -0,0 +1,33 @@ + + + + + + + + + + + +
    +

    + +

    + + diff --git a/testing/web-platform/tests/editing/data/delete.js b/testing/web-platform/tests/editing/data/delete.js index bbd95e56a260..7e63c518c793 100644 --- a/testing/web-platform/tests/editing/data/delete.js +++ b/testing/web-platform/tests/editing/data/delete.js @@ -3012,4 +3012,11 @@ var browserTests = [ "
      \n
    1. {}
    "], [true], {}], + +// Select all list item children when list items have multiple nodes. +["{
    • abcdefghi
    • jklopqrst
    }", + [["delete",""]], + "
    • {}
    ", + [true], + {}], ] diff --git a/testing/web-platform/tests/editing/data/forwarddelete.js b/testing/web-platform/tests/editing/data/forwarddelete.js index 7c1218276b22..661b62adb8d1 100644 --- a/testing/web-platform/tests/editing/data/forwarddelete.js +++ b/testing/web-platform/tests/editing/data/forwarddelete.js @@ -2892,4 +2892,11 @@ var browserTests = [ "
      \n
    1. {}
    "], [true], {}], + +// Select all list item children when list items have multiple nodes. +["{
    • abcdefghi
    • jklopqrst
    }", + [["delete",""]], + "
    • {}
    ", + [true], + {}], ]