| Index: Source/web/WebViewImpl.cpp
|
| diff --git a/Source/web/WebViewImpl.cpp b/Source/web/WebViewImpl.cpp
|
| index b22e36738a6d56b8fc5494ae126db85ef990a710..79db9f375f58571864a0eb20632129b98b5c9fe9 100644
|
| --- a/Source/web/WebViewImpl.cpp
|
| +++ b/Source/web/WebViewImpl.cpp
|
| @@ -1688,8 +1688,10 @@ void WebViewImpl::resize(const WebSize& newSize)
|
|
|
| ViewportAnchor viewportAnchor(&localFrameRootTemporary()->frame()->eventHandler());
|
| if (shouldAnchorAndRescaleViewport) {
|
| - viewportAnchor.setAnchor(view->visibleContentRect(),
|
| - FloatSize(viewportAnchorXCoord, viewportAnchorYCoord));
|
| + viewportAnchor.setAnchor(
|
| + view->visibleContentRect(),
|
| + visibleRectInDocument(),
|
| + FloatSize(viewportAnchorXCoord, viewportAnchorYCoord));
|
| }
|
|
|
| // FIXME: TextAutosizer does not yet support out-of-process frames.
|
| @@ -1709,15 +1711,35 @@ void WebViewImpl::resize(const WebSize& newSize)
|
|
|
| if (shouldAnchorAndRescaleViewport) {
|
| float newPageScaleFactor = oldPageScaleFactor / oldMinimumPageScaleFactor * minimumPageScaleFactor();
|
| - IntSize scaledViewportSize = newSize;
|
| - scaledViewportSize.scale(1 / newPageScaleFactor);
|
| - setPageScaleFactor(newPageScaleFactor, viewportAnchor.computeOrigin(scaledViewportSize));
|
| + newPageScaleFactor = clampPageScaleFactorToLimits(newPageScaleFactor);
|
| +
|
| + FloatSize pinchViewportSize = FloatSize(newSize);
|
| + pinchViewportSize.scale(1 / newPageScaleFactor);
|
| +
|
| + IntSize mainFrameSize = view->visibleContentRect().size();
|
| +
|
| + IntPoint mainFrameOrigin;
|
| + FloatPoint pinchViewportOrigin;
|
| + viewportAnchor.computeOrigins(view, mainFrameSize, pinchViewportSize,
|
| + &mainFrameOrigin, &pinchViewportOrigin);
|
| + scrollAndRescaleViewports(newPageScaleFactor, mainFrameOrigin, pinchViewportOrigin);
|
| }
|
| }
|
|
|
| sendResizeEventAndRepaint();
|
| }
|
|
|
| +IntRect WebViewImpl::visibleRectInDocument() const
|
| +{
|
| + if (pinchVirtualViewportEnabled()) {
|
| + // Inner viewport in the document coordinates
|
| + return enclosedIntRect(page()->frameHost().pinchViewport().visibleRectInDocument());
|
| + }
|
| +
|
| + // Outer viewport in the document coordinates
|
| + return localFrameRootTemporary()->frameView()->visibleContentRect();
|
| +}
|
| +
|
| void WebViewImpl::willEndLiveResize()
|
| {
|
| if (mainFrameImpl() && mainFrameImpl()->frameView())
|
| @@ -2913,6 +2935,39 @@ WebFloatPoint WebViewImpl::pinchViewportOffset() const
|
| return page()->frameHost().pinchViewport().visibleRect().location();
|
| }
|
|
|
| +void WebViewImpl::scrollAndRescaleViewports(float scaleFactor,
|
| + const IntPoint & mainFrameOrigin,
|
| + const FloatPoint & pinchViewportOrigin)
|
| +{
|
| + // Old way
|
| + if (!pinchVirtualViewportEnabled()) {
|
| + setPageScaleFactor(scaleFactor, mainFrameOrigin);
|
| + return;
|
| + }
|
| +
|
| + if (!page())
|
| + return;
|
| +
|
| + if (!mainFrameImpl())
|
| + return;
|
| +
|
| + FrameView * view = mainFrameImpl()->frameView();
|
| + if (!view)
|
| + return;
|
| +
|
| + // Order is important: pinch viewport location is clamped based on
|
| + // main frame scroll position and pinch viewport scale.
|
| +
|
| + // Set outer viewport position.
|
| + view->setScrollOffset(mainFrameOrigin);
|
| +
|
| + // Set the scale.
|
| + setPageScaleFactor(scaleFactor);
|
| +
|
| + // Set inner viewport position.
|
| + page()->frameHost().pinchViewport().setLocation(pinchViewportOrigin);
|
| +}
|
| +
|
| void WebViewImpl::setPageScaleFactor(float scaleFactor)
|
| {
|
| ASSERT(page());
|
| @@ -2955,7 +3010,6 @@ void WebViewImpl::setPageScaleFactor(float scaleFactor, const WebPoint& origin)
|
| page()->setPageScaleFactor(scaleFactor, newScrollOffset);
|
| }
|
|
|
| -
|
| float WebViewImpl::deviceScaleFactor() const
|
| {
|
| if (!page())
|
|
|