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 3beb0274d57c55771ddea0e7a79747ee84b50166..bcfeebaeb79ae9d643733138bc5e9e5ff7a12ea4 100644 |
| --- a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp |
| +++ b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp |
| @@ -74,6 +74,36 @@ int SelectionPaintRange::EndOffset() const { |
| return end_offset_; |
| } |
| +SelectionPaintRange::Iterator::Iterator(const SelectionPaintRange* range) { |
| + if (!range) { |
| + current_ = nullptr; |
| + return; |
| + } |
| + current_ = range->StartLayoutObject(); |
| + included_end_ = range->EndLayoutObject(); |
| + stop_ = range->EndLayoutObject()->ChildAt(range->EndOffset()); |
| + if (stop_) |
| + return; |
| + stop_ = range->EndLayoutObject()->NextInPreOrderAfterChildren(); |
| +} |
| + |
| +LayoutObject* SelectionPaintRange::Iterator::operator*() const { |
| + DCHECK(current_); |
| + return current_; |
| +} |
| + |
| +SelectionPaintRange::Iterator& SelectionPaintRange::Iterator::operator++() { |
| + DCHECK(current_); |
| + for (current_ = current_->NextInPreOrder(); current_ && current_ != stop_; |
| + current_ = current_->NextInPreOrder()) { |
| + if (current_ == included_end_ || current_->CanBeSelectionLeaf()) |
| + return *this; |
| + } |
| + |
| + current_ = nullptr; |
| + return *this; |
| +} |
| + |
| LayoutSelection::LayoutSelection(FrameSelection& frame_selection) |
| : frame_selection_(&frame_selection), |
| has_pending_selection_(false), |
| @@ -131,14 +161,7 @@ static SelectionInFlatTree CalcSelection( |
| return builder.Build(); |
| } |
| -static LayoutObject* LayoutObjectAfterPosition(LayoutObject* object, |
| - unsigned offset) { |
| - if (!object) |
| - return nullptr; |
| - LayoutObject* child = object->ChildAt(offset); |
| - return child ? child : object->NextInPreOrderAfterChildren(); |
| -} |
| // Objects each have a single selection rect to examine. |
| using SelectedObjectMap = HashMap<LayoutObject*, SelectionState>; |
| @@ -175,13 +198,7 @@ static SelectedMap CollectSelectedMap(const SelectionPaintRange& range, |
| SelectedMap selected_map; |
| - LayoutObject* const stop = |
| - LayoutObjectAfterPosition(range.EndLayoutObject(), range.EndOffset()); |
| - for (LayoutObject* runner = range.StartLayoutObject(); |
| - runner && (runner != stop); runner = runner->NextInPreOrder()) { |
| - if (!runner->CanBeSelectionLeaf() && runner != range.StartLayoutObject() && |
| - runner != range.EndLayoutObject()) |
| - continue; |
| + for (LayoutObject* runner : range) { |
| if (runner->GetSelectionState() == SelectionState::kNone) |
| continue; |
| @@ -216,10 +233,7 @@ static void SetSelectionState(const SelectionPaintRange& range) { |
| range.EndLayoutObject()->SetSelectionStateIfNeeded(SelectionState::kEnd); |
| } |
| - LayoutObject* const stop = |
| - LayoutObjectAfterPosition(range.EndLayoutObject(), range.EndOffset()); |
| - for (LayoutObject* runner = range.StartLayoutObject(); |
| - runner && runner != stop; runner = runner->NextInPreOrder()) { |
| + for (LayoutObject* runner : range) { |
| if (runner != range.StartLayoutObject() && |
| runner != range.EndLayoutObject() && runner->CanBeSelectionLeaf()) |
| runner->SetSelectionStateIfNeeded(SelectionState::kInside); |
| @@ -304,6 +318,7 @@ void LayoutSelection::ClearSelection() { |
| const SelectedMap& old_selected_map = CollectSelectedMap( |
| paint_range_, CollectSelectedMapOption::kNotCollectBlock); |
| // Clear SelectionState and invalidation. |
| + // TODO(yoichio): Iterate with *this directrly. |
| for (auto layout_object : old_selected_map.object_map.Keys()) { |
| const SelectionState old_state = layout_object->GetSelectionState(); |
| layout_object->SetSelectionStateIfNeeded(SelectionState::kNone); |
| @@ -410,28 +425,23 @@ IntRect LayoutSelection::SelectionBounds() { |
| if (paint_range_.IsNull()) |
| return IntRect(); |
| - LayoutObject* os = paint_range_.StartLayoutObject(); |
| - LayoutObject* stop = LayoutObjectAfterPosition(paint_range_.EndLayoutObject(), |
| - paint_range_.EndOffset()); |
| - while (os && os != stop) { |
| - if ((os->CanBeSelectionLeaf() || os == paint_range_.StartLayoutObject() || |
| - os == paint_range_.EndLayoutObject()) && |
| - os->GetSelectionState() != SelectionState::kNone) { |
| - // Blocks are responsible for painting line gaps and margin gaps. They |
| - // must be examined as well. |
| - sel_rect.Unite(SelectionRectForLayoutObject(os)); |
| - const LayoutBlock* cb = os->ContainingBlock(); |
| - while (cb && !cb->IsLayoutView()) { |
| - sel_rect.Unite(SelectionRectForLayoutObject(cb)); |
| - VisitedContainingBlockSet::AddResult add_result = |
| - visited_containing_blocks.insert(cb); |
| - if (!add_result.is_new_entry) |
| - break; |
| - cb = cb->ContainingBlock(); |
| - } |
| - } |
| + // TODO(yoichio): Use CollectSelectedMap. |
| + for (LayoutObject* runner : paint_range_) { |
| + if (runner->GetSelectionState() == SelectionState::kNone) |
| + continue; |
| - os = os->NextInPreOrder(); |
| + // Blocks are responsible for painting line gaps and margin gaps. They |
| + // must be examined as well. |
| + sel_rect.Unite(SelectionRectForLayoutObject(runner)); |
| + const LayoutBlock* cb = runner->ContainingBlock(); |
| + while (cb && !cb->IsLayoutView()) { |
|
yosin_UTC9
2017/06/12 06:37:36
Let's use for-statement.
s/cb/block/ or s/cb/block
yoichio
2017/06/12 06:45:44
I will use CollectSelectedMap and remove these lin
|
| + sel_rect.Unite(SelectionRectForLayoutObject(cb)); |
| + VisitedContainingBlockSet::AddResult add_result = |
| + visited_containing_blocks.insert(cb); |
| + if (!add_result.is_new_entry) |
| + break; |
| + cb = cb->ContainingBlock(); |
| + } |
| } |
| return PixelSnappedIntRect(sel_rect); |
| @@ -441,17 +451,11 @@ void LayoutSelection::InvalidatePaintForSelection() { |
| if (paint_range_.IsNull()) |
| return; |
| - LayoutObject* end = LayoutObjectAfterPosition(paint_range_.EndLayoutObject(), |
| - paint_range_.EndOffset()); |
| - for (LayoutObject* o = paint_range_.StartLayoutObject(); o && o != end; |
| - o = o->NextInPreOrder()) { |
| - if (!o->CanBeSelectionLeaf() && o != paint_range_.StartLayoutObject() && |
| - o != paint_range_.EndLayoutObject()) |
| - continue; |
| - if (o->GetSelectionState() == SelectionState::kNone) |
| + for (LayoutObject* runner : paint_range_) { |
| + if (runner->GetSelectionState() == SelectionState::kNone) |
| continue; |
| - o->SetShouldInvalidateSelection(); |
| + runner->SetShouldInvalidateSelection(); |
| } |
| } |