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

Side by Side Diff: third_party/WebKit/Source/core/editing/LayoutSelection.cpp

Issue 2936963003: Use SelectionPaintRange::Iterator in LayoutSelection::ClearSelection(). (Closed)
Patch Set: Created 3 years, 6 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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 SelectedMap() = default; 179 SelectedMap() = default;
180 SelectedMap(SelectedMap&& other) { 180 SelectedMap(SelectedMap&& other) {
181 object_map = std::move(other.object_map); 181 object_map = std::move(other.object_map);
182 block_map = std::move(other.block_map); 182 block_map = std::move(other.block_map);
183 } 183 }
184 184
185 private: 185 private:
186 DISALLOW_COPY_AND_ASSIGN(SelectedMap); 186 DISALLOW_COPY_AND_ASSIGN(SelectedMap);
187 }; 187 };
188 188
189 enum class CollectSelectedMapOption { 189 static SelectedMap CollectSelectedMap(const SelectionPaintRange& range) {
190 kCollectBlock,
191 kNotCollectBlock,
192 };
193
194 static SelectedMap CollectSelectedMap(const SelectionPaintRange& range,
195 CollectSelectedMapOption option) {
196 if (range.IsNull()) 190 if (range.IsNull())
197 return SelectedMap(); 191 return SelectedMap();
198 192
199 SelectedMap selected_map; 193 SelectedMap selected_map;
200 194
201 for (LayoutObject* runner : range) { 195 for (LayoutObject* runner : range) {
202 if (runner->GetSelectionState() == SelectionState::kNone) 196 if (runner->GetSelectionState() == SelectionState::kNone)
203 continue; 197 continue;
204 198
205 // Blocks are responsible for painting line gaps and margin gaps. They 199 // Blocks are responsible for painting line gaps and margin gaps. They
206 // must be examined as well. 200 // must be examined as well.
207 selected_map.object_map.Set(runner, runner->GetSelectionState()); 201 selected_map.object_map.Set(runner, runner->GetSelectionState());
208 if (option == CollectSelectedMapOption::kCollectBlock) { 202
209 LayoutBlock* containing_block = runner->ContainingBlock(); 203 for (LayoutBlock* containing_block = runner->ContainingBlock();
210 while (containing_block && !containing_block->IsLayoutView()) { 204 containing_block && !containing_block->IsLayoutView();
211 SelectedBlockMap::AddResult result = selected_map.block_map.insert( 205 containing_block = containing_block->ContainingBlock()) {
212 containing_block, containing_block->GetSelectionState()); 206 SelectedBlockMap::AddResult result = selected_map.block_map.insert(
213 if (!result.is_new_entry) 207 containing_block, containing_block->GetSelectionState());
214 break; 208 if (!result.is_new_entry)
215 containing_block = containing_block->ContainingBlock(); 209 break;
216 }
217 } 210 }
218 } 211 }
219 return selected_map; 212 return selected_map;
220 } 213 }
221 214
222 // Update the selection status of all LayoutObjects between |start| and |end|. 215 // Update the selection status of all LayoutObjects between |start| and |end|.
223 static void SetSelectionState(const SelectionPaintRange& range) { 216 static void SetSelectionState(const SelectionPaintRange& range) {
224 if (range.IsNull()) 217 if (range.IsNull())
225 return; 218 return;
226 219
(...skipping 10 matching lines...) Expand all
237 if (runner != range.StartLayoutObject() && 230 if (runner != range.StartLayoutObject() &&
238 runner != range.EndLayoutObject() && runner->CanBeSelectionLeaf()) 231 runner != range.EndLayoutObject() && runner->CanBeSelectionLeaf())
239 runner->SetSelectionStateIfNeeded(SelectionState::kInside); 232 runner->SetSelectionStateIfNeeded(SelectionState::kInside);
240 } 233 }
241 } 234 }
242 235
243 // Set SetSelectionState and ShouldInvalidateSelection flag of LayoutObjects 236 // Set SetSelectionState and ShouldInvalidateSelection flag of LayoutObjects
244 // comparing them in |new_range| and |old_range|. 237 // comparing them in |new_range| and |old_range|.
245 static void UpdateLayoutObjectState(const SelectionPaintRange& new_range, 238 static void UpdateLayoutObjectState(const SelectionPaintRange& new_range,
246 const SelectionPaintRange& old_range) { 239 const SelectionPaintRange& old_range) {
247 SelectedMap old_selected_map = 240 SelectedMap old_selected_map = CollectSelectedMap(old_range);
yosin_UTC9 2017/06/14 04:01:15 nit: s/SelectedMap/const SelectedMap&/
248 CollectSelectedMap(old_range, CollectSelectedMapOption::kCollectBlock);
249 241
250 // Now clear the selection. 242 // Now clear the selection.
251 for (auto layout_object : old_selected_map.object_map.Keys()) 243 for (auto layout_object : old_selected_map.object_map.Keys())
252 layout_object->SetSelectionStateIfNeeded(SelectionState::kNone); 244 layout_object->SetSelectionStateIfNeeded(SelectionState::kNone);
253 245
254 SetSelectionState(new_range); 246 SetSelectionState(new_range);
255 247
256 // Now that the selection state has been updated for the new objects, walk 248 // Now that the selection state has been updated for the new objects, walk
257 // them again and put them in the new objects list. 249 // them again and put them in the new objects list.
258 // TODO(editing-dev): |new_selected_map| doesn't really need to store the 250 // TODO(editing-dev): |new_selected_map| doesn't really need to store the
259 // SelectionState, it's just more convenient to have it use the same data 251 // SelectionState, it's just more convenient to have it use the same data
260 // structure as |old_selected_map|. 252 // structure as |old_selected_map|.
261 SelectedMap new_selected_map = 253 SelectedMap new_selected_map = CollectSelectedMap(new_range);
yosin_UTC9 2017/06/14 04:01:15 nit: s/SelectedMap/const SelectedMap&/
262 CollectSelectedMap(new_range, CollectSelectedMapOption::kCollectBlock);
263 254
264 // Have any of the old selected objects changed compared to the new selection? 255 // Have any of the old selected objects changed compared to the new selection?
265 for (const auto& pair : old_selected_map.object_map) { 256 for (const auto& pair : old_selected_map.object_map) {
266 LayoutObject* obj = pair.key; 257 LayoutObject* obj = pair.key;
267 SelectionState new_selection_state = obj->GetSelectionState(); 258 SelectionState new_selection_state = obj->GetSelectionState();
268 SelectionState old_selection_state = pair.value; 259 SelectionState old_selection_state = pair.value;
269 if (new_selection_state != old_selection_state || 260 if (new_selection_state != old_selection_state ||
270 (new_range.StartLayoutObject() == obj && 261 (new_range.StartLayoutObject() == obj &&
271 new_range.StartOffset() != old_range.StartOffset()) || 262 new_range.StartOffset() != old_range.StartOffset()) ||
272 (new_range.EndLayoutObject() == obj && 263 (new_range.EndLayoutObject() == obj &&
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 void LayoutSelection::ClearSelection() { 299 void LayoutSelection::ClearSelection() {
309 // For querying Layer::compositingState() 300 // For querying Layer::compositingState()
310 // This is correct, since destroying layout objects needs to cause eager paint 301 // This is correct, since destroying layout objects needs to cause eager paint
311 // invalidations. 302 // invalidations.
312 DisableCompositingQueryAsserts disabler; 303 DisableCompositingQueryAsserts disabler;
313 304
314 // Just return if the selection is already empty. 305 // Just return if the selection is already empty.
315 if (paint_range_.IsNull()) 306 if (paint_range_.IsNull())
316 return; 307 return;
317 308
318 const SelectedMap& old_selected_map = CollectSelectedMap( 309 for (auto layout_object : paint_range_) {
319 paint_range_, CollectSelectedMapOption::kNotCollectBlock);
320 // Clear SelectionState and invalidation.
321 // TODO(yoichio): Iterate with *this directrly.
322 for (auto layout_object : old_selected_map.object_map.Keys()) {
323 const SelectionState old_state = layout_object->GetSelectionState(); 310 const SelectionState old_state = layout_object->GetSelectionState();
324 layout_object->SetSelectionStateIfNeeded(SelectionState::kNone); 311 layout_object->SetSelectionStateIfNeeded(SelectionState::kNone);
325 if (layout_object->GetSelectionState() == old_state) 312 if (layout_object->GetSelectionState() == old_state)
326 continue; 313 continue;
327 layout_object->SetShouldInvalidateSelection(); 314 layout_object->SetShouldInvalidateSelection();
328 } 315 }
329 316
330 // Reset selection. 317 // Reset selection.
331 paint_range_ = SelectionPaintRange(); 318 paint_range_ = SelectionPaintRange();
332 } 319 }
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 449
463 runner->SetShouldInvalidateSelection(); 450 runner->SetShouldInvalidateSelection();
464 } 451 }
465 } 452 }
466 453
467 DEFINE_TRACE(LayoutSelection) { 454 DEFINE_TRACE(LayoutSelection) {
468 visitor->Trace(frame_selection_); 455 visitor->Trace(frame_selection_);
469 } 456 }
470 457
471 } // namespace blink 458 } // 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