Index: Source/core/rendering/RenderView.cpp |
diff --git a/Source/core/rendering/RenderView.cpp b/Source/core/rendering/RenderView.cpp |
index df0b318f126f324e8ad8295bbb7b07c2d96b0245..a76de7ab55300aedd9723edafb09f725a6bc2fcd 100644 |
--- a/Source/core/rendering/RenderView.cpp |
+++ b/Source/core/rendering/RenderView.cpp |
@@ -537,15 +537,19 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e |
int oldEndPos = m_selectionEndPos; |
// Objects each have a single selection rect to examine. |
- typedef WillBeHeapHashMap<RawPtrWillBeMember<RenderObject>, OwnPtrWillBeMember<RenderSelectionInfo> > SelectedObjectMap; |
+ typedef WillBeHeapHashMap<RawPtrWillBeMember<RenderObject>, SelectionState > SelectedObjectMap; |
SelectedObjectMap oldSelectedObjects; |
+ // 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 newSelectedObjects; |
// 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 paint invalidation 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 WillBeHeapHashMap<RawPtrWillBeMember<RenderBlock>, OwnPtrWillBeMember<RenderBlockSelectionInfo> > SelectedBlockMap; |
+ typedef WillBeHeapHashMap<RawPtrWillBeMember<RenderBlock>, SelectionState > SelectedBlockMap; |
SelectedBlockMap oldSelectedBlocks; |
+ // 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 newSelectedBlocks; |
RenderObject* os = m_selectionStart; |
@@ -555,14 +559,13 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e |
while (continueExploring) { |
if ((os->canBeSelectionLeaf() || os == m_selectionStart || os == m_selectionEnd) && os->selectionState() != SelectionNone) { |
// Blocks are responsible for painting line gaps and margin gaps. They must be examined as well. |
- oldSelectedObjects.set(os, adoptPtrWillBeNoop(new RenderSelectionInfo(os))); |
+ oldSelectedObjects.set(os, os->selectionState()); |
if (blockPaintInvalidationMode == PaintInvalidationNewXOROld) { |
RenderBlock* cb = os->containingBlock(); |
while (cb && !cb->isRenderView()) { |
- OwnPtrWillBeMember<RenderBlockSelectionInfo>& blockInfo = oldSelectedBlocks.add(cb, nullptr).storedValue->value; |
- if (blockInfo) |
+ SelectedBlockMap::AddResult result = oldSelectedBlocks.add(cb, cb->selectionState()); |
+ if (!result.isNewEntry) |
break; |
- blockInfo = adoptPtrWillBeNoop(new RenderBlockSelectionInfo(cb)); |
cb = cb->containingBlock(); |
} |
} |
@@ -610,13 +613,12 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e |
continueExploring = o && (o != stop); |
while (continueExploring) { |
if ((o->canBeSelectionLeaf() || o == start || o == end) && o->selectionState() != SelectionNone) { |
- newSelectedObjects.set(o, adoptPtrWillBeNoop(new RenderSelectionInfo(o))); |
+ newSelectedObjects.set(o, o->selectionState()); |
RenderBlock* cb = o->containingBlock(); |
while (cb && !cb->isRenderView()) { |
- OwnPtrWillBeMember<RenderBlockSelectionInfo>& blockInfo = newSelectedBlocks.add(cb, nullptr).storedValue->value; |
- if (blockInfo) |
+ SelectedBlockMap::AddResult result = newSelectedBlocks.add(cb, cb->selectionState()); |
+ if (!result.isNewEntry) |
break; |
- blockInfo = adoptPtrWillBeNoop(new RenderBlockSelectionInfo(cb)); |
cb = cb->containingBlock(); |
} |
} |
@@ -630,43 +632,37 @@ void RenderView::setSelection(RenderObject* start, int startPos, RenderObject* e |
// Have any of the old selected objects changed compared to the new selection? |
for (SelectedObjectMap::iterator i = oldSelectedObjects.begin(); i != oldObjectsEnd; ++i) { |
RenderObject* obj = i->key; |
- RenderSelectionInfo* newInfo = newSelectedObjects.get(obj); |
- RenderSelectionInfo* oldInfo = i->value.get(); |
- if (!newInfo || newInfo->hasChangedFrom(*oldInfo) |
+ SelectionState newSelectionState = obj->selectionState(); |
+ SelectionState oldSelectionState = i->value; |
+ if (newSelectionState != oldSelectionState |
|| (m_selectionStart == obj && oldStartPos != m_selectionStartPos) |
|| (m_selectionEnd == obj && oldEndPos != m_selectionEndPos)) { |
- oldInfo->invalidatePaint(); |
- if (newInfo) { |
- newInfo->object()->setShouldInvalidateSelection(); |
- newSelectedObjects.remove(obj); |
- } |
+ obj->setShouldInvalidateSelection(); |
+ newSelectedObjects.remove(obj); |
} |
} |
// Any new objects that remain were not found in the old objects dict, and so they need to be updated. |
SelectedObjectMap::iterator newObjectsEnd = newSelectedObjects.end(); |
for (SelectedObjectMap::iterator i = newSelectedObjects.begin(); i != newObjectsEnd; ++i) |
- i->value->object()->setShouldInvalidateSelection(); |
+ i->key->setShouldInvalidateSelection(); |
// Have any of the old blocks changed? |
SelectedBlockMap::iterator oldBlocksEnd = oldSelectedBlocks.end(); |
for (SelectedBlockMap::iterator i = oldSelectedBlocks.begin(); i != oldBlocksEnd; ++i) { |
RenderBlock* block = i->key; |
- RenderBlockSelectionInfo* newInfo = newSelectedBlocks.get(block); |
- RenderBlockSelectionInfo* oldInfo = i->value.get(); |
- if (!newInfo || newInfo->hasChangedFrom(*oldInfo)) { |
- oldInfo->invalidatePaint(); |
- if (newInfo) { |
- newInfo->object()->setShouldInvalidateSelection(); |
- newSelectedBlocks.remove(block); |
- } |
+ SelectionState newSelectionState = block->selectionState(); |
+ SelectionState oldSelectionState = i->value; |
+ if (newSelectionState != oldSelectionState) { |
+ block->setShouldInvalidateSelection(); |
+ newSelectedBlocks.remove(block); |
} |
} |
// Any new blocks that remain were not found in the old blocks dict, and so they need to be updated. |
SelectedBlockMap::iterator newBlocksEnd = newSelectedBlocks.end(); |
for (SelectedBlockMap::iterator i = newSelectedBlocks.begin(); i != newBlocksEnd; ++i) |
- i->value->object()->setShouldInvalidateSelection(); |
+ i->key->setShouldInvalidateSelection(); |
} |
void RenderView::clearSelection() |