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

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

Issue 2894383003: Split LayoutSelecton::ClearSelection() out from SetSelection() (Closed)
Patch Set: update Created 3 years, 7 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 | « no previous file | 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/LayoutSelection.cpp
diff --git a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp
index 0b628863e698c6c3fa22fe9b1db0b81bcce8e299..ab9d040d453de786c93165cf447605b2fee3319c 100644
--- a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp
+++ b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp
@@ -213,16 +213,8 @@ void LayoutSelection::SetSelection(
LayoutObject* end,
int end_pos,
SelectionPaintInvalidationMode block_paint_invalidation_mode) {
- // This code makes no assumptions as to if the layout tree is up to date or
- // not and will not try to update it. Currently clearSelection calls this
- // (intentionally) without updating the layout tree as it doesn't care.
- // Other callers may want to force recalc style before calling this.
-
- // Make sure both our start and end objects are defined.
- // Check www.msnbc.com and try clicking around to find the case where this
- // happened.
- if ((start && !end) || (end && !start))
- return;
+ DCHECK(start);
+ DCHECK(end);
// Just return if the selection hasn't changed.
if (selection_start_ == start && selection_start_pos_ == start_pos &&
@@ -230,6 +222,7 @@ void LayoutSelection::SetSelection(
return;
DCHECK(frame_selection_->GetDocument().GetLayoutView()->GetFrameView());
+ DCHECK(!frame_selection_->GetDocument().NeedsLayoutTreeUpdate());
SelectedMap old_selected_map =
CollectSelectedMap(selection_start_, selection_end_, selection_end_pos_,
@@ -301,7 +294,31 @@ void LayoutSelection::ClearSelection() {
// invalidations.
DisableCompositingQueryAsserts disabler;
- SetSelection(0, -1, 0, -1, kPaintInvalidationNewMinusOld);
+ // Just return if the selection hasn't changed.
+ if (!selection_start_) {
+ DCHECK_EQ(selection_end_, nullptr);
+ DCHECK_EQ(selection_start_pos_, -1);
+ DCHECK_EQ(selection_end_pos_, -1);
+ return;
+ }
+
+ const SelectedMap& old_selected_map =
+ CollectSelectedMap(selection_start_, selection_end_, selection_end_pos_,
+ kPaintInvalidationNewMinusOld);
+ // Clear SelectionState and invalidation.
+ for (auto layout_object : old_selected_map.object_map.Keys()) {
+ const SelectionState old_state = layout_object->GetSelectionState();
+ layout_object->SetSelectionStateIfNeeded(SelectionNone);
+ if (layout_object->GetSelectionState() == old_state)
+ continue;
+ layout_object->SetShouldInvalidateSelection();
+ }
+
+ // Reset selection start and end.
+ selection_start_ = nullptr;
+ selection_start_pos_ = -1;
+ selection_end_ = nullptr;
+ selection_end_pos_ = -1;
}
void LayoutSelection::Commit() {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698