Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1153)

Unified Diff: third_party/WebKit/Source/core/editing/FrameSelection.cpp

Issue 2221783003: Introduce FrameSelection::nodeChildrenWillBeRemoved() (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 2016-08-10T10:37:48 Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/core/editing/FrameSelection.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/editing/FrameSelection.cpp
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
index e8f172812f75a69e9d83b6ac28354215a087cc0c..6825ae47dbe0931efa47336acb00f389b46e02bf 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -406,6 +406,38 @@ static bool removingNodeRemovesPosition(Node& node, const Position& position)
return element.isShadowIncludingInclusiveAncestorOf(position.anchorNode());
}
+static Position computePositionForChildrenRemoval(const Position& position, ContainerNode& container)
+{
+ Node* node = position.computeContainerNode();
+ if (container.containsIncludingHostElements(*node))
+ return Position::firstPositionInNode(&container);
+ return position;
+}
+
+void FrameSelection::nodeChildrenWillBeRemoved(ContainerNode& container)
+{
+ if (isNone() || !container.inActiveDocument())
+ return;
+ const Position& oldStart = selection().start();
+ const Position& newStart = computePositionForChildrenRemoval(oldStart, container);
+ const Position& oldEnd = selection().end();
+ const Position& newEnd = computePositionForChildrenRemoval(oldEnd, container);
+ const Position& oldBase = selection().base();
+ const Position& newBase = computePositionForChildrenRemoval(oldBase, container);
+ const Position& oldExtent = selection().extent();
+ const Position& newExtent = computePositionForChildrenRemoval(oldExtent, container);
+ if (newStart == oldStart && newEnd == oldEnd && newBase == oldBase && newExtent == oldExtent)
+ return;
+ if (selection().isBaseFirst())
+ m_selectionEditor->setWithoutValidation(newStart, newEnd);
+ else
+ m_selectionEditor->setWithoutValidation(newEnd, newStart);
+ m_frameCaret->setCaretRectNeedsUpdate();
+ if (document().isRunningExecCommand())
+ return;
+ TypingCommand::closeTyping(m_frame);
+}
+
void FrameSelection::nodeWillBeRemoved(Node& node)
{
// There can't be a selection inside a fragment, so if a fragment's node is being removed,
« no previous file with comments | « third_party/WebKit/Source/core/editing/FrameSelection.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698