#include "platform/scroll/Scrollbar.h"
#include "wtf/HashSet.h"
+#include "wtf/TemporaryChange.h"
-namespace WebCore {
+namespace blink {
class HostWindow;
class Scrollbar;
virtual int scrollSize(ScrollbarOrientation) const OVERRIDE;
virtual void setScrollOffset(const IntPoint&) OVERRIDE;
virtual bool isScrollCornerVisible() const OVERRIDE;
- virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate) OVERRIDE;
+ virtual void scrollbarStyleChanged() OVERRIDE;
virtual bool userInputScrollable(ScrollbarOrientation) const OVERRIDE;
virtual bool shouldPlaceVerticalScrollbarOnLeft() const OVERRIDE;
// By default, paint events are clipped to the visible area. If set to
// false, paint events are no longer clipped. paintsEntireContents() implies !clipsRepaints().
- bool clipsRepaints() const { return m_clipsRepaints; }
+ bool clipsPaintInvalidations() const { return m_clipsRepaints; }
void setClipsRepaints(bool);
// Overridden by FrameView to create custom CSS scrollbars if applicable.
virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation);
- virtual bool shouldAttemptToScrollUsingFastPath() const;
-
// The visible content rect has a location that is the scrolled offset of the document. The width and height are the viewport width
// and height. By default the scrollbars themselves are excluded from this rectangle, but an optional boolean argument allows them to be
// included.
virtual IntRect visibleContentRect(IncludeScrollbarsInRect = ExcludeScrollbars) const OVERRIDE;
IntSize visibleSize() const { return visibleContentRect().size(); }
- virtual int visibleWidth() const OVERRIDE { return visibleContentRect().width(); }
- virtual int visibleHeight() const OVERRIDE { return visibleContentRect().height(); }
+ virtual int visibleWidth() const OVERRIDE FINAL { return visibleContentRect().width(); }
+ virtual int visibleHeight() const OVERRIDE FINAL { return visibleContentRect().height(); }
// visibleContentRect().size() is computed from unscaledVisibleContentSize() divided by the value of visibleContentScaleFactor.
// For the main frame, visibleContentScaleFactor is equal to the page's pageScaleFactor; it's 1 otherwise.
// Functions for querying the current scrolled position (both as a point, a size, or as individual X and Y values).
virtual IntPoint scrollPosition() const OVERRIDE { return visibleContentRect().location(); }
IntSize scrollOffset() const { return toIntSize(visibleContentRect().location()); } // Gets the scrolled position as an IntSize. Convenient for adding to other sizes.
+ IntSize pendingScrollDelta() const { return m_pendingScrollDelta; }
virtual IntPoint maximumScrollPosition() const OVERRIDE; // The maximum position we can be scrolled to.
virtual IntPoint minimumScrollPosition() const OVERRIDE; // The minimum position we can be scrolled to.
// Adjust the passed in scroll position to keep it between the minimum and maximum positions.
IntPoint cachedScrollPosition() const { return m_cachedScrollPosition; }
// Functions for scrolling the view.
- virtual void setScrollPosition(const IntPoint&);
- void scrollBy(const IntSize& s) { return setScrollPosition(scrollPosition() + s); }
+ virtual void setScrollPosition(const IntPoint&, ScrollBehavior = ScrollBehaviorInstant);
+ void scrollBy(const IntSize& s, ScrollBehavior behavior = ScrollBehaviorInstant)
+ {
+ return setScrollPosition(scrollPosition() + s, behavior);
+ }
bool scroll(ScrollDirection, ScrollGranularity);
// the entire widget hierarchy. It is up to the platform to decide what the precise definition
// of containing window is. (For example on Mac it is the containing NSWindow.)
IntPoint windowToContents(const IntPoint&) const;
+ FloatPoint windowToContents(const FloatPoint&) const;
IntPoint contentsToWindow(const IntPoint&) const;
IntRect windowToContents(const IntRect&) const;
IntRect contentsToWindow(const IntRect&) const;
protected:
ScrollView();
- virtual void repaintContentRectangle(const IntRect&);
+ virtual void contentRectangleForPaintInvalidation(const IntRect&);
virtual void paintContents(GraphicsContext*, const IntRect& damageRect) = 0;
virtual void paintOverhangAreas(GraphicsContext*, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect);
virtual void updateScrollCorner();
virtual void invalidateScrollCornerRect(const IntRect&) OVERRIDE;
+ virtual void scrollContentsIfNeeded();
// Scroll the content by blitting the pixels.
- virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect);
+ virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll);
// Scroll the content by invalidating everything.
virtual void scrollContentsSlowPath(const IntRect& updateRect);
virtual bool isVerticalDocument() const { return true; }
virtual bool isFlippedDocument() const { return false; }
+ enum ComputeScrollbarExistenceOption {
+ FirstPass,
+ Incremental
+ };
+ void computeScrollbarExistence(bool& newHasHorizontalScrollbar, bool& newHasVerticalScrollbar, const IntSize& docSize, ComputeScrollbarExistenceOption = FirstPass) const;
+ void updateScrollbarGeometry();
+
// Called to update the scrollbars to accurately reflect the state of the view.
void updateScrollbars(const IntSize& desiredOffset);
IntSize excludeScrollbars(const IntSize&) const;
+ class InUpdateScrollbarsScope {
+ public:
+ explicit InUpdateScrollbarsScope(ScrollView* view)
+ : m_scope(view->m_inUpdateScrollbars, true)
+ { }
+ private:
+ TemporaryChange<bool> m_scope;
+ };
+
private:
+ bool adjustScrollbarExistence(ComputeScrollbarExistenceOption = FirstPass);
+ void adjustScrollbarOpacity();
+
RefPtr<Scrollbar> m_horizontalScrollbar;
RefPtr<Scrollbar> m_verticalScrollbar;
ScrollbarMode m_horizontalScrollbarMode;
HashSet<RefPtr<Widget> > m_children;
+ IntSize m_pendingScrollDelta;
IntSize m_scrollOffset; // FIXME: Would rather store this as a position, but we will wait to make this change until more code is shared.
IntPoint m_cachedScrollPosition;
IntSize m_contentsSize;
bool m_scrollbarsSuppressed;
bool m_inUpdateScrollbars;
- unsigned m_updateScrollbarsPass;
IntPoint m_panScrollIconPoint;
bool m_drawPanScrollIcon;
IntRect rectToCopyOnScroll() const;
- // Called when the scroll position within this view changes. FrameView overrides this to generate repaint invalidations.
- virtual void repaintFixedElementsAfterScrolling() { }
- virtual void updateFixedElementsAfterScrolling() { }
-
void calculateOverhangAreasForPainting(IntRect& horizontalOverhangRect, IntRect& verticalOverhangRect);
void updateOverhangAreas();
}; // class ScrollView
DEFINE_TYPE_CASTS(ScrollView, Widget, widget, widget->isScrollView(), widget.isScrollView());
-} // namespace WebCore
+} // namespace blink
#endif // ScrollView_h