Index: third_party/WebKit/Source/core/frame/ScrollAndScaleEmulator.h |
diff --git a/third_party/WebKit/Source/core/frame/ScrollAndScaleEmulator.h b/third_party/WebKit/Source/core/frame/ScrollAndScaleEmulator.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4c5d304800523aa79800b69c4ae7378d72495b33 |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/frame/ScrollAndScaleEmulator.h |
@@ -0,0 +1,87 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef ScrollAndScaleEmulator_h |
+#define ScrollAndScaleEmulator_h |
+ |
+#include "core/CoreExport.h" |
+#include "core/frame/PageScaleConstraints.h" |
+#include "platform/geometry/DoublePoint.h" |
+#include "platform/geometry/IntPoint.h" |
+#include "platform/heap/Handle.h" |
+#include "wtf/Noncopyable.h" |
+#include "wtf/PassRefPtr.h" |
+#include "wtf/RefCounted.h" |
+ |
+namespace blink { |
+ |
+class FrameHost; |
+class IntSize; |
+ |
+// Overrides the scroll positions of frame and visual viewport and the page |
+// scale with fixed values. |
+// |
+// Scroll position overrides are enforced within VisualViewport and FrameView |
+// by manipulating their minimum/maximum scroll positions. The override is then |
+// applied when the scroll position is clamped to these min/max values. |
+// |
+// Similarly, the scale override is enforced through setting custom user-agent |
+// PageScaleConstraints in WebViewImpl. |
+class CORE_EXPORT ScrollAndScaleEmulator final : public GarbageCollected<ScrollAndScaleEmulator> { |
+ WTF_MAKE_NONCOPYABLE(ScrollAndScaleEmulator); |
+public: |
+ // Create a new emulator instance. Also disables threaded scrolling for the |
+ // frame's page while the override is in effect. |
+ static ScrollAndScaleEmulator* create(FrameHost*); |
+ |
+ DECLARE_TRACE(); |
+ |
+ // Enforce new override values, notify viewports about changes. |
+ void update(const IntPoint& framePosition, const DoublePoint& visualViewportPosition, float pageScale); |
+ |
+ // Clear overrides, notify viewports about changes. Also restores threaded |
+ // scrolling settings and original user-agent PageScaleConstraints. |
+ void clear(); |
+ |
+ // Return main frame scroll position with active overrides for individual |
+ // coordinates applied. |
+ IntPoint applyFramePositionOverride(const IntPoint&); |
+ |
+ // Return visual viewport scroll position with active overrides for |
+ // individual coordinates applied. |
+ DoublePoint applyVisualViewportPositionOverride(const DoublePoint&); |
+ |
+ // Calculate and return main frame size for original PageScaleConstraints. |
+ IntSize mainFrameSize(const IntSize& webViewSize); |
+ |
+private: |
+ ScrollAndScaleEmulator(FrameHost*); |
+ |
+ // Return PageScaleConstraints that enforce any active page scale override. |
+ // Defaults to original constraints if no override is active. |
+ PageScaleConstraints pageScaleConstraints(); |
+ |
+ void setThreadedScrollingEnabled(bool); |
+ |
+ template <typename Point> |
+ Point applyPositionOverride(const Point& position, const Point& override); |
+ |
+ // Scroll position of frame. |x < 0| or |y < 0| disables the override for the respective coordinate. |
+ IntPoint m_framePosition; |
+ |
+ // Scroll position of visual viewport. |x < 0| or |y < 0| disables the override for the respective coordinate. |
+ DoublePoint m_visualViewportPosition; |
+ |
+ // Simulates visual viewport pinch zoom. |pageScale == 0| disables the override. |
+ double m_pageScale; |
+ |
+ Member<FrameHost> m_frameHost; |
+ |
+ bool m_originalThreadedScrollingEnabled; |
+ PageScaleConstraints m_originalPageScaleConstraints; |
+}; |
+ |
+} // namespace blink |
+ |
+#endif // ScrollAndScaleEmulator_h |