Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1578)

Unified Diff: Source/core/rendering/RenderView.cpp

Issue 665673004: Move selection invalidation to the invalidation phase (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Updated after Xianzhu's comments. Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderSelectionInfo.h ('k') | Source/core/rendering/shapes/Shape.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()
« no previous file with comments | « Source/core/rendering/RenderSelectionInfo.h ('k') | Source/core/rendering/shapes/Shape.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698