Chromium Code Reviews| Index: Source/web/WebViewImpl.cpp |
| diff --git a/Source/web/WebViewImpl.cpp b/Source/web/WebViewImpl.cpp |
| index a170b30c711d430597a550f8a410233e7b41e766..b9642e142328c4ed749b90f97adf8c4ff0251acb 100644 |
| --- a/Source/web/WebViewImpl.cpp |
| +++ b/Source/web/WebViewImpl.cpp |
| @@ -1679,8 +1679,10 @@ void WebViewImpl::resize(const WebSize& newSize) |
| ViewportAnchor viewportAnchor(&localFrameRootTemporary()->frame()->eventHandler()); |
| if (shouldAnchorAndRescaleViewport) { |
| - viewportAnchor.setAnchor(view->visibleContentRect(), |
| - FloatSize(viewportAnchorXCoord, viewportAnchorYCoord)); |
| + viewportAnchor.setAnchor( |
| + localFrameRootTemporary()->frameView()->visibleContentRect(), |
|
bokan
2014/09/12 20:53:07
Just use the local 'view' as before.
timav
2014/09/12 23:33:35
Acknowledged.
timav
2014/09/15 20:04:35
Done.
|
| + visibleRectInDocument(), |
| + FloatSize(viewportAnchorXCoord, viewportAnchorYCoord)); |
| } |
| // FIXME: TextAutosizer does not yet support out-of-process frames. |
| @@ -1700,15 +1702,34 @@ 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); |
| + |
| + IntSize pinchViewportSize = newSize; |
| + pinchViewportSize.scale(1 / newPageScaleFactor); |
| + |
| + IntSize mainFrameSize = localFrameRootTemporary()->frameView()->visibleContentRect().size(); |
|
bokan
2014/09/12 20:53:07
ditto here, localFrameRootTemporary()->frameView()
timav
2014/09/12 23:33:35
Acknowledged.
timav
2014/09/15 20:04:35
Done.
|
| + |
| + IntPoint mainFrameOrigin; |
| + FloatPoint pinchViewportOrigin; |
| + viewportAnchor.computeOrigins(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()) |
| @@ -2897,6 +2918,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. |
|
bokan
2014/09/12 20:53:07
The inner viewport is always set relative to the o
timav
2014/09/12 23:33:35
I think you are right for the outer viewport, i.e.
bokan
2014/09/15 15:36:35
You're right, I misspoke, the scale needs to be ap
timav
2014/09/15 20:04:35
Done.
|
| + |
| + // 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()); |
| @@ -2939,7 +2993,6 @@ void WebViewImpl::setPageScaleFactor(float scaleFactor, const WebPoint& origin) |
| page()->setPageScaleFactor(scaleFactor, newScrollOffset); |
| } |
| - |
| float WebViewImpl::deviceScaleFactor() const |
| { |
| if (!page()) |