Index: third_party/WebKit/Source/web/RotationViewportAnchor.cpp |
diff --git a/third_party/WebKit/Source/web/RotationViewportAnchor.cpp b/third_party/WebKit/Source/web/RotationViewportAnchor.cpp |
index b8532dd15215c130acfff440baef1077adb16b43..759aa59df65f6efdca964dea32501ab6366a6be0 100644 |
--- a/third_party/WebKit/Source/web/RotationViewportAnchor.cpp |
+++ b/third_party/WebKit/Source/web/RotationViewportAnchor.cpp |
@@ -105,10 +105,6 @@ void RotationViewportAnchor::setAnchor() { |
m_rootFrameView->getRootFrameViewport(); |
DCHECK(rootFrameViewport); |
- IntRect outerViewRect = |
- layoutViewport().visibleContentRect(IncludeScrollbars); |
- IntRect innerViewRect = rootFrameViewport->visibleContentRect(); |
- |
m_oldPageScaleFactor = m_visualViewport->scale(); |
m_oldMinimumPageScaleFactor = |
m_pageScaleConstraintsSet.finalConstraints().minimumScale; |
@@ -123,31 +119,31 @@ void RotationViewportAnchor::setAnchor() { |
m_anchorInNodeCoords = FloatSize(); |
m_normalizedVisualViewportOffset = FloatSize(); |
- if (innerViewRect.isEmpty()) |
- return; |
+ IntRect innerViewRect = rootFrameViewport->visibleContentRect(); |
- // Preserve origins at the absolute screen origin |
- if (innerViewRect.location() == IntPoint::zero()) |
+ // Preserve origins at the absolute screen origin. |
+ if (innerViewRect.location() == IntPoint::zero() || innerViewRect.isEmpty()) |
return; |
- // Inner rectangle should be within the outer one. |
- DCHECK(outerViewRect.contains(innerViewRect)); |
- |
- // Outer rectangle is used as a scale, we need positive width and height. |
- DCHECK(!outerViewRect.isEmpty()); |
- |
- m_normalizedVisualViewportOffset = |
- FloatSize(innerViewRect.location() - outerViewRect.location()); |
+ IntRect outerViewRect = |
+ layoutViewport().visibleContentRect(IncludeScrollbars); |
// Normalize by the size of the outer rect |
+ DCHECK(!outerViewRect.isEmpty()); |
+ m_normalizedVisualViewportOffset = m_visualViewport->scrollOffset(); |
m_normalizedVisualViewportOffset.scale(1.0 / outerViewRect.width(), |
1.0 / outerViewRect.height()); |
- FloatPoint anchorOffset(innerViewRect.size()); |
+ // Note, we specifically use the unscaled visual viewport size here as the |
+ // conversion into content-space below will apply the scale. |
+ FloatPoint anchorOffset(m_visualViewport->size()); |
anchorOffset.scale(m_anchorInInnerViewCoords.width(), |
m_anchorInInnerViewCoords.height()); |
- const FloatPoint anchorPointInContents = m_rootFrameView->rootFrameToContents( |
+ // Note, we specifically convert to the rootFrameView contents here, rather |
+ // than the layout viewport. That's because hit testing works from the |
+ // FrameView's content coordinates even if it's not the layout viewport. |
+ const FloatPoint anchorPointInContents = m_rootFrameView->frameToContents( |
m_visualViewport->viewportToRootFrame(anchorOffset)); |
Node* node = findNonEmptyAnchorNode(flooredIntPoint(anchorPointInContents), |