Index: third_party/WebKit/Source/web/WebViewImpl.cpp |
diff --git a/third_party/WebKit/Source/web/WebViewImpl.cpp b/third_party/WebKit/Source/web/WebViewImpl.cpp |
index fad565d27c6eaef57d89c1087056567fb40a7363..61eb90a8860713dfe19f8d7673ddaa8090241ed6 100644 |
--- a/third_party/WebKit/Source/web/WebViewImpl.cpp |
+++ b/third_party/WebKit/Source/web/WebViewImpl.cpp |
@@ -419,6 +419,7 @@ WebViewImpl::WebViewImpl(WebViewClient* client) |
, m_enableFakePageScaleAnimationForTesting(false) |
, m_fakePageScaleAnimationPageScaleFactor(0) |
, m_fakePageScaleAnimationUseAnchor(false) |
+ , m_scrollOverrideEnabled(false) |
, m_doingDragAndDrop(false) |
, m_ignoreInputEvents(false) |
, m_compositorDeviceScaleFactorOverride(0) |
@@ -1818,7 +1819,11 @@ void WebViewImpl::performResize() |
updatePageDefinedViewportConstraints(mainFrameImpl()->frame()->document()->viewportDescription()); |
updateMainFrameLayoutSize(); |
- page()->frameHost().visualViewport().setSize(m_size); |
+ if (!(m_scrollOverrideEnabled |
+ && (m_scrollOverrideParams.visualViewportSize.width |
+ || m_scrollOverrideParams.visualViewportSize.height))) { |
+ page()->frameHost().visualViewport().setSize(m_size); |
+ } |
if (mainFrameImpl()->frameView()) { |
if (!mainFrameImpl()->frameView()->needsLayout()) |
@@ -3165,6 +3170,18 @@ float WebViewImpl::pageScaleFactor() const |
return page()->frameHost().visualViewport().scale(); |
} |
+WebPoint WebViewImpl::mainFrameOffset() const |
+{ |
+ if (!page() || !mainFrameImpl()) |
+ return WebPoint(); |
+ |
+ FrameView* view = mainFrameImpl()->frameView(); |
+ if (!view) |
+ return WebPoint(); |
+ |
+ return view->scrollPosition(); |
+} |
+ |
float WebViewImpl::clampPageScaleFactorToLimits(float scaleFactor) const |
{ |
return pageScaleConstraintsSet().finalConstraints().clampToConstraints(scaleFactor); |
@@ -3188,6 +3205,56 @@ WebFloatSize WebViewImpl::visualViewportSize() const |
return page()->frameHost().visualViewport().visibleRect().size(); |
} |
+void WebViewImpl::setScrollOverride(const WebDeviceEmulationParams& params) |
+{ |
+ if (m_scrollOverrideEnabled && m_scrollOverrideParams == params) |
+ return; |
+ |
+ if (!page()) |
+ return; |
+ |
+ if (!mainFrameImpl()) |
+ return; |
+ |
+ FrameView * view = mainFrameImpl()->frameView(); |
+ if (!view) |
+ return; |
+ |
+ m_scrollOverrideEnabled = true; |
+ m_scrollOverrideParams = params; |
+ |
+ view->setScrollOverride(DoublePoint( |
+ m_scrollOverrideParams.scrollPosition.x, m_scrollOverrideParams.scrollPosition.y)); |
+ page()->frameHost().visualViewport().setScaleAndScrollOverride( |
+ m_scrollOverrideParams.visualViewportScale, |
+ FloatPoint( |
+ m_scrollOverrideParams.visualViewportPosition.x, |
+ m_scrollOverrideParams.visualViewportPosition.y)); |
+} |
+ |
+void WebViewImpl::clearScrollOverride() |
+{ |
+ if (!m_scrollOverrideEnabled) |
+ return; |
+ |
+ if (!page()) |
+ return; |
+ |
+ if (!mainFrameImpl()) |
+ return; |
+ |
+ FrameView * view = mainFrameImpl()->frameView(); |
+ if (!view) |
+ return; |
+ |
+ m_scrollOverrideEnabled = false; |
+ |
+ view->clearScrollOverride(); |
+ page()->frameHost().visualViewport().clearScaleAndScrollOverride(); |
+ |
+ resetScrollAndScaleState(); |
+} |
+ |
void WebViewImpl::scrollAndRescaleViewports(float scaleFactor, |
const IntPoint& mainFrameOrigin, |
const FloatPoint& visualViewportOrigin) |
@@ -3848,10 +3915,12 @@ void WebViewImpl::setRootLayerTransform(const WebSize& rootLayerOffset, float ro |
void WebViewImpl::enableDeviceEmulation(const WebDeviceEmulationParams& params) |
{ |
m_devToolsEmulator->enableDeviceEmulation(params); |
+ setScrollOverride(params); |
} |
void WebViewImpl::disableDeviceEmulation() |
{ |
+ clearScrollOverride(); |
m_devToolsEmulator->disableDeviceEmulation(); |
} |