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

Unified Diff: third_party/WebKit/Source/core/page/scrolling/RootScrollerController.cpp

Issue 2273163002: Cleanup and refactor RootScrollerController. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed class comment Created 4 years, 4 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/core/page/scrolling/RootScrollerController.cpp
diff --git a/third_party/WebKit/Source/core/page/scrolling/RootScrollerController.cpp b/third_party/WebKit/Source/core/page/scrolling/RootScrollerController.cpp
index 4d4f495ffd56a3c3d95f108474546c299a0c0c61..798465b93aa4be02018919910ea6f1600ba52d95 100644
--- a/third_party/WebKit/Source/core/page/scrolling/RootScrollerController.cpp
+++ b/third_party/WebKit/Source/core/page/scrolling/RootScrollerController.cpp
@@ -21,6 +21,8 @@
namespace blink {
+class RootFrameViewport;
+
namespace {
ScrollableArea* scrollableAreaFor(const Element& element)
@@ -91,6 +93,7 @@ DEFINE_TRACE(RootScrollerController)
visitor->trace(m_viewportApplyScroll);
visitor->trace(m_rootScroller);
visitor->trace(m_effectiveRootScroller);
+ visitor->trace(m_currentViewportApplyScrollHost);
}
void RootScrollerController::set(Element* newRootScroller)
@@ -114,12 +117,6 @@ void RootScrollerController::didUpdateLayout()
updateEffectiveRootScroller();
}
-void RootScrollerController::setViewportScrollCallback(ViewportScrollCallback* callback)
-{
- m_viewportApplyScroll = callback;
- moveViewportApplyScroll(m_effectiveRootScroller);
-}
-
void RootScrollerController::updateEffectiveRootScroller()
{
bool rootScrollerValid =
@@ -132,44 +129,73 @@ void RootScrollerController::updateEffectiveRootScroller()
if (m_effectiveRootScroller == newEffectiveRootScroller)
return;
- if (moveViewportApplyScroll(newEffectiveRootScroller))
- m_effectiveRootScroller = newEffectiveRootScroller;
+ m_effectiveRootScroller = newEffectiveRootScroller;
+
+ if (m_document->isInMainFrame())
+ setViewportApplyScrollOnRootScroller();
}
-bool RootScrollerController::moveViewportApplyScroll(Element* target)
+void RootScrollerController::setViewportApplyScrollOnRootScroller()
{
- if (!m_viewportApplyScroll || !target)
- return false;
+ DCHECK(m_document->isInMainFrame());
+
+ if (!m_viewportApplyScroll || !m_effectiveRootScroller)
+ return;
+
+ ScrollableArea* targetScroller =
+ scrollableAreaFor(*m_effectiveRootScroller);
- ScrollableArea* targetScroller = scrollableAreaFor(*target);
if (!targetScroller)
- return false;
+ return;
- if (m_effectiveRootScroller)
- m_effectiveRootScroller->removeApplyScroll();
+ if (m_currentViewportApplyScrollHost)
+ m_currentViewportApplyScrollHost->removeApplyScroll();
// Use disable-native-scroll since the ViewportScrollCallback needs to
// apply scroll actions both before (TopControls) and after (overscroll)
// scrolling the element so it will apply scroll to the element itself.
- target->setApplyScroll(m_viewportApplyScroll, "disable-native-scroll");
+ m_effectiveRootScroller->setApplyScroll(
+ m_viewportApplyScroll, "disable-native-scroll");
+
+ m_currentViewportApplyScrollHost = m_effectiveRootScroller;
// Ideally, scroll customization would pass the current element to scroll to
// the apply scroll callback but this doesn't happen today so we set it
// through a back door here. This is also needed by the
- // RootViewportScrollCallback to swap the target into the layout viewport
+ // ViewportScrollCallback to swap the target into the layout viewport
// in RootFrameViewport.
m_viewportApplyScroll->setScroller(targetScroller);
-
- return true;
}
void RootScrollerController::didUpdateCompositing()
{
- FrameHost& frameHost = *m_document->frameHost();
+ FrameHost* frameHost = m_document->frameHost();
// Let the compositor-side counterpart know about this change.
- if (m_document->isInMainFrame())
- frameHost.chromeClient().registerViewportLayers();
+ if (frameHost && m_document->isInMainFrame())
+ frameHost->chromeClient().registerViewportLayers();
+}
+
+void RootScrollerController::didAttachDocument()
+{
+ if (!m_document->isInMainFrame())
+ return;
+
+ FrameHost* frameHost = m_document->frameHost();
+ FrameView* frameView = m_document->view();
+
+ if (!frameHost || !frameView)
+ return;
+
+ RootFrameViewport* rootFrameViewport = frameView->getRootFrameViewport();
+ DCHECK(rootFrameViewport);
+
+ m_viewportApplyScroll = ViewportScrollCallback::create(
+ &frameHost->topControls(),
+ &frameHost->overscrollController(),
+ *rootFrameViewport);
+
+ updateEffectiveRootScroller();
}
GraphicsLayer* RootScrollerController::rootScrollerLayer()
@@ -191,6 +217,15 @@ GraphicsLayer* RootScrollerController::rootScrollerLayer()
return graphicsLayer;
}
+bool RootScrollerController::isViewportScrollCallback(
+ const ScrollStateCallback* callback) const
+{
+ if (!callback)
+ return false;
+
+ return callback == m_viewportApplyScroll.get();
+}
+
Element* RootScrollerController::defaultEffectiveRootScroller()
{
DCHECK(m_document);

Powered by Google App Engine
This is Rietveld 408576698