Chromium Code Reviews| 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(); |