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

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

Issue 2280453002: Split RootScrollerController into top-document and child-document classes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@rootScrollerIFrames2
Patch Set: Linked TODO to bug 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.h
diff --git a/third_party/WebKit/Source/core/page/scrolling/RootScrollerController.h b/third_party/WebKit/Source/core/page/scrolling/RootScrollerController.h
index 9a0dae610cb946ede9c9ed38ceac0c980c2a869e..c28c4f5fed14b07a2d9fe9306f8dc26262be85d8 100644
--- a/third_party/WebKit/Source/core/page/scrolling/RootScrollerController.h
+++ b/third_party/WebKit/Source/core/page/scrolling/RootScrollerController.h
@@ -13,41 +13,36 @@ namespace blink {
class Document;
class Element;
class GraphicsLayer;
+class ScrollableArea;
class ScrollStateCallback;
-class ViewportScrollCallback;
-// Manages the root scroller associated with a given document. The root scroller
-// causes top controls movement, overscroll effects and prevents chaining
-// scrolls up further in the DOM. It can be set from script using
+// Manages the root scroller associated with a given document. The root
+// scroller causes top controls movement, overscroll effects and prevents
+// chaining scrolls up further in the DOM. It can be set from script using
// document.setRootScroller.
//
// There are two notions of a root scroller in this class: m_rootScroller and
// m_effectiveRootScroller. The former is the Element that was set as the root
// scroller using document.setRootScroller. If the page didn't set a root
// scroller this will be nullptr. The "effective" root scroller is the current
-// element we're using internally to apply viewport scroll actions. i.e It's the
-// element with the ViewportScrollCallback set as its apply-scroll callback.
-// The effective root scroller will only be null during document initialization.
+// element we're using internally to apply viewport scrolling actions. The
+// effective root scroller will only be null during document initialization.
//
-// If the root scroller element is a valid element to become the root scroller,
-// it will be promoted to the effective root scroller. If it is not valid, the
-// effective root scroller will fall back to a default Element (see
+// If the currently set m_rootScroller is a valid element to become the root
+// scroller, it will be promoted to the effective root scroller. If it is not
+// valid, the effective root scroller will fall back to a default Element (see
// defaultEffectiveRootScroller()). The rules for what makes an element a valid
// root scroller are set in isValidRootScroller(). The validity of the current
// root scroller is re-checked after each layout.
class CORE_EXPORT RootScrollerController
: public GarbageCollected<RootScrollerController> {
public:
- // Creates a RootScrollerController for the given document. You should use
- // setViewportScrollCallback to provide this class with a scroll callback
- // that RootScrollerController will keep applied to the current RootScroller
- // so that special actions can occur on scrolling.
- static RootScrollerController* create(Document& document)
- {
- return new RootScrollerController(document);
- }
+ // Creates a RootScrollerController for the given document. Note, instances
+ // of this class need to be made aware of lifecycle events, see the
+ // didUpdateLayout, didUpdateCompositing, etc. type methods below.
+ static RootScrollerController* create(Document&);
- DECLARE_TRACE();
+ DECLARE_VIRTUAL_TRACE();
// Sets the element that will be used as the root scroller. This can be
// nullptr, in which case we'll use the default element (documentElement) as
@@ -74,36 +69,50 @@ public:
// This class needs to be informed of changes to compositing so that it can
// update the compositor when the effective root scroller changes.
- void didUpdateCompositing();
+ virtual void didUpdateCompositing();
// This class needs to be informed when the document has been attached to a
// FrameView so that we can initialize the viewport scroll callback.
- void didAttachDocument();
+ virtual void didAttachDocument();
+ // Returns the GraphicsLayer for the current effective root scroller
+ // element.
GraphicsLayer* rootScrollerLayer();
+ // Returns true if the given ScrollStateCallback is the ViewportScrollCallback managed
+ // by this class.
// TODO(bokan): Temporarily needed to allow ScrollCustomization to
// differentiate between real custom callback and the built-in viewport
- // apply scroll.
- bool isViewportScrollCallback(const ScrollStateCallback*) const;
+ // apply scroll. crbug.com/623079.
+ virtual bool isViewportScrollCallback(const ScrollStateCallback*) const;
-private:
+protected:
RootScrollerController(Document&);
- Element* defaultEffectiveRootScroller();
-
// Ensures the effective root scroller is currently valid and replaces it
// with the default if not.
- void updateEffectiveRootScroller();
+ virtual void updateEffectiveRootScroller();
- // Called only from the top Document's RootScrollerController. Ensures that
- // the element that should be used as the root scroller on the page has the
- // m_viewportApplyScroll callback set on it.
- void setViewportApplyScrollOnRootScroller();
+ // Returns the ScrollableArea to use to scroll the given Element.
+ ScrollableArea* scrollableAreaFor(const Element&) const;
+ // The owning Document whose root scroller this object manages.
WeakMember<Document> m_document;
- Member<ViewportScrollCallback> m_viewportApplyScroll;
+private:
+
+ // Determines whether the given element meets the criteria to become the
+ // effective root scroller.
+ bool isValidRootScroller(const Element&) const;
+
+ // Returns the Element that should be used if the currently set
+ // m_rootScroller isn't valid to be a root scroller.
+ Element* defaultEffectiveRootScroller();
+
+ // The Element that was set from script as rootScroller. Depending on its
+ // validity to be the root scroller (e.g. a display: none element isn't a
+ // valid root scroller), this may not actually be the Element being used as
+ // the root scroller.
WeakMember<Element> m_rootScroller;
// The element currently being used as the root scroller. If
@@ -112,10 +121,6 @@ private:
// initialization and will not be set until m_viewportApplyScroll is
// provided.
WeakMember<Element> m_effectiveRootScroller;
-
- // Tracks which element currently has the m_viewportApplyScroll set to it.
- // This will only ever be set on the top Document's RootScrollerController.
- WeakMember<Element> m_currentViewportApplyScrollHost;
};
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698