| Index: Source/core/editing/CompositeEditCommand.cpp
|
| diff --git a/Source/core/editing/CompositeEditCommand.cpp b/Source/core/editing/CompositeEditCommand.cpp
|
| index c95f16a816d187a377d631ee143b0790b6b0d3de..9c1cfe897bcf573bd6a7827804664ced48026bf5 100644
|
| --- a/Source/core/editing/CompositeEditCommand.cpp
|
| +++ b/Source/core/editing/CompositeEditCommand.cpp
|
| @@ -1050,14 +1050,20 @@ void CompositeEditCommand::cleanupAfterDeletion(VisiblePosition destination)
|
| // Note: We want the rightmost candidate.
|
| Position position = caretAfterDelete.deepEquivalent().downstream();
|
| Node* node = position.deprecatedNode();
|
| +
|
| + // Bail if we'd remove an ancestor of our destination.
|
| + if (destinationNode->isDescendantOf(node))
|
| + return;
|
| +
|
| // Normally deletion will leave a br as a placeholder.
|
| - if (node->hasTagName(brTag))
|
| + if (node->hasTagName(brTag)) {
|
| removeNodeAndPruneAncestors(node, destinationNode);
|
| - // If the selection to move was empty and in an empty block that
|
| - // doesn't require a placeholder to prop itself open (like a bordered
|
| - // div or an li), remove it during the move (the list removal code
|
| - // expects this behavior).
|
| - else if (isBlock(node)) {
|
| +
|
| + // If the selection to move was empty and in an empty block that
|
| + // doesn't require a placeholder to prop itself open (like a bordered
|
| + // div or an li), remove it during the move (the list removal code
|
| + // expects this behavior).
|
| + } else if (isBlock(node)) {
|
| // If caret position after deletion and destination position coincides,
|
| // node should not be removed.
|
| if (!position.rendersInDifferentPosition(destination.deepEquivalent())) {
|
|
|