Index: Source/core/rendering/RenderView.cpp |
diff --git a/Source/core/rendering/RenderView.cpp b/Source/core/rendering/RenderView.cpp |
index bd48ce87bc32b407df4babd9726baf82be914613..c50e55f56ac8e56054ca9a1bccb71a2513fd6fef 100644 |
--- a/Source/core/rendering/RenderView.cpp |
+++ b/Source/core/rendering/RenderView.cpp |
@@ -37,7 +37,6 @@ |
#include "core/rendering/RenderLayer.h" |
#include "core/rendering/RenderPart.h" |
#include "core/rendering/RenderQuote.h" |
-#include "core/rendering/RenderSelectionInfo.h" |
#include "core/rendering/compositing/CompositedLayerMapping.h" |
#include "core/rendering/compositing/RenderLayerCompositor.h" |
#include "core/svg/SVGDocumentExtensions.h" |
@@ -438,23 +437,37 @@ static RenderObject* rendererAfterPosition(RenderObject* object, unsigned offset |
return child ? child : object->nextInPreOrderAfterChildren(); |
} |
+static LayoutRect selectionRectForRenderer(const RenderObject* object) |
+{ |
+ if (!object->isRooted()) |
+ return LayoutRect(); |
+ |
+ if (!object->canUpdateSelectionOnRootLineBoxes()) |
+ return LayoutRect(); |
+ |
+ return object->selectionRectForPaintInvalidation(object->containerForPaintInvalidation()); |
+} |
+ |
IntRect RenderView::selectionBounds() const |
{ |
- typedef WillBeHeapHashMap<RawPtrWillBeMember<RenderObject>, OwnPtrWillBeMember<RenderSelectionInfo> > SelectionMap; |
- SelectionMap selectedObjects; |
+ // Now create a single bounding box rect that encloses the whole selection. |
+ LayoutRect selRect; |
+ |
+ typedef WillBeHeapHashSet<RawPtrWillBeMember<const RenderBlock> > VisitedContainingBlockSet; |
+ VisitedContainingBlockSet visitedContainingBlocks; |
RenderObject* os = m_selectionStart; |
RenderObject* stop = rendererAfterPosition(m_selectionEnd, m_selectionEndPos); |
while (os && os != stop) { |
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. |
- selectedObjects.set(os, adoptPtrWillBeNoop(new RenderSelectionInfo(os))); |
- RenderBlock* cb = os->containingBlock(); |
+ selRect.unite(selectionRectForRenderer(os)); |
+ const RenderBlock* cb = os->containingBlock(); |
while (cb && !cb->isRenderView()) { |
- OwnPtrWillBeMember<RenderSelectionInfo>& blockInfo = selectedObjects.add(cb, nullptr).storedValue->value; |
- if (blockInfo) |
+ selRect.unite(selectionRectForRenderer(cb)); |
+ VisitedContainingBlockSet::AddResult addResult = visitedContainingBlocks.add(cb); |
+ if (!addResult.isNewEntry) |
break; |
- blockInfo = adoptPtrWillBeNoop(new RenderSelectionInfo(cb)); |
cb = cb->containingBlock(); |
} |
} |
@@ -462,12 +475,6 @@ IntRect RenderView::selectionBounds() const |
os = os->nextInPreOrder(); |
} |
- // Now create a single bounding box rect that encloses the whole selection. |
- LayoutRect selRect; |
- SelectionMap::iterator end = selectedObjects.end(); |
- for (SelectionMap::iterator i = selectedObjects.begin(); i != end; ++i) |
- selRect.unite(i->value->absoluteSelectionRect()); |
- |
return pixelSnappedIntRect(selRect); |
} |