Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(323)

Unified Diff: third_party/WebKit/Source/web/WebViewImpl.cpp

Issue 2096633002: Adds scroll position/scale emulation to DevTools. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes issues with visual viewport scroll override, mainFrameSize on scale override, clamps position… Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 7f9d5c550cfe56d0f26f919d9bc120bda193ac41..43d06bc10e4b950906f3094a6290087892b88360 100644
--- a/third_party/WebKit/Source/web/WebViewImpl.cpp
+++ b/third_party/WebKit/Source/web/WebViewImpl.cpp
@@ -56,6 +56,7 @@
#include "core/frame/LocalFrame.h"
#include "core/frame/PageScaleConstraintsSet.h"
#include "core/frame/RemoteFrame.h"
+#include "core/frame/ScrollAndScaleEmulator.h"
#include "core/frame/Settings.h"
#include "core/frame/SmartClip.h"
#include "core/frame/TopControls.h"
@@ -3207,6 +3208,58 @@ WebFloatSize WebViewImpl::visualViewportSize() const
return page()->frameHost().visualViewport().visibleRect().size();
}
+void WebViewImpl::setScrollAndScaleOverride(const WebDeviceEmulationParams& params)
+{
+ if (!page() || !mainFrameImpl())
+ return;
+
+ FrameView * view = mainFrameImpl()->frameView();
+ if (!view)
+ return;
+
+ if (!m_scrollAndScaleEmulator) {
+ m_scrollAndScaleEmulator = ScrollAndScaleEmulator::create();
+
+ // Force main thread scrolling, because we do not apply scroll position
+ // overrides in the compositor thread.
+ m_scrollAndScaleEmulator->disableThreadedScrolling(page());
+ }
+
+ bool hasChanged = m_scrollAndScaleEmulator->update(
+ static_cast<IntPoint>(params.scrollPosition),
+ static_cast<FloatPoint>(params.visualViewportPosition),
+ params.visualViewportScale);
+ if (hasChanged) {
+ view->setScrollAndScaleEmulator(m_scrollAndScaleEmulator);
+ page()->frameHost().visualViewport().setScrollAndScaleEmulator(m_scrollAndScaleEmulator);
+ page()->frameHost().setUserAgentPageScaleConstraints(m_scrollAndScaleEmulator->pageScaleConstraints());
+ }
+}
+
+void WebViewImpl::clearScrollAndScaleOverride()
+{
+ if (!m_scrollAndScaleEmulator || !page() || !mainFrameImpl())
+ return;
+
+ FrameView * view = mainFrameImpl()->frameView();
+ if (!view)
+ return;
+
+ m_scrollAndScaleEmulator->restoreThreadedScrolling(page());
+
+ view->setScrollAndScaleEmulator(nullptr);
+ page()->frameHost().visualViewport().setScrollAndScaleEmulator(nullptr);
+ page()->frameHost().setUserAgentPageScaleConstraints(PageScaleConstraints());
+
+ // TODO(eseckler): For some reason, we seem to need this enforce the cleared
+ // constraints. Adding it in setScrollAndScaleOverride() makes the override
+ // ineffective, though.
+ page()->frameHost().pageScaleConstraintsSet().computeFinalConstraints();
Eric Seckler 2016/06/30 20:01:28 Not sure why this line is necessary here (otherwis
+
+ m_scrollAndScaleEmulator.clear();
+ resetScrollAndScaleState();
+}
+
void WebViewImpl::scrollAndRescaleViewports(float scaleFactor,
const IntPoint& mainFrameOrigin,
const FloatPoint& visualViewportOrigin)
@@ -3340,10 +3393,22 @@ void WebViewImpl::setIgnoreViewportTagScaleLimits(bool ignore)
IntSize WebViewImpl::mainFrameSize()
{
- // The frame size should match the viewport size at minimum scale, since the
- // viewport must always be contained by the frame.
FloatSize frameSize(m_size);
+
+ // The frame size should match the viewport size at minimum scale, since the
+ // viewport must always be contained by the frame. ScrollAndScaleEmulator
+ // overrides the minimum scale in the userAgentConstraints. These overrides
+ // should be ignored for this calculation.
+ if (m_scrollAndScaleEmulator) {
+ pageScaleConstraintsSet().setUserAgentConstraints(PageScaleConstraints());
+ pageScaleConstraintsSet().computeFinalConstraints();
+ }
frameSize.scale(1 / minimumPageScaleFactor());
+ if (m_scrollAndScaleEmulator) {
+ pageScaleConstraintsSet().setUserAgentConstraints(m_scrollAndScaleEmulator->pageScaleConstraints());
+ pageScaleConstraintsSet().computeFinalConstraints();
+ }
+
return expandedIntSize(frameSize);
}
@@ -3832,10 +3897,12 @@ void WebViewImpl::setRootLayerTransform(const WebSize& rootLayerOffset, float ro
void WebViewImpl::enableDeviceEmulation(const WebDeviceEmulationParams& params)
{
m_devToolsEmulator->enableDeviceEmulation(params);
+ setScrollAndScaleOverride(params);
}
void WebViewImpl::disableDeviceEmulation()
{
+ clearScrollAndScaleOverride();
m_devToolsEmulator->disableDeviceEmulation();
}
« no previous file with comments | « third_party/WebKit/Source/web/WebViewImpl.h ('k') | third_party/WebKit/public/web/WebDeviceEmulationParams.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698