Index: third_party/WebKit/Source/core/frame/FrameView.cpp |
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp |
index 711d891a824a3e2b9f7211905cd5df5c9b6ecc27..a6b90cfad46c57ec38b461fcbecc64f72e23817c 100644 |
--- a/third_party/WebKit/Source/core/frame/FrameView.cpp |
+++ b/third_party/WebKit/Source/core/frame/FrameView.cpp |
@@ -150,6 +150,7 @@ FrameView::FrameView(LocalFrame* frame) |
, m_verticalScrollbarMode(ScrollbarAuto) |
, m_horizontalScrollbarLock(false) |
, m_verticalScrollbarLock(false) |
+ , m_scrollOverrideEnabled(false) |
, m_scrollbarsAvoidingResizer(0) |
, m_scrollbarsSuppressed(false) |
, m_inUpdateScrollbars(false) |
@@ -1564,7 +1565,7 @@ void FrameView::clearFragmentAnchor() |
void FrameView::setScrollPosition(const DoublePoint& scrollPoint, ScrollType scrollType, ScrollBehavior scrollBehavior) |
{ |
- DoublePoint newScrollPosition = clampScrollPosition(scrollPoint); |
+ DoublePoint newScrollPosition = clampScrollPosition(applyScrollOverrideToPosition(newScrollPosition)); |
if (newScrollPosition == scrollPositionDouble()) |
return; |
@@ -1574,6 +1575,18 @@ void FrameView::setScrollPosition(const DoublePoint& scrollPoint, ScrollType scr |
ScrollableArea::setScrollPosition(newScrollPosition, scrollType, scrollBehavior); |
} |
+void FrameView::setScrollOverride(const DoublePoint& position) |
+{ |
+ m_scrollOverrideEnabled = true; |
+ m_scrollOverridePosition = position; |
+ setScrollPosition(scrollPosition(), ProgrammaticScroll, ScrollBehaviorInstant); |
+} |
+ |
+void FrameView::clearScrollOverride() |
+{ |
+ m_scrollOverrideEnabled = false; |
+} |
+ |
void FrameView::didUpdateElasticOverscroll() |
{ |
Page* page = frame().page(); |
@@ -3233,7 +3246,7 @@ void FrameView::setScrollOffset(const DoublePoint& offset, ScrollType scrollType |
{ |
// TODO(skobes): We shouldn't have to clamp here; instead we should update callers |
// ScrollableArea::scrollPositionChanged to only pass clamped offsets. |
- DoublePoint newPosition = clampScrollPosition(offset); |
+ DoublePoint newPosition = clampScrollPosition(applyScrollOverrideToPosition(offset)); |
DoublePoint oldPosition = m_scrollPosition; |
DoubleSize scrollDelta = newPosition - oldPosition; |
@@ -3282,6 +3295,18 @@ void FrameView::setScrollOffset(const DoublePoint& offset, ScrollType scrollType |
m_scrollAnchor.clear(); |
} |
+DoublePoint FrameView::applyScrollOverrideToPosition(const DoublePoint& position) |
+{ |
+ DoublePoint newPosition = position; |
+ if (m_scrollOverrideEnabled) { |
+ if (m_scrollOverridePosition.x() >= 0) |
Sami
2016/06/23 17:34:03
Do we need to validate the coordinates again here?
Eric Seckler
2016/06/23 18:12:43
At the moment, I'm using a value <0 to signal "no
Sami
2016/06/24 14:48:26
Oh I see, I didn't notice we can override just one
|
+ newPosition.setX(m_scrollOverridePosition.x()); |
+ if (m_scrollOverridePosition.y() >= 0) |
+ newPosition.setY(m_scrollOverridePosition.y()); |
+ } |
+ return newPosition; |
+} |
+ |
void FrameView::windowResizerRectChanged() |
{ |
updateScrollbars(); |