| 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 81174f1e27f92bd38e33634a79b251a30c2ca537..01db0ad07db010cecd4ee5c33550912c6a779888 100644
|
| --- a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp
|
| @@ -162,10 +162,13 @@ struct SelectedMap {
|
| DISALLOW_COPY_AND_ASSIGN(SelectedMap);
|
| };
|
|
|
| -static SelectedMap CollectSelectedMap(
|
| - const SelectionPaintRange& range,
|
| - LayoutSelection::SelectionPaintInvalidationMode
|
| - block_paint_invalidation_mode) {
|
| +enum class CollectSelectedMapOption {
|
| + kCollectBlock,
|
| + kNotCollectBlock,
|
| +};
|
| +
|
| +static SelectedMap CollectSelectedMap(const SelectionPaintRange& range,
|
| + CollectSelectedMapOption option) {
|
| if (range.IsNull())
|
| return SelectedMap();
|
|
|
| @@ -184,8 +187,7 @@ static SelectedMap CollectSelectedMap(
|
| // 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) {
|
| + if (option == CollectSelectedMapOption::kCollectBlock) {
|
| LayoutBlock* containing_block = runner->ContainingBlock();
|
| while (containing_block && !containing_block->IsLayoutView()) {
|
| SelectedBlockMap::AddResult result = selected_map.block_map.insert(
|
| @@ -221,20 +223,12 @@ static void SetSelectionState(const SelectionPaintRange& range) {
|
| }
|
| }
|
|
|
| -void LayoutSelection::SetSelection(
|
| - const SelectionPaintRange& new_range,
|
| - SelectionPaintInvalidationMode block_paint_invalidation_mode) {
|
| - DCHECK(!new_range.IsNull());
|
| -
|
| - // Just return if the selection hasn't changed.
|
| - if (paint_range_ == new_range)
|
| - return;
|
| -
|
| - DCHECK(frame_selection_->GetDocument().GetLayoutView()->GetFrameView());
|
| - DCHECK(!frame_selection_->GetDocument().NeedsLayoutTreeUpdate());
|
| -
|
| +// Set SetSelectionState and ShouldInvalidateSelection flag of LayoutObjects
|
| +// comparing them in |new_range| and |old_range|.
|
| +static void UpdateLayoutObjectState(const SelectionPaintRange& new_range,
|
| + const SelectionPaintRange& old_range) {
|
| SelectedMap old_selected_map =
|
| - CollectSelectedMap(paint_range_, block_paint_invalidation_mode);
|
| + CollectSelectedMap(old_range, CollectSelectedMapOption::kCollectBlock);
|
|
|
| // Now clear the selection.
|
| for (auto layout_object : old_selected_map.object_map.Keys())
|
| @@ -248,7 +242,7 @@ void LayoutSelection::SetSelection(
|
| // SelectionState, it's just more convenient to have it use the same data
|
| // structure as |old_selected_map|.
|
| SelectedMap new_selected_map =
|
| - CollectSelectedMap(new_range, kPaintInvalidationNewXOROld);
|
| + CollectSelectedMap(new_range, CollectSelectedMapOption::kCollectBlock);
|
|
|
| // Have any of the old selected objects changed compared to the new selection?
|
| for (const auto& pair : old_selected_map.object_map) {
|
| @@ -257,9 +251,9 @@ void LayoutSelection::SetSelection(
|
| SelectionState old_selection_state = pair.value;
|
| if (new_selection_state != old_selection_state ||
|
| (new_range.StartLayoutObject() == obj &&
|
| - new_range.StartOffset() != paint_range_.StartOffset()) ||
|
| + new_range.StartOffset() != old_range.StartOffset()) ||
|
| (new_range.EndLayoutObject() == obj &&
|
| - new_range.EndOffset() != paint_range_.EndOffset())) {
|
| + new_range.EndOffset() != old_range.EndOffset())) {
|
| obj->SetShouldInvalidateSelection();
|
| new_selected_map.object_map.erase(obj);
|
| }
|
| @@ -285,8 +279,6 @@ void LayoutSelection::SetSelection(
|
| // they need to be updated.
|
| for (auto layout_object : new_selected_map.block_map.Keys())
|
| layout_object->SetShouldInvalidateSelection();
|
| -
|
| - paint_range_ = new_range;
|
| }
|
|
|
| std::pair<int, int> LayoutSelection::SelectionStartEnd() {
|
| @@ -306,8 +298,8 @@ void LayoutSelection::ClearSelection() {
|
| if (paint_range_.IsNull())
|
| return;
|
|
|
| - const SelectedMap& old_selected_map =
|
| - CollectSelectedMap(paint_range_, kPaintInvalidationNewMinusOld);
|
| + const SelectedMap& old_selected_map = CollectSelectedMap(
|
| + paint_range_, CollectSelectedMapOption::kNotCollectBlock);
|
| // Clear SelectionState and invalidation.
|
| for (auto layout_object : old_selected_map.object_map.Keys()) {
|
| const SelectionState old_state = layout_object->GetSelectionState();
|
| @@ -369,9 +361,18 @@ void LayoutSelection::Commit() {
|
| if (!start_layout_object || !end_layout_object)
|
| return;
|
| DCHECK(start_layout_object->View() == end_layout_object->View());
|
| - SetSelection(
|
| - SelectionPaintRange(start_layout_object, start_pos.ComputeEditingOffset(),
|
| - end_layout_object, end_pos.ComputeEditingOffset()));
|
| +
|
| + const SelectionPaintRange new_range(
|
| + start_layout_object, start_pos.ComputeEditingOffset(), end_layout_object,
|
| + end_pos.ComputeEditingOffset());
|
| + // Just return if the selection hasn't changed.
|
| + if (paint_range_ == new_range)
|
| + return;
|
| +
|
| + DCHECK(frame_selection_->GetDocument().GetLayoutView()->GetFrameView());
|
| + DCHECK(!frame_selection_->GetDocument().NeedsLayoutTreeUpdate());
|
| + UpdateLayoutObjectState(new_range, paint_range_);
|
| + paint_range_ = new_range;
|
| }
|
|
|
| void LayoutSelection::OnDocumentShutdown() {
|
|
|