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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights 3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights
4 * reserved. 4 * reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version. 9 * version 2 of the License, or (at your option) any later version.
10 * 10 *
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 runner->SetSelectionStateIfNeeded(SelectionInside); 206 runner->SetSelectionStateIfNeeded(SelectionInside);
207 } 207 }
208 } 208 }
209 209
210 void LayoutSelection::SetSelection( 210 void LayoutSelection::SetSelection(
211 LayoutObject* start, 211 LayoutObject* start,
212 int start_pos, 212 int start_pos,
213 LayoutObject* end, 213 LayoutObject* end,
214 int end_pos, 214 int end_pos,
215 SelectionPaintInvalidationMode block_paint_invalidation_mode) { 215 SelectionPaintInvalidationMode block_paint_invalidation_mode) {
216 // This code makes no assumptions as to if the layout tree is up to date or 216 DCHECK(start);
217 // not and will not try to update it. Currently clearSelection calls this 217 DCHECK(end);
218 // (intentionally) without updating the layout tree as it doesn't care.
219 // Other callers may want to force recalc style before calling this.
220
221 // Make sure both our start and end objects are defined.
222 // Check www.msnbc.com and try clicking around to find the case where this
223 // happened.
224 if ((start && !end) || (end && !start))
225 return;
226 218
227 // Just return if the selection hasn't changed. 219 // Just return if the selection hasn't changed.
228 if (selection_start_ == start && selection_start_pos_ == start_pos && 220 if (selection_start_ == start && selection_start_pos_ == start_pos &&
229 selection_end_ == end && selection_end_pos_ == end_pos) 221 selection_end_ == end && selection_end_pos_ == end_pos)
230 return; 222 return;
231 223
232 DCHECK(frame_selection_->GetDocument().GetLayoutView()->GetFrameView()); 224 DCHECK(frame_selection_->GetDocument().GetLayoutView()->GetFrameView());
225 DCHECK(!frame_selection_->GetDocument().NeedsLayoutTreeUpdate());
233 226
234 SelectedMap old_selected_map = 227 SelectedMap old_selected_map =
235 CollectSelectedMap(selection_start_, selection_end_, selection_end_pos_, 228 CollectSelectedMap(selection_start_, selection_end_, selection_end_pos_,
236 block_paint_invalidation_mode); 229 block_paint_invalidation_mode);
237 230
238 // Now clear the selection. 231 // Now clear the selection.
239 for (auto layout_object : old_selected_map.object_map.Keys()) 232 for (auto layout_object : old_selected_map.object_map.Keys())
240 layout_object->SetSelectionStateIfNeeded(SelectionNone); 233 layout_object->SetSelectionStateIfNeeded(SelectionNone);
241 234
242 SetSelectionState(start, end, end_pos); 235 SetSelectionState(start, end, end_pos);
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 Commit(); 287 Commit();
295 return std::make_pair(selection_start_pos_, selection_end_pos_); 288 return std::make_pair(selection_start_pos_, selection_end_pos_);
296 } 289 }
297 290
298 void LayoutSelection::ClearSelection() { 291 void LayoutSelection::ClearSelection() {
299 // For querying Layer::compositingState() 292 // For querying Layer::compositingState()
300 // This is correct, since destroying layout objects needs to cause eager paint 293 // This is correct, since destroying layout objects needs to cause eager paint
301 // invalidations. 294 // invalidations.
302 DisableCompositingQueryAsserts disabler; 295 DisableCompositingQueryAsserts disabler;
303 296
304 SetSelection(0, -1, 0, -1, kPaintInvalidationNewMinusOld); 297 // Just return if the selection hasn't changed.
298 if (!selection_start_) {
299 DCHECK_EQ(selection_end_, nullptr);
300 DCHECK_EQ(selection_start_pos_, -1);
301 DCHECK_EQ(selection_end_pos_, -1);
302 return;
303 }
304
305 const SelectedMap& old_selected_map =
306 CollectSelectedMap(selection_start_, selection_end_, selection_end_pos_,
307 kPaintInvalidationNewMinusOld);
308 // Clear SelectionState and invalidation.
309 for (auto layout_object : old_selected_map.object_map.Keys()) {
310 const SelectionState old_state = layout_object->GetSelectionState();
311 layout_object->SetSelectionStateIfNeeded(SelectionNone);
312 if (layout_object->GetSelectionState() == old_state)
313 continue;
314 layout_object->SetShouldInvalidateSelection();
315 }
316
317 // Reset selection start and end.
318 selection_start_ = nullptr;
319 selection_start_pos_ = -1;
320 selection_end_ = nullptr;
321 selection_end_pos_ = -1;
305 } 322 }
306 323
307 void LayoutSelection::Commit() { 324 void LayoutSelection::Commit() {
308 if (!HasPendingSelection()) 325 if (!HasPendingSelection())
309 return; 326 return;
310 has_pending_selection_ = false; 327 has_pending_selection_ = false;
311 328
312 const VisibleSelectionInFlatTree& original_selection = 329 const VisibleSelectionInFlatTree& original_selection =
313 frame_selection_->ComputeVisibleSelectionInFlatTree(); 330 frame_selection_->ComputeVisibleSelectionInFlatTree();
314 331
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 438
422 o->SetShouldInvalidateSelection(); 439 o->SetShouldInvalidateSelection();
423 } 440 }
424 } 441 }
425 442
426 DEFINE_TRACE(LayoutSelection) { 443 DEFINE_TRACE(LayoutSelection) {
427 visitor->Trace(frame_selection_); 444 visitor->Trace(frame_selection_);
428 } 445 }
429 446
430 } // namespace blink 447 } // namespace blink
OLDNEW
« 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