| Index: Source/core/frame/SmartClip.cpp
|
| diff --git a/Source/core/frame/SmartClip.cpp b/Source/core/frame/SmartClip.cpp
|
| index 1d21000d3e734054a13832698cea4036e433ebda..9d285cb4fc03a4a614280b7c299b57b7a8b23aca 100644
|
| --- a/Source/core/frame/SmartClip.cpp
|
| +++ b/Source/core/frame/SmartClip.cpp
|
| @@ -43,15 +43,14 @@
|
|
|
| namespace blink {
|
|
|
| -static IntRect applyScaleWithoutCollapsingToZero(const IntRect& rect, float scale)
|
| +static IntRect convertToContentCoordinatesWithoutCollapsingToZero(const IntRect& rectInViewport, const FrameView* view)
|
| {
|
| - IntRect result = rect;
|
| - result.scale(scale);
|
| - if (rect.width() > 0 && !result.width())
|
| - result.setWidth(1);
|
| - if (rect.height() > 0 && !result.height())
|
| - result.setHeight(1);
|
| - return result;
|
| + IntRect rectInContents = view->viewportToContents(rectInViewport);
|
| + if (rectInViewport.width() > 0 && !rectInContents.width())
|
| + rectInContents.setWidth(1);
|
| + if (rectInViewport.height() > 0 && !rectInContents.height())
|
| + rectInContents.setHeight(1);
|
| + return rectInContents;
|
| }
|
|
|
| static Node* nodeInsideFrame(Node* node)
|
| @@ -61,9 +60,9 @@ static Node* nodeInsideFrame(Node* node)
|
| return nullptr;
|
| }
|
|
|
| -IntRect SmartClipData::rect() const
|
| +IntRect SmartClipData::rectInViewport() const
|
| {
|
| - return m_rect;
|
| + return m_rectInViewport;
|
| }
|
|
|
| const String& SmartClipData::clipData() const
|
| @@ -76,22 +75,20 @@ SmartClip::SmartClip(PassRefPtrWillBeRawPtr<LocalFrame> frame)
|
| {
|
| }
|
|
|
| -SmartClipData SmartClip::dataForRect(const IntRect& cropRect)
|
| +SmartClipData SmartClip::dataForRect(const IntRect& cropRectInViewport)
|
| {
|
| - IntRect resizedCropRect = applyScaleWithoutCollapsingToZero(cropRect, 1 / pageScaleFactor());
|
| -
|
| - Node* bestNode = findBestOverlappingNode(m_frame->document(), resizedCropRect);
|
| + Node* bestNode = findBestOverlappingNode(m_frame->document(), cropRectInViewport);
|
| if (!bestNode)
|
| return SmartClipData();
|
|
|
| if (Node* nodeFromFrame = nodeInsideFrame(bestNode)) {
|
| // FIXME: This code only hit-tests a single iframe. It seems like we ought support nested frames.
|
| - if (Node* bestNodeInFrame = findBestOverlappingNode(nodeFromFrame, resizedCropRect))
|
| + if (Node* bestNodeInFrame = findBestOverlappingNode(nodeFromFrame, cropRectInViewport))
|
| bestNode = bestNodeInFrame;
|
| }
|
|
|
| WillBeHeapVector<RawPtrWillBeMember<Node>> hitNodes;
|
| - collectOverlappingChildNodes(bestNode, resizedCropRect, hitNodes);
|
| + collectOverlappingChildNodes(bestNode, cropRectInViewport, hitNodes);
|
|
|
| if (hitNodes.isEmpty() || hitNodes.size() == bestNode->countChildren()) {
|
| hitNodes.clear();
|
| @@ -106,7 +103,7 @@ SmartClipData SmartClip::dataForRect(const IntRect& cropRect)
|
| unitedRects.unite(hitNodes[i]->pixelSnappedBoundingBox());
|
| }
|
|
|
| - return SmartClipData(bestNode, convertRectToWindow(unitedRects), collectedText.toString());
|
| + return SmartClipData(bestNode, m_frame->document()->view()->contentsToViewport(unitedRects), collectedText.toString());
|
| }
|
|
|
| float SmartClip::pageScaleFactor()
|
| @@ -159,12 +156,12 @@ Node* SmartClip::minNodeContainsNodes(Node* minNode, Node* newNode)
|
| return nullptr;
|
| }
|
|
|
| -Node* SmartClip::findBestOverlappingNode(Node* rootNode, const IntRect& cropRect)
|
| +Node* SmartClip::findBestOverlappingNode(Node* rootNode, const IntRect& cropRectInViewport)
|
| {
|
| if (!rootNode)
|
| return nullptr;
|
|
|
| - IntRect resizedCropRect = rootNode->document().view()->windowToContents(cropRect);
|
| + IntRect resizedCropRect = convertToContentCoordinatesWithoutCollapsingToZero(cropRectInViewport, rootNode->document().view());
|
|
|
| Node* node = rootNode;
|
| Node* minNode = nullptr;
|
| @@ -218,11 +215,11 @@ bool SmartClip::shouldSkipBackgroundImage(Node* node)
|
| return false;
|
| }
|
|
|
| -void SmartClip::collectOverlappingChildNodes(Node* parentNode, const IntRect& cropRect, WillBeHeapVector<RawPtrWillBeMember<Node>>& hitNodes)
|
| +void SmartClip::collectOverlappingChildNodes(Node* parentNode, const IntRect& cropRectInViewport, WillBeHeapVector<RawPtrWillBeMember<Node>>& hitNodes)
|
| {
|
| if (!parentNode)
|
| return;
|
| - IntRect resizedCropRect = parentNode->document().view()->windowToContents(cropRect);
|
| + IntRect resizedCropRect = convertToContentCoordinatesWithoutCollapsingToZero(cropRectInViewport, parentNode->document().view());
|
| for (Node* child = parentNode->firstChild(); child; child = child->nextSibling()) {
|
| IntRect childRect = child->pixelSnappedBoundingBox();
|
| if (resizedCropRect.intersects(childRect))
|
| @@ -230,13 +227,6 @@ void SmartClip::collectOverlappingChildNodes(Node* parentNode, const IntRect& cr
|
| }
|
| }
|
|
|
| -IntRect SmartClip::convertRectToWindow(const IntRect& nodeRect)
|
| -{
|
| - IntRect result = m_frame->document()->view()->contentsToWindow(nodeRect);
|
| - result.scale(pageScaleFactor());
|
| - return result;
|
| -}
|
| -
|
| String SmartClip::extractTextFromNode(Node* node)
|
| {
|
| // Science has proven that no text nodes are ever positioned at y == -99999.
|
|
|