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 cd5cc26b30d141b990834a5611edc212cd91e2f3..4f5fa7af429ff0ba6124700112d931e0862d696d 100644 |
--- a/third_party/WebKit/Source/core/editing/LayoutSelection.cpp |
+++ b/third_party/WebKit/Source/core/editing/LayoutSelection.cpp |
@@ -126,6 +126,16 @@ static inline LayoutObject* GetNextOrPrevLayoutObjectBasedOnDirection( |
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 |
+// left, right, or in between lines and blocks. |
+// In order to get the visual rect right, we have to examine left, middle, and |
+// right rects individually, since otherwise the union of those rects might |
+// remain the same even when changes have occurred. |
+using SelectedBlockMap = HashMap<LayoutBlock*, SelectionState>; |
+using SelectedMap = std::pair<SelectedObjectMap, SelectedBlockMap>; |
+ |
void LayoutSelection::SetSelection( |
LayoutObject* start, |
int start_pos, |
@@ -153,26 +163,7 @@ void LayoutSelection::SetSelection( |
int old_start_pos = selection_start_pos_; |
int old_end_pos = selection_end_pos_; |
- // Objects each have a single selection rect to examine. |
- typedef HashMap<LayoutObject*, SelectionState> SelectedObjectMap; |
- SelectedObjectMap old_selected_objects; |
- // FIXME: |newSelectedObjects| doesn't really need to store the |
- // SelectionState, it's just more convenient to have it use the same data |
- // structure as |oldSelectedObjects|. |
- SelectedObjectMap new_selected_objects; |
- |
- // Blocks contain selected objects and fill gaps between them, either on the |
- // left, right, or in between lines and blocks. |
- // In order to get the visual rect right, we have to examine left, middle, and |
- // right rects individually, since otherwise the union of those rects might |
- // remain the same even when changes have occurred. |
- typedef HashMap<LayoutBlock*, SelectionState> SelectedBlockMap; |
- SelectedBlockMap old_selected_blocks; |
- // FIXME: |newSelectedBlocks| doesn't really need to store the SelectionState, |
- // it's just more convenient to have it use the same data structure as |
- // |oldSelectedBlocks|. |
- SelectedBlockMap new_selected_blocks; |
- |
+ SelectedMap old_selected_map; |
LayoutObject* os = selection_start_; |
LayoutObject* stop = |
LayoutObjectAfterPosition(selection_end_, selection_end_pos_); |
@@ -184,12 +175,12 @@ void LayoutSelection::SetSelection( |
os->GetSelectionState() != SelectionNone) { |
// Blocks are responsible for painting line gaps and margin gaps. They |
// must be examined as well. |
- old_selected_objects.Set(os, os->GetSelectionState()); |
+ old_selected_map.first.Set(os, os->GetSelectionState()); |
if (block_paint_invalidation_mode == kPaintInvalidationNewXOROld) { |
LayoutBlock* cb = os->ContainingBlock(); |
while (cb && !cb->IsLayoutView()) { |
SelectedBlockMap::AddResult result = |
- old_selected_blocks.insert(cb, cb->GetSelectionState()); |
+ old_selected_map.second.insert(cb, cb->GetSelectionState()); |
if (!result.is_new_entry) |
break; |
cb = cb->ContainingBlock(); |
@@ -202,8 +193,8 @@ void LayoutSelection::SetSelection( |
} |
// Now clear the selection. |
- SelectedObjectMap::iterator old_objects_end = old_selected_objects.end(); |
- for (SelectedObjectMap::iterator i = old_selected_objects.begin(); |
+ SelectedObjectMap::iterator old_objects_end = old_selected_map.first.end(); |
+ for (SelectedObjectMap::iterator i = old_selected_map.first.begin(); |
i != old_objects_end; ++i) |
i->key->SetSelectionStateIfNeeded(SelectionNone); |
@@ -235,17 +226,21 @@ void LayoutSelection::SetSelection( |
// Now that the selection state has been updated for the new objects, walk |
// them again and put them in the new objects list. |
+ // FIXME: |new_selected_map| doesn't really need to store the |
yosin_UTC9
2017/05/10 09:04:22
nit: s/FIXME/TODO(editing-dev)/
|
+ // SelectionState, it's just more convenient to have it use the same data |
+ // structure as |old_selected_map|. |
+ SelectedMap new_selected_map; |
o = start; |
exploring_backwards = false; |
continue_exploring = o && (o != stop); |
while (continue_exploring) { |
if ((o->CanBeSelectionLeaf() || o == start || o == end) && |
o->GetSelectionState() != SelectionNone) { |
- new_selected_objects.Set(o, o->GetSelectionState()); |
+ new_selected_map.first.Set(o, o->GetSelectionState()); |
LayoutBlock* cb = o->ContainingBlock(); |
while (cb && !cb->IsLayoutView()) { |
SelectedBlockMap::AddResult result = |
- new_selected_blocks.insert(cb, cb->GetSelectionState()); |
+ new_selected_map.second.insert(cb, cb->GetSelectionState()); |
if (!result.is_new_entry) |
break; |
cb = cb->ContainingBlock(); |
@@ -261,7 +256,7 @@ void LayoutSelection::SetSelection( |
return; |
// Have any of the old selected objects changed compared to the new selection? |
- for (SelectedObjectMap::iterator i = old_selected_objects.begin(); |
+ for (SelectedObjectMap::iterator i = old_selected_map.first.begin(); |
i != old_objects_end; ++i) { |
LayoutObject* obj = i->key; |
SelectionState new_selection_state = obj->GetSelectionState(); |
@@ -270,34 +265,34 @@ void LayoutSelection::SetSelection( |
(selection_start_ == obj && old_start_pos != selection_start_pos_) || |
(selection_end_ == obj && old_end_pos != selection_end_pos_)) { |
obj->SetShouldInvalidateSelection(); |
- new_selected_objects.erase(obj); |
+ new_selected_map.first.erase(obj); |
} |
} |
// Any new objects that remain were not found in the old objects dict, and so |
// they need to be updated. |
- SelectedObjectMap::iterator new_objects_end = new_selected_objects.end(); |
- for (SelectedObjectMap::iterator i = new_selected_objects.begin(); |
+ SelectedObjectMap::iterator new_objects_end = new_selected_map.first.end(); |
+ for (SelectedObjectMap::iterator i = new_selected_map.first.begin(); |
i != new_objects_end; ++i) |
i->key->SetShouldInvalidateSelection(); |
// Have any of the old blocks changed? |
- SelectedBlockMap::iterator old_blocks_end = old_selected_blocks.end(); |
- for (SelectedBlockMap::iterator i = old_selected_blocks.begin(); |
+ SelectedBlockMap::iterator old_blocks_end = old_selected_map.second.end(); |
+ for (SelectedBlockMap::iterator i = old_selected_map.second.begin(); |
i != old_blocks_end; ++i) { |
LayoutBlock* block = i->key; |
SelectionState new_selection_state = block->GetSelectionState(); |
SelectionState old_selection_state = i->value; |
if (new_selection_state != old_selection_state) { |
block->SetShouldInvalidateSelection(); |
- new_selected_blocks.erase(block); |
+ new_selected_map.second.erase(block); |
} |
} |
// Any new blocks that remain were not found in the old blocks dict, and so |
// they need to be updated. |
- SelectedBlockMap::iterator new_blocks_end = new_selected_blocks.end(); |
- for (SelectedBlockMap::iterator i = new_selected_blocks.begin(); |
+ SelectedBlockMap::iterator new_blocks_end = new_selected_map.second.end(); |
+ for (SelectedBlockMap::iterator i = new_selected_map.second.begin(); |
i != new_blocks_end; ++i) |
i->key->SetShouldInvalidateSelection(); |
} |