summaryrefslogtreecommitdiffstats
path: root/editor/libeditor
diff options
context:
space:
mode:
authorGaming4JC <g4jc@hyperbola.info>2020-05-22 11:03:43 -0400
committerwolfbeast <mcwerewolf@wolfbeast.com>2020-06-27 02:20:16 +0200
commit016c55f4094d99cc4aaa2f8ac0f2c22adbf96a5b (patch)
treeba129b831fc14e1d6c82714268acecf8b015133e /editor/libeditor
parent016313d559f71ba0d269e54b6c6e60dbe1e63280 (diff)
downloadUXP-016c55f4094d99cc4aaa2f8ac0f2c22adbf96a5b.tar
UXP-016c55f4094d99cc4aaa2f8ac0f2c22adbf96a5b.tar.gz
UXP-016c55f4094d99cc4aaa2f8ac0f2c22adbf96a5b.tar.lz
UXP-016c55f4094d99cc4aaa2f8ac0f2c22adbf96a5b.tar.xz
UXP-016c55f4094d99cc4aaa2f8ac0f2c22adbf96a5b.zip
Bug 1316302 - Part 2: WillDeleteSelection() should retry to handle it when selection is collapsed and JoinBlocks() doesn't handle nor cancel the action
When selection is collapsed and JoinBlocks() doesn't handle nor cancel the action, WillDeleteSelection() should move selection to the start/end of leftmost/rightmost editable leaf node and retry to handle the action again. For avoiding infinite loop, it checks if selected node is changed actually before calling itself again. Tag #1563
Diffstat (limited to 'editor/libeditor')
-rw-r--r--editor/libeditor/HTMLEditRules.cpp18
1 files changed, 15 insertions, 3 deletions
diff --git a/editor/libeditor/HTMLEditRules.cpp b/editor/libeditor/HTMLEditRules.cpp
index 13411b4f6..156bbc179 100644
--- a/editor/libeditor/HTMLEditRules.cpp
+++ b/editor/libeditor/HTMLEditRules.cpp
@@ -2199,12 +2199,24 @@ HTMLEditRules::WillDeleteSelection(Selection* aSelection,
bool handled = false, canceled = false;
rv = TryToJoinBlocks(*leftNode->AsContent(), *rightNode->AsContent(),
&canceled, &handled);
- // TODO: If it does nothing and previous or next node is a text node,
- // we should modify it.
- *aHandled = true;
+ *aHandled |= handled;
*aCancel |= canceled;
NS_ENSURE_SUCCESS(rv, rv);
}
+
+ // If TryToJoinBlocks() didn't handle it and it's not canceled,
+ // user may want to modify the start leaf node or the last leaf node
+ // of the block.
+ if (!*aHandled && !*aCancel && leafNode != startNode) {
+ int32_t offset =
+ aAction == nsIEditor::ePrevious ?
+ static_cast<int32_t>(leafNode->Length()) : 0;
+ aSelection->Collapse(leafNode, offset);
+ return WillDeleteSelection(aSelection, aAction, aStripWrappers,
+ aCancel, aHandled);
+ }
+
+ // Otherwise, we must have deleted the selection as user expected.
aSelection->Collapse(selPointNode, selPointOffset);
return NS_OK;
}