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

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

Issue 2184333002: Fix scroll anchoring during viewport resize. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 5 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/ResizeViewportAnchor.cpp
diff --git a/third_party/WebKit/Source/web/ResizeViewportAnchor.cpp b/third_party/WebKit/Source/web/ResizeViewportAnchor.cpp
index d262e08301a275144238bcc9960ea802665ebfba..2c333eaa50fcbcd21fd59f4dfc51a40f11ed5cd5 100644
--- a/third_party/WebKit/Source/web/ResizeViewportAnchor.cpp
+++ b/third_party/WebKit/Source/web/ResizeViewportAnchor.cpp
@@ -4,22 +4,41 @@
#include "web/ResizeViewportAnchor.h"
+#include "core/frame/FrameHost.h"
#include "core/frame/FrameView.h"
#include "core/frame/VisualViewport.h"
+#include "core/page/Page.h"
#include "platform/geometry/DoubleRect.h"
#include "platform/geometry/DoubleSize.h"
#include "platform/geometry/FloatSize.h"
namespace blink {
-ResizeViewportAnchor::ResizeViewportAnchor(FrameView& rootFrameView, VisualViewport& visualViewport)
- : ViewportAnchor(rootFrameView, visualViewport)
- , m_visualViewportInDocument(rootFrameView.getScrollableArea()->scrollPositionDouble())
+void ResizeViewportAnchor::resizeFrameView(IntSize size)
{
+ FrameView* frameView = rootFrameView();
+ DCHECK(frameView);
+
+ ScrollableArea* rootViewport = frameView->getScrollableArea();
+ DoublePoint position = rootViewport->scrollPositionDouble();
+
+ frameView->resize(size);
bokan 2016/07/28 14:55:55 I was a little concerned about this at first since
skobes 2016/07/28 15:45:50 ScrollAnchor shouldn't actually be doing anything
+ m_drift += rootViewport->scrollPositionDouble() - position;
}
-ResizeViewportAnchor::~ResizeViewportAnchor()
+void ResizeViewportAnchor::endScope()
{
+ if (--m_scopeCount > 0)
+ return;
+
+ FrameView* frameView = rootFrameView();
+ if (!frameView)
+ return;
+
+ VisualViewport& visualViewport = m_page->frameHost().visualViewport();
+ DoublePoint visualViewportInDocument =
+ frameView->getScrollableArea()->scrollPositionDouble() - m_drift;
+
// TODO(bokan): Don't use RootFrameViewport::setScrollPosition since it
// assumes we can just set a sub-pixel precision offset on the FrameView.
// While we "can" do this, the offset that will be shipped to CC will be the
@@ -28,22 +47,22 @@ ResizeViewportAnchor::~ResizeViewportAnchor()
// replace this with RFV::setScrollPosition once Blink is sub-pixel scroll
// offset aware. crbug.com/414283.
- ScrollableArea* rootViewport = m_rootFrameView->getScrollableArea();
+ ScrollableArea* rootViewport = frameView->getScrollableArea();
ScrollableArea* layoutViewport =
- m_rootFrameView->layoutViewportScrollableArea();
+ frameView->layoutViewportScrollableArea();
// Clamp the scroll offset of each viewport now so that we force any invalid
// offsets to become valid so we can compute the correct deltas.
- m_visualViewport->clampToBoundaries();
+ visualViewport.clampToBoundaries();
layoutViewport->setScrollPosition(
layoutViewport->scrollPositionDouble(), ProgrammaticScroll);
- DoubleSize delta = m_visualViewportInDocument
+ DoubleSize delta = visualViewportInDocument
- rootViewport->scrollPositionDouble();
- m_visualViewport->move(toFloatSize(delta));
+ visualViewport.move(toFloatSize(delta));
- delta = m_visualViewportInDocument
+ delta = visualViewportInDocument
- rootViewport->scrollPositionDouble();
// Since the main thread FrameView has integer scroll offsets, scroll it to
@@ -59,9 +78,19 @@ ResizeViewportAnchor::~ResizeViewportAnchor()
layoutViewport->scrollPosition() + layoutDelta,
ProgrammaticScroll);
- delta = m_visualViewportInDocument
+ delta = visualViewportInDocument
- rootViewport->scrollPositionDouble();
- m_visualViewport->move(toFloatSize(delta));
+ visualViewport.move(toFloatSize(delta));
+ m_drift = DoubleSize();
+}
+
+FrameView* ResizeViewportAnchor::rootFrameView()
+{
+ if (Frame* frame = m_page->mainFrame()) {
+ if (frame->isLocalFrame())
+ return toLocalFrame(frame)->view();
+ }
+ return nullptr;
}
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698