This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch geckoview-102.3.0esr-12.0-1 in repository tor-browser.
commit d902453efafea1b7d63ad3366d8db1c6775f365c Author: Masayuki Nakano masayuki@d-toybox.com AuthorDate: Fri Sep 2 06:29:36 2022 +0000
Bug 1785801 - Make `RangeUpdater::SelAdjJoinNodes` take the ex-offset of right node. r=m_kato, a=RyanVM
In bug 1739524, I misunderstood the meaning of `aOffset` of `SelAdjJoinNodes`.
After joining 2 nodes, and a point points right node which will have ex-left node content, the point needs to point ex-start of the right node to keep next insertion point as-is. Therefore, it's not useful with new join nodes direction, it needs to know the ex-offset of the right node.
This is a backport patch of https://phabricator.services.mozilla.com/D155438 for ESR 102.
Differential Revision: https://phabricator.services.mozilla.com/D156271 --- editor/libeditor/HTMLEditor.cpp | 8 ++++---- editor/libeditor/SelectionState.cpp | 14 +++++++------- editor/libeditor/SelectionState.h | 6 +++--- testing/web-platform/tests/editing/data/inserttext.js | 6 ++++++ 4 files changed, 20 insertions(+), 14 deletions(-)
diff --git a/editor/libeditor/HTMLEditor.cpp b/editor/libeditor/HTMLEditor.cpp index 822203e3c9773..d3a277633e45b 100644 --- a/editor/libeditor/HTMLEditor.cpp +++ b/editor/libeditor/HTMLEditor.cpp @@ -4939,8 +4939,8 @@ nsresult HTMLEditor::DoJoinNodes(nsIContent& aContentToKeep, MOZ_ASSERT(IsEditActionDataAvailable());
const uint32_t removingContentLength = aContentToRemove.Length(); - const Maybe<uint32_t> removingContentIndex = - aContentToRemove.ComputeIndexInParentNode(); + const Maybe<uint32_t> keepingContentExIndex = + aContentToKeep.ComputeIndexInParentNode();
// Remember all selection points. // XXX Do we need to restore all types of selections by ourselves? Normal @@ -5055,11 +5055,11 @@ nsresult HTMLEditor::DoJoinNodes(nsIContent& aContentToKeep, } }
- if (MOZ_LIKELY(removingContentIndex.isSome())) { + if (MOZ_LIKELY(keepingContentExIndex.isSome())) { DebugOnly<nsresult> rvIgnored = RangeUpdaterRef().SelAdjJoinNodes( EditorRawDOMPoint(&aContentToKeep, std::min(removingContentLength, aContentToKeep.Length())), - aContentToRemove, *removingContentIndex, + aContentToRemove, *keepingContentExIndex, JoinNodesDirection::LeftNodeIntoRightNode); NS_WARNING_ASSERTION(NS_SUCCEEDED(rvIgnored), "RangeUpdater::SelAdjJoinNodes() failed, but ignored"); diff --git a/editor/libeditor/SelectionState.cpp b/editor/libeditor/SelectionState.cpp index 42179428422c0..751cd21975381 100644 --- a/editor/libeditor/SelectionState.cpp +++ b/editor/libeditor/SelectionState.cpp @@ -327,7 +327,7 @@ nsresult RangeUpdater::SelAdjSplitNode(nsIContent& aOriginalContent,
nsresult RangeUpdater::SelAdjJoinNodes( const EditorRawDOMPoint& aStartOfRightContent, - const nsIContent& aRemovedContent, uint32_t aOffsetOfRemovedContent, + const nsIContent& aRemovedContent, uint32_t aOffsetOfJoinedContent, JoinNodesDirection aJoinNodesDirection) { MOZ_ASSERT(aStartOfRightContent.IsSetAndValid());
@@ -343,14 +343,14 @@ nsresult RangeUpdater::SelAdjJoinNodes( auto AdjustDOMPoint = [&](nsCOMPtr<nsINode>& aContainer, uint32_t& aOffset) -> void { if (aContainer == aStartOfRightContent.GetContainerParent()) { - // If the point is in common parent of joined content nodes and the - // point is after the removed point, decrease the offset. - if (aOffset > aOffsetOfRemovedContent) { + // If the point is in common parent of joined content nodes and it pointed + // after the right content node, decrease the offset. + if (aOffset > aOffsetOfJoinedContent) { aOffset--; } - // If it pointed the removed content node, move to start of right content - // which was moved from the removed content. - else if (aOffset == aOffsetOfRemovedContent) { + // If it pointed the right content node, adjust it to point ex-first + // content of the right node. + else if (aOffset == aOffsetOfJoinedContent) { aContainer = aStartOfRightContent.GetContainer(); aOffset = aStartOfRightContent.Offset(); } diff --git a/editor/libeditor/SelectionState.h b/editor/libeditor/SelectionState.h index 6d71d70d23b6b..b0ffdb42a10f6 100644 --- a/editor/libeditor/SelectionState.h +++ b/editor/libeditor/SelectionState.h @@ -231,12 +231,12 @@ class MOZ_STACK_CLASS RangeUpdater final { * in aRemovedContent. And this points where * the joined position. * @param aRemovedContent The removed content. - * @param aOffsetOfRemovedContent The offset which aRemovedContent was in - * its ex-parent. + * @param aOffsetOfJoinedContent The offset which the container of + * aStartOfRightContent was in its parent. */ nsresult SelAdjJoinNodes(const EditorRawDOMPoint& aStartOfRightContent, const nsIContent& aRemovedContent, - uint32_t aOffsetOfRemovedContent, + uint32_t aOffsetOfJoinedContent, JoinNodesDirection aJoinNodesDirection); void SelAdjInsertText(const dom::Text& aTextNode, uint32_t aOffset, uint32_t aInsertedLength); diff --git a/testing/web-platform/tests/editing/data/inserttext.js b/testing/web-platform/tests/editing/data/inserttext.js index 59057d03c9136..ca90b9ae9cadc 100644 --- a/testing/web-platform/tests/editing/data/inserttext.js +++ b/testing/web-platform/tests/editing/data/inserttext.js @@ -1374,4 +1374,10 @@ var browserTests = [ "<div style="white-space:pre-wrap">a<br><span style="padding:1px"></span><p>bc</p></div>", [true], {"inserttext":[false,false,"",false,false,""]}], +// https://bugzilla.mozilla.org/show_bug.cgi?id=1785801 +["<div>abc{</div><div>}efg</div>", + [["inserttext", "d"]], + "<div>abcdefg</div>", + [true], + {"inserttext":[false,false,"",false,false,""]}], ]