Chromium Code Reviews| 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..725d645fe4d3070091ee4ca7e05c87d82f22115d 100644 |
| --- a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp |
| +++ b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp |
| @@ -100,31 +100,6 @@ static LayoutObject* LayoutObjectAfterPosition(LayoutObject* object, |
| return child ? child : object->NextInPreOrderAfterChildren(); |
| } |
| -// When exploring the LayoutTree looking for the nodes involved in the |
| -// Selection, sometimes it's required to change the traversing direction because |
| -// the "start" position is below the "end" one. |
|
yosin_UTC9
2017/05/23 09:01:36
It seems patch[1] introduce backward traversal to
|
| -static inline LayoutObject* GetNextOrPrevLayoutObjectBasedOnDirection( |
| - const LayoutObject* o, |
| - const LayoutObject* stop, |
| - bool& continue_exploring, |
| - bool& exploring_backwards) { |
| - LayoutObject* next; |
| - if (exploring_backwards) { |
| - next = o->PreviousInPreOrder(); |
| - continue_exploring = next && !(next)->IsLayoutView(); |
| - } else { |
| - next = o->NextInPreOrder(); |
| - continue_exploring = next && next != stop; |
| - exploring_backwards = !next && (next != stop); |
| - if (exploring_backwards) { |
| - next = stop->PreviousInPreOrder(); |
| - continue_exploring = next && !next->IsLayoutView(); |
| - } |
| - } |
| - |
| - return next; |
| -} |
| - |
| // Objects each have a single selection rect to examine. |
| using SelectedObjectMap = HashMap<LayoutObject*, SelectionState>; |
| // Blocks contain selected objects and fill gaps between them, either on the |
| @@ -155,33 +130,31 @@ static SelectedMap CollectSelectedMap( |
| LayoutSelection::SelectionPaintInvalidationMode |
| block_paint_invalidation_mode) { |
| SelectedMap selected_map; |
| - LayoutObject* runner = selection_start; |
| + |
| LayoutObject* const stop = |
| LayoutObjectAfterPosition(selection_end, selection_end_pos); |
| - bool exploring_backwards = false; |
| - bool continue_exploring = runner && (runner != stop); |
| - while (continue_exploring) { |
| - if ((runner->CanBeSelectionLeaf() || runner == selection_start || |
| - runner == selection_end) && |
| - runner->GetSelectionState() != SelectionNone) { |
| - // Blocks are responsible for painting line gaps and margin gaps. They |
| - // must be examined as well. |
| - selected_map.object_map.Set(runner, runner->GetSelectionState()); |
| - if (block_paint_invalidation_mode == |
| - LayoutSelection::kPaintInvalidationNewXOROld) { |
| - LayoutBlock* containing_block = runner->ContainingBlock(); |
| - while (containing_block && !containing_block->IsLayoutView()) { |
| - SelectedBlockMap::AddResult result = selected_map.block_map.insert( |
| - containing_block, containing_block->GetSelectionState()); |
| - if (!result.is_new_entry) |
| - break; |
| - containing_block = containing_block->ContainingBlock(); |
| - } |
| + for (LayoutObject* runner = selection_start; runner && (runner != stop); |
| + runner = runner->NextInPreOrder()) { |
| + if (!runner->CanBeSelectionLeaf() && runner != selection_start && |
| + runner != selection_end) |
| + continue; |
| + if (runner->GetSelectionState() == SelectionNone) |
| + continue; |
| + |
| + // Blocks are responsible for painting line gaps and margin gaps. They |
| + // must be examined as well. |
| + selected_map.object_map.Set(runner, runner->GetSelectionState()); |
| + if (block_paint_invalidation_mode == |
| + LayoutSelection::kPaintInvalidationNewXOROld) { |
| + LayoutBlock* containing_block = runner->ContainingBlock(); |
| + while (containing_block && !containing_block->IsLayoutView()) { |
| + SelectedBlockMap::AddResult result = selected_map.block_map.insert( |
| + containing_block, containing_block->GetSelectionState()); |
| + if (!result.is_new_entry) |
| + break; |
| + containing_block = containing_block->ContainingBlock(); |
| } |
| } |
| - |
| - runner = GetNextOrPrevLayoutObjectBasedOnDirection( |
| - runner, stop, continue_exploring, exploring_backwards); |
| } |
| return selected_map; |
| } |
| @@ -346,6 +319,7 @@ void LayoutSelection::Commit() { |
| selection.VisibleStart().DeepEquivalent() == |
| selection.VisibleEnd().DeepEquivalent()) |
| return; |
| + DCHECK(start_pos <= end_pos); |
|
yosin_UTC9
2017/05/23 09:01:36
nit: DCHECK_LE(start_pos, end_pos)
|
| LayoutObject* start_layout_object = start_pos.AnchorNode()->GetLayoutObject(); |
| LayoutObject* end_layout_object = end_pos.AnchorNode()->GetLayoutObject(); |
| if (!start_layout_object || !end_layout_object) |