diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WebCore/page/FrameView.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/page/FrameView.h')
-rw-r--r-- | Source/WebCore/page/FrameView.h | 599 |
1 files changed, 389 insertions, 210 deletions
diff --git a/Source/WebCore/page/FrameView.h b/Source/WebCore/page/FrameView.h index 8ece6e51d..ecd097604 100644 --- a/Source/WebCore/page/FrameView.h +++ b/Source/WebCore/page/FrameView.h @@ -4,7 +4,7 @@ (C) 1998, 1999 Torben Weis (weis@kde.org) (C) 1999 Lars Knoll (knoll@kde.org) (C) 1999 Antti Koivisto (koivisto@kde.org) - Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. + Copyright (C) 2004-2017 Apple Inc. All rights reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public @@ -22,20 +22,23 @@ Boston, MA 02110-1301, USA. */ -#ifndef FrameView_h -#define FrameView_h +#pragma once #include "AdjustViewSizeOrNot.h" #include "Color.h" +#include "ContainerNode.h" #include "LayoutMilestones.h" #include "LayoutRect.h" #include "Pagination.h" #include "PaintPhase.h" #include "RenderPtr.h" #include "ScrollView.h" +#include "TiledBacking.h" +#include <memory> #include <wtf/Forward.h> +#include <wtf/Function.h> +#include <wtf/HashSet.h> #include <wtf/ListHashSet.h> -#include <wtf/OwnPtr.h> #include <wtf/text/WTFString.h> namespace WebCore { @@ -67,23 +70,21 @@ public: friend class RenderView; friend class Internals; - static PassRefPtr<FrameView> create(Frame&); - static PassRefPtr<FrameView> create(Frame&, const IntSize& initialSize); + WEBCORE_EXPORT static Ref<FrameView> create(Frame&); + static Ref<FrameView> create(Frame&, const IntSize& initialSize); virtual ~FrameView(); - virtual HostWindow* hostWindow() const override; + HostWindow* hostWindow() const final; - virtual void invalidateRect(const IntRect&) override; - virtual void setFrameRect(const IntRect&) override; + WEBCORE_EXPORT void invalidateRect(const IntRect&) final; + void setFrameRect(const IntRect&) final; -#if ENABLE(REQUEST_ANIMATION_FRAME) - virtual bool scheduleAnimation() override; -#endif + bool scheduleAnimation() final; - Frame& frame() const { return *m_frame; } + Frame& frame() const { return m_frame; } - RenderView* renderView() const; + WEBCORE_EXPORT RenderView* renderView() const; int mapFromLayoutToCSSUnits(LayoutUnit) const; LayoutUnit mapFromCSSToLayoutUnits(int) const; @@ -93,156 +94,199 @@ public: void setMarginWidth(LayoutUnit); void setMarginHeight(LayoutUnit); - virtual void setCanHaveScrollbars(bool) override; - void updateCanHaveScrollbars(); + WEBCORE_EXPORT void setCanHaveScrollbars(bool) final; + WEBCORE_EXPORT void updateCanHaveScrollbars(); - virtual PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation) override; + Ref<Scrollbar> createScrollbar(ScrollbarOrientation) final; - virtual bool avoidScrollbarCreation() const override; + bool avoidScrollbarCreation() const final; - virtual void setContentsSize(const IntSize&) override; + void setContentsSize(const IntSize&) final; + void updateContentsSize() final; void layout(bool allowSubtree = true); - bool didFirstLayout() const; - void layoutTimerFired(Timer<FrameView>&); + WEBCORE_EXPORT bool didFirstLayout() const; + void layoutTimerFired(); void scheduleRelayout(); void scheduleRelayoutOfSubtree(RenderElement&); void unscheduleRelayout(); + void queuePostLayoutCallback(WTF::Function<void ()>&&); bool layoutPending() const; - bool isInLayout() const { return m_layoutPhase == InLayout; } + bool isInLayout() const { return m_layoutPhase != OutsideLayout; } + bool isInRenderTreeLayout() const { return m_layoutPhase == InRenderTreeLayout; } + bool inPaintableState() { return m_layoutPhase != InRenderTreeLayout && m_layoutPhase != InViewSizeAdjust && m_layoutPhase != InPostLayout; } - RenderObject* layoutRoot(bool onlyDuringLayout = false) const; + RenderElement* layoutRoot() const { return m_layoutRoot; } void clearLayoutRoot() { m_layoutRoot = nullptr; } int layoutCount() const { return m_layoutCount; } - bool needsLayout() const; - void setNeedsLayout(); + WEBCORE_EXPORT bool needsLayout() const; + WEBCORE_EXPORT void setNeedsLayout(); void setViewportConstrainedObjectsNeedLayout(); + bool needsStyleRecalcOrLayout(bool includeSubframes = true) const; + bool needsFullRepaint() const { return m_needsFullRepaint; } - bool renderedCharactersExceed(unsigned threshold); + WEBCORE_EXPORT bool renderedCharactersExceed(unsigned threshold); #if PLATFORM(IOS) - bool useCustomFixedPositionLayoutRect() const { return m_useCustomFixedPositionLayoutRect; } - void setUseCustomFixedPositionLayoutRect(bool); + bool useCustomFixedPositionLayoutRect() const; IntRect customFixedPositionLayoutRect() const { return m_customFixedPositionLayoutRect; } - void setCustomFixedPositionLayoutRect(const IntRect&); + WEBCORE_EXPORT void setCustomFixedPositionLayoutRect(const IntRect&); bool updateFixedPositionLayoutRect(); -#endif -#if ENABLE(REQUEST_ANIMATION_FRAME) - void serviceScriptedAnimations(double monotonicAnimationStartTime); + IntSize customSizeForResizeEvent() const { return m_customSizeForResizeEvent; } + WEBCORE_EXPORT void setCustomSizeForResizeEvent(IntSize); + + WEBCORE_EXPORT void setScrollVelocity(double horizontalVelocity, double verticalVelocity, double scaleChangeRate, MonotonicTime timestamp); +#else + bool useCustomFixedPositionLayoutRect() const { return false; } #endif -#if USE(ACCELERATED_COMPOSITING) - void updateCompositingLayersAfterStyleChange(); + WEBCORE_EXPORT void serviceScriptedAnimations(); + + void willRecalcStyle(); + bool updateCompositingLayersAfterStyleChange(); void updateCompositingLayersAfterLayout(); - bool flushCompositingStateForThisFrame(Frame* rootFrameForFlush); void clearBackingStores(); - void restoreBackingStores(); // Called when changes to the GraphicsLayer hierarchy have to be synchronized with // content rendered via the normal painting path. void setNeedsOneShotDrawingSynchronization(); - GraphicsLayer* graphicsLayerForPlatformWidget(PlatformWidget); - void scheduleLayerFlushAllowingThrottling(); + WEBCORE_EXPORT GraphicsLayer* graphicsLayerForPlatformWidget(PlatformWidget); + WEBCORE_EXPORT void scheduleLayerFlushAllowingThrottling(); - virtual TiledBacking* tiledBacking() const override; + WEBCORE_EXPORT TiledBacking* tiledBacking() const final; // In the future when any ScrollableArea can have a node in th ScrollingTree, this should // become a virtual function on ScrollableArea. uint64_t scrollLayerID() const; -#endif + ScrollableArea* scrollableAreaForScrollLayerID(uint64_t) const; bool hasCompositedContent() const; - bool hasCompositedContentIncludingDescendants() const; - bool hasCompositingAncestor() const; - void enterCompositingMode(); - bool isEnclosedInCompositingLayer() const; + WEBCORE_EXPORT void enterCompositingMode(); + WEBCORE_EXPORT bool isEnclosedInCompositingLayer() const; // Only used with accelerated compositing, but outside the #ifdef to make linkage easier. // Returns true if the flush was completed. - bool flushCompositingStateIncludingSubframes(); + WEBCORE_EXPORT bool flushCompositingStateIncludingSubframes(); // Returns true when a paint with the PaintBehaviorFlattenCompositingLayers flag set gives // a faithful representation of the content. - bool isSoftwareRenderable() const; + WEBCORE_EXPORT bool isSoftwareRenderable() const; - void didMoveOnscreen(); - void willMoveOffscreen(); void setIsInWindow(bool); void resetScrollbars(); void resetScrollbarsAndClearContentsSize(); void prepareForDetach(); void detachCustomScrollbars(); - void recalculateScrollbarOverlayStyle(); + WEBCORE_EXPORT void recalculateScrollbarOverlayStyle(); void clear(); - bool isTransparent() const; - void setTransparent(bool isTransparent); + WEBCORE_EXPORT bool isTransparent() const; + WEBCORE_EXPORT void setTransparent(bool isTransparent); // True if the FrameView is not transparent, and the base background color is opaque. bool hasOpaqueBackground() const; - Color baseBackgroundColor() const; - void setBaseBackgroundColor(const Color&); + WEBCORE_EXPORT Color baseBackgroundColor() const; + WEBCORE_EXPORT void setBaseBackgroundColor(const Color&); void updateBackgroundRecursively(const Color&, bool); - // extendedBackgroundRect() is in the viewport's coordinate space. - bool hasExtendedBackground() const; - IntRect extendedBackgroundRect() const; - -#if USE(ACCELERATED_COMPOSITING) - void setBackgroundExtendsBeyondPage(bool); -#endif + enum ExtendedBackgroundModeFlags { + ExtendedBackgroundModeNone = 0, + ExtendedBackgroundModeVertical = 1 << 0, + ExtendedBackgroundModeHorizontal = 1 << 1, + ExtendedBackgroundModeAll = ExtendedBackgroundModeVertical | ExtendedBackgroundModeHorizontal, + }; + typedef unsigned ExtendedBackgroundMode; + + void updateExtendBackgroundIfNecessary(); + void updateTilesForExtendedBackgroundMode(ExtendedBackgroundMode); + ExtendedBackgroundMode calculateExtendedBackgroundMode() const; + + bool hasExtendedBackgroundRectForPainting() const; + IntRect extendedBackgroundRectForPainting() const; bool shouldUpdateWhileOffscreen() const; - void setShouldUpdateWhileOffscreen(bool); - bool shouldUpdate(bool = false) const; + WEBCORE_EXPORT void setShouldUpdateWhileOffscreen(bool); + bool shouldUpdate() const; - void adjustViewSize(); + WEBCORE_EXPORT void adjustViewSize(); - virtual IntRect windowClipRect(bool clipToContents = true) const override; - IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*, bool clipToLayerContents) const; - - virtual IntRect windowResizerRect() const override; + WEBCORE_EXPORT void setViewportSizeForCSSViewportUnits(IntSize); + IntSize viewportSizeForCSSViewportUnits() const; + + IntRect windowClipRect() const final; + WEBCORE_EXPORT IntRect windowClipRectForFrameOwner(const HTMLFrameOwnerElement*, bool clipToLayerContents) const; - virtual float visibleContentScaleFactor() const override; + float visibleContentScaleFactor() const final; -#if USE(TILED_BACKING_STORE) - virtual void setFixedVisibleContentRect(const IntRect&) override; +#if USE(COORDINATED_GRAPHICS) + void setFixedVisibleContentRect(const IntRect&) final; #endif - virtual void setScrollPosition(const IntPoint&) override; - void scrollPositionChangedViaPlatformWidget(); - virtual void updateLayerPositionsAfterScrolling() override; - virtual void updateCompositingLayersAfterScrolling() override; - virtual bool requestScrollPositionUpdate(const IntPoint&) override; - virtual bool isRubberBandInProgress() const override; - virtual IntPoint minimumScrollPosition() const override; - virtual IntPoint maximumScrollPosition() const override; + WEBCORE_EXPORT void setScrollPosition(const ScrollPosition&) final; + void updateLayerPositionsAfterScrolling() final; + void updateCompositingLayersAfterScrolling() final; + bool requestScrollPositionUpdate(const ScrollPosition&) final; + bool isRubberBandInProgress() const final; + WEBCORE_EXPORT ScrollPosition minimumScrollPosition() const final; + WEBCORE_EXPORT ScrollPosition maximumScrollPosition() const final; + + // The scrollOrigin, scrollPosition, minimumScrollPosition and maximumScrollPosition are all affected by frame scale, + // but layoutViewport computations require unscaled scroll positions. + ScrollPosition unscaledMinimumScrollPosition() const; + ScrollPosition unscaledMaximumScrollPosition() const; + + IntPoint unscaledScrollOrigin() const; + + WEBCORE_EXPORT LayoutPoint minStableLayoutViewportOrigin() const; + WEBCORE_EXPORT LayoutPoint maxStableLayoutViewportOrigin() const; + + enum class TriggerLayoutOrNot { + No, + Yes + }; + // This origin can be overridden by setLayoutViewportOverrideRect. + void setBaseLayoutViewportOrigin(LayoutPoint, TriggerLayoutOrNot = TriggerLayoutOrNot::Yes); + // This size can be overridden by setLayoutViewportOverrideRect. + WEBCORE_EXPORT LayoutSize baseLayoutViewportSize() const; + + // If set, overrides the default "m_layoutViewportOrigin, size of initial containing block" rect. + // Used with delegated scrolling (i.e. iOS). + WEBCORE_EXPORT void setLayoutViewportOverrideRect(std::optional<LayoutRect>); + + // These are in document coordinates, unaffected by zooming. + WEBCORE_EXPORT LayoutRect layoutViewportRect() const; + WEBCORE_EXPORT LayoutRect visualViewportRect() const; + + static LayoutRect visibleDocumentRect(const FloatRect& visibleContentRect, float headerHeight, float footerHeight, const FloatSize& totalContentsSize, float pageScaleFactor); // This is different than visibleContentRect() in that it ignores negative (or overly positive) // offsets from rubber-banding, and it takes zooming into account. LayoutRect viewportConstrainedVisibleContentRect() const; + + LayoutRect rectForFixedPositionLayout() const; + + void viewportContentsChanged(); + WEBCORE_EXPORT void resumeVisibleImageAnimationsIncludingSubframes(); String mediaType() const; - void setMediaType(const String&); + WEBCORE_EXPORT void setMediaType(const String&); void adjustMediaTypeForPrinting(bool printing); void setCannotBlitToWindow(); void setIsOverlapped(bool); - bool isOverlapped() const { return m_isOverlapped; } - bool isOverlappedIncludingAncestors() const; void setContentIsOpaque(bool); void addSlowRepaintObject(RenderElement*); void removeSlowRepaintObject(RenderElement*); - bool hasSlowRepaintObject(RenderElement* o) const { return m_slowRepaintObjects && m_slowRepaintObjects->contains(o); } + bool hasSlowRepaintObject(const RenderElement& renderer) const { return m_slowRepaintObjects && m_slowRepaintObjects->contains(&renderer); } bool hasSlowRepaintObjects() const { return m_slowRepaintObjects && m_slowRepaintObjects->size(); } // Includes fixed- and sticky-position objects. @@ -251,31 +295,48 @@ public: void removeViewportConstrainedObject(RenderElement*); const ViewportConstrainedObjectSet* viewportConstrainedObjects() const { return m_viewportConstrainedObjects.get(); } bool hasViewportConstrainedObjects() const { return m_viewportConstrainedObjects && m_viewportConstrainedObjects->size() > 0; } + + float frameScaleFactor() const; // Functions for querying the current scrolled position, negating the effects of overhang // and adjusting for page scale. - IntSize scrollOffsetForFixedPosition() const; + LayoutPoint scrollPositionForFixedPosition() const; + // Static function can be called from another thread. - static IntSize scrollOffsetForFixedPosition(const IntRect& visibleContentRect, const IntSize& totalContentsSize, const IntPoint& scrollPosition, const IntPoint& scrollOrigin, float frameScaleFactor, bool fixedElementsLayoutRelativeToFrame, ScrollBehaviorForFixedElements, int headerHeight, int footerHeight); + static LayoutPoint scrollPositionForFixedPosition(const LayoutRect& visibleContentRect, const LayoutSize& totalContentsSize, const LayoutPoint& scrollPosition, const LayoutPoint& scrollOrigin, float frameScaleFactor, bool fixedElementsLayoutRelativeToFrame, ScrollBehaviorForFixedElements, int headerHeight, int footerHeight); + + WEBCORE_EXPORT static LayoutPoint computeLayoutViewportOrigin(const LayoutRect& visualViewport, const LayoutPoint& stableLayoutViewportOriginMin, const LayoutPoint& stableLayoutViewportOriginMax, const LayoutRect& layoutViewport, ScrollBehaviorForFixedElements fixedBehavior); + + // These layers are positioned differently when there is a topContentInset, a header, or a footer. These value need to be computed + // on both the main thread and the scrolling thread. + static float yPositionForInsetClipLayer(const FloatPoint& scrollPosition, float topContentInset); + WEBCORE_EXPORT static FloatPoint positionForRootContentLayer(const FloatPoint& scrollPosition, const FloatPoint& scrollOrigin, float topContentInset, float headerHeight); + WEBCORE_EXPORT FloatPoint positionForRootContentLayer() const; + + static float yPositionForHeaderLayer(const FloatPoint& scrollPosition, float topContentInset); + static float yPositionForFooterLayer(const FloatPoint& scrollPosition, float topContentInset, float totalContentsHeight, float footerHeight); +#if PLATFORM(IOS) + WEBCORE_EXPORT LayoutRect viewportConstrainedObjectsRect() const; + // Static function can be called from another thread. + WEBCORE_EXPORT static LayoutRect rectForViewportConstrainedObjects(const LayoutRect& visibleContentRect, const LayoutSize& totalContentsSize, float frameScaleFactor, bool fixedElementsLayoutRelativeToFrame, ScrollBehaviorForFixedElements); +#endif + bool fixedElementsLayoutRelativeToFrame() const; - void disableLayerFlushThrottlingTemporarilyForInteraction(); - void updateLayerFlushThrottlingInAllFrames(); - void adjustTiledBackingCoverage(); + WEBCORE_EXPORT void disableLayerFlushThrottlingTemporarilyForInteraction(); bool speculativeTilingEnabled() const { return m_speculativeTilingEnabled; } + void loadProgressingStatusChanged(); #if ENABLE(DASHBOARD_SUPPORT) void updateAnnotatedRegions(); #endif - void updateControlTints(); + WEBCORE_EXPORT void updateControlTints(); void restoreScrollbar(); - void postLayoutTimerFired(Timer<FrameView>&); - - bool wasScrolledByUser() const; - void setWasScrolledByUser(bool); + WEBCORE_EXPORT bool wasScrolledByUser() const; + WEBCORE_EXPORT void setWasScrolledByUser(bool); bool safeToPropagateScrollToParent() const { return m_safeToPropagateScrollToParent; } void setSafeToPropagateScrollToParent(bool isSafe) { m_safeToPropagateScrollToParent = isSafe; } @@ -283,40 +344,64 @@ public: void addEmbeddedObjectToUpdate(RenderEmbeddedObject&); void removeEmbeddedObjectToUpdate(RenderEmbeddedObject&); - virtual void paintContents(GraphicsContext*, const IntRect& damageRect) override; - void setPaintBehavior(PaintBehavior); - PaintBehavior paintBehavior() const; + WEBCORE_EXPORT void paintContents(GraphicsContext&, const IntRect& dirtyRect, SecurityOriginPaintPolicy = SecurityOriginPaintPolicy::AnyOrigin) final; + + struct PaintingState { + PaintBehavior paintBehavior; + bool isTopLevelPainter; + bool isFlatteningPaintOfRootFrame; + PaintingState() + : paintBehavior() + , isTopLevelPainter(false) + , isFlatteningPaintOfRootFrame(false) + { + } + }; + + void willPaintContents(GraphicsContext&, const IntRect& dirtyRect, PaintingState&); + void didPaintContents(GraphicsContext&, const IntRect& dirtyRect, PaintingState&); + +#if PLATFORM(IOS) + WEBCORE_EXPORT void didReplaceMultipartContent(); +#endif + + WEBCORE_EXPORT void setPaintBehavior(PaintBehavior); + WEBCORE_EXPORT PaintBehavior paintBehavior() const; bool isPainting() const; bool hasEverPainted() const { return m_lastPaintTime; } void setLastPaintTime(double lastPaintTime) { m_lastPaintTime = lastPaintTime; } - void setNodeToDraw(Node*); + WEBCORE_EXPORT void setNodeToDraw(Node*); enum SelectionInSnapshot { IncludeSelection, ExcludeSelection }; enum CoordinateSpaceForSnapshot { DocumentCoordinates, ViewCoordinates }; - void paintContentsForSnapshot(GraphicsContext*, const IntRect& imageRect, SelectionInSnapshot shouldPaintSelection, CoordinateSpaceForSnapshot); + WEBCORE_EXPORT void paintContentsForSnapshot(GraphicsContext&, const IntRect& imageRect, SelectionInSnapshot shouldPaintSelection, CoordinateSpaceForSnapshot); - virtual void paintOverhangAreas(GraphicsContext*, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect) override; - virtual void paintScrollCorner(GraphicsContext*, const IntRect& cornerRect) override; - virtual void paintScrollbar(GraphicsContext*, Scrollbar*, const IntRect&) override; + void paintOverhangAreas(GraphicsContext&, const IntRect& horizontalOverhangArea, const IntRect& verticalOverhangArea, const IntRect& dirtyRect) final; + void paintScrollCorner(GraphicsContext&, const IntRect& cornerRect) final; + void paintScrollbar(GraphicsContext&, Scrollbar&, const IntRect&) final; - Color documentBackgroundColor() const; + WEBCORE_EXPORT Color documentBackgroundColor() const; bool isInChildFrameWithFrameFlattening() const; + void startDisallowingLayout() { ++m_layoutDisallowedCount; } + void endDisallowingLayout() { ASSERT(m_layoutDisallowedCount > 0); --m_layoutDisallowedCount; } + bool layoutDisallowed() const { return m_layoutDisallowedCount; } + static double currentPaintTimeStamp() { return sCurrentPaintTimeStamp; } // returns 0 if not painting - void updateLayoutAndStyleIfNeededRecursive(); + WEBCORE_EXPORT void updateLayoutAndStyleIfNeededRecursive(); void incrementVisuallyNonEmptyCharacterCount(unsigned); void incrementVisuallyNonEmptyPixelCount(const IntSize&); void updateIsVisuallyNonEmpty(); bool isVisuallyNonEmpty() const { return m_isVisuallyNonEmpty; } - void enableAutoSizeMode(bool enable, const IntSize& minSize, const IntSize& maxSize); - void setAutoSizeFixedMinimumHeight(int fixedMinimumHeight); + WEBCORE_EXPORT void enableAutoSizeMode(bool enable, const IntSize& minSize, const IntSize& maxSize); + WEBCORE_EXPORT void setAutoSizeFixedMinimumHeight(int); IntSize autoSizingIntrinsicContentSize() const { return m_autoSizeContentSize; } - void forceLayout(bool allowSubtree = false); - void forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor, AdjustViewSizeOrNot); + WEBCORE_EXPORT void forceLayout(bool allowSubtree = false); + WEBCORE_EXPORT void forceLayoutForPagination(const FloatSize& pageSize, const FloatSize& originalPageSize, float maximumShrinkFactor, AdjustViewSizeOrNot); // FIXME: This method is retained because of embedded WebViews in AppKit. When a WebView is embedded inside // some enclosing view with auto-pagination, no call happens to resize the view. The new pagination model @@ -334,60 +419,75 @@ public: // but that doesn't solve the general problem of how other AppKit views could opt in to the better model. // // NO OTHER PLATFORM BESIDES MAC SHOULD USE THIS METHOD. - void adjustPageHeightDeprecated(float* newBottom, float oldTop, float oldBottom, float bottomLimit); + WEBCORE_EXPORT void adjustPageHeightDeprecated(float* newBottom, float oldTop, float oldBottom, float bottomLimit); bool scrollToFragment(const URL&); bool scrollToAnchor(const String&); - void maintainScrollPositionAtAnchor(Node*); - void scrollElementToRect(Element*, const IntRect&); + void maintainScrollPositionAtAnchor(ContainerNode*); + WEBCORE_EXPORT void scrollElementToRect(const Element&, const IntRect&); // Methods to convert points and rects between the coordinate space of the renderer, and this view. - IntRect convertFromRenderer(const RenderElement*, const IntRect&) const; - IntRect convertToRenderer(const RenderElement*, const IntRect&) const; - IntPoint convertFromRenderer(const RenderElement*, const IntPoint&) const; - IntPoint convertToRenderer(const RenderElement*, const IntPoint&) const; - - bool isFrameViewScrollCorner(RenderScrollbarPart* scrollCorner) const { return m_scrollCorner == scrollCorner; } - - bool isScrollable(); + WEBCORE_EXPORT IntRect convertFromRendererToContainingView(const RenderElement*, const IntRect&) const; + WEBCORE_EXPORT IntRect convertFromContainingViewToRenderer(const RenderElement*, const IntRect&) const; + WEBCORE_EXPORT IntPoint convertFromRendererToContainingView(const RenderElement*, const IntPoint&) const; + WEBCORE_EXPORT IntPoint convertFromContainingViewToRenderer(const RenderElement*, const IntPoint&) const; + + // Override ScrollView methods to do point conversion via renderers, in order to take transforms into account. + IntRect convertToContainingView(const IntRect&) const final; + IntRect convertFromContainingView(const IntRect&) const final; + IntPoint convertToContainingView(const IntPoint&) const final; + IntPoint convertFromContainingView(const IntPoint&) const final; + + bool isFrameViewScrollCorner(const RenderScrollbarPart& scrollCorner) const { return m_scrollCorner == &scrollCorner; } + + // isScrollable() takes an optional Scrollability parameter that allows the caller to define what they mean by 'scrollable.' + // Most callers are interested in the default value, Scrollability::Scrollable, which means that there is actually content + // to scroll to, and a scrollbar that will allow you to access it. In some cases, callers want to know if the FrameView is allowed + // to rubber-band, which the main frame might be allowed to do even if there is no content to scroll to. In that case, + // callers use Scrollability::ScrollableOrRubberbandable. + enum class Scrollability { Scrollable, ScrollableOrRubberbandable }; + WEBCORE_EXPORT bool isScrollable(Scrollability definitionOfScrollable = Scrollability::Scrollable); + + bool isScrollableOrRubberbandable() final; + bool hasScrollableOrRubberbandableAncestor() final; enum ScrollbarModesCalculationStrategy { RulesFromWebContentOnly, AnyRule }; void calculateScrollbarModesForLayout(ScrollbarMode& hMode, ScrollbarMode& vMode, ScrollbarModesCalculationStrategy = AnyRule); - virtual IntPoint lastKnownMousePosition() const override; - virtual bool isHandlingWheelEvent() const override; + IntPoint lastKnownMousePosition() const final; + bool isHandlingWheelEvent() const final; bool shouldSetCursor() const; // FIXME: Remove this method once plugin loading is decoupled from layout. void flushAnyPendingPostLayoutTasks(); - virtual bool shouldSuspendScrollAnimations() const override; - virtual void scrollbarStyleChanged(int newStyle, bool forceUpdate) override; + bool shouldSuspendScrollAnimations() const final; + void scrollbarStyleChanged(ScrollbarStyle, bool forceUpdate) override; RenderBox* embeddedContentBox() const; - void setTracksRepaints(bool); + WEBCORE_EXPORT void setTracksRepaints(bool); bool isTrackingRepaints() const { return m_isTrackingRepaints; } - void resetTrackedRepaints(); - const Vector<IntRect>& trackedRepaintRects() const { return m_trackedRepaintRects; } + WEBCORE_EXPORT void resetTrackedRepaints(); + const Vector<FloatRect>& trackedRepaintRects() const { return m_trackedRepaintRects; } String trackedRepaintRectsAsText() const; typedef HashSet<ScrollableArea*> ScrollableAreaSet; // Returns whether the scrollable area has just been newly added. - bool addScrollableArea(ScrollableArea*); + WEBCORE_EXPORT bool addScrollableArea(ScrollableArea*); // Returns whether the scrollable area has just been removed. - bool removeScrollableArea(ScrollableArea*); + WEBCORE_EXPORT bool removeScrollableArea(ScrollableArea*); bool containsScrollableArea(ScrollableArea*) const; const ScrollableAreaSet* scrollableAreas() const { return m_scrollableAreas.get(); } - virtual void removeChild(Widget*) override; + void removeChild(Widget&) final; // This function exists for ports that need to handle wheel events manually. // On Mac WebKit1 the underlying NSScrollView just does the scrolling, but on most other platforms // we need this function in order to do the scroll ourselves. bool wheelEvent(const PlatformWheelEvent&); - void setScrollingPerformanceLoggingEnabled(bool); + WEBCORE_EXPORT void setScrollingPerformanceLoggingEnabled(bool); // Page and FrameView both store a Pagination value. Page::pagination() is set only by API, // and FrameView::pagination() is set only by CSS. Page::pagination() will affect all @@ -398,7 +498,7 @@ public: const Pagination& pagination() const; void setPagination(const Pagination&); - bool inProgrammaticScroll() const { return m_inProgrammaticScroll; } + bool inProgrammaticScroll() const final { return m_inProgrammaticScroll; } void setInProgrammaticScroll(bool programmaticScroll) { m_inProgrammaticScroll = programmaticScroll; } #if ENABLE(CSS_DEVICE_ADAPTATION) @@ -406,54 +506,98 @@ public: void setInitialViewportSize(const IntSize& size) { m_initialViewportSize = size; } #endif - virtual bool isActive() const override; - virtual bool updatesScrollLayerPositionOnMainThread() const override; + bool isActive() const final; + bool forceUpdateScrollbarsOnMainThreadForPerformanceTesting() const final; #if ENABLE(RUBBER_BANDING) - GraphicsLayer* setWantsLayerForTopOverHangArea(bool) const; - GraphicsLayer* setWantsLayerForBottomOverHangArea(bool) const; + WEBCORE_EXPORT GraphicsLayer* setWantsLayerForTopOverHangArea(bool) const; + WEBCORE_EXPORT GraphicsLayer* setWantsLayerForBottomOverHangArea(bool) const; #endif - virtual int headerHeight() const override { return m_headerHeight; } - void setHeaderHeight(int); - virtual int footerHeight() const override { return m_footerHeight; } - void setFooterHeight(int); + // This function "smears" the "position:fixed" uninflatedBounds for scrolling, returning a rect that is the union of + // all possible locations of the given rect under page scrolling. + LayoutRect fixedScrollableAreaBoundsInflatedForScrolling(const LayoutRect& uninflatedBounds) const; + + LayoutPoint scrollPositionRespectingCustomFixedPosition() const; + + int headerHeight() const final { return m_headerHeight; } + WEBCORE_EXPORT void setHeaderHeight(int); + int footerHeight() const final { return m_footerHeight; } + WEBCORE_EXPORT void setFooterHeight(int); + + WEBCORE_EXPORT float topContentInset(TopContentInsetType = TopContentInsetType::WebCoreContentInset) const final; + void topContentInsetDidChange(float newTopContentInset); + + void topContentDirectionDidChange(); - virtual void willStartLiveResize() override; - virtual void willEndLiveResize() override; + WEBCORE_EXPORT void willStartLiveResize() final; + WEBCORE_EXPORT void willEndLiveResize() final; + + WEBCORE_EXPORT void availableContentSizeChanged(AvailableSizeChangeReason) final; + + void updateTiledBackingAdaptiveSizing(); + TiledBacking::Scrollability computeScrollability() const; void addPaintPendingMilestones(LayoutMilestones); - void firePaintRelatedMilestones(); + void firePaintRelatedMilestonesIfNeeded(); + void fireLayoutRelatedMilestonesIfNeeded(); LayoutMilestones milestonesPendingPaint() const { return m_milestonesPendingPaint; } bool visualUpdatesAllowedByClient() const { return m_visualUpdatesAllowedByClient; } - void setVisualUpdatesAllowedByClient(bool); + WEBCORE_EXPORT void setVisualUpdatesAllowedByClient(bool); - void setScrollPinningBehavior(ScrollPinningBehavior); + WEBCORE_EXPORT void setScrollPinningBehavior(ScrollPinningBehavior); ScrollBehaviorForFixedElements scrollBehaviorForFixedElements() const; + bool hasFlippedBlockRenderers() const { return m_hasFlippedBlockRenderers; } + void setHasFlippedBlockRenderers(bool b) { m_hasFlippedBlockRenderers = b; } + void updateWidgetPositions(); void didAddWidgetToRenderTree(Widget&); void willRemoveWidgetFromRenderTree(Widget&); - void addTrackedRepaintRect(const IntRect&); + const HashSet<Widget*>& widgetsInRenderTree() const { return m_widgetsInRenderTree; } + + typedef Vector<Ref<FrameView>, 16> FrameViewList; + FrameViewList renderedChildFrameViews() const; + + void addTrackedRepaintRect(const FloatRect&); // exposedRect represents WebKit's understanding of what part // of the view is actually exposed on screen (taking into account // clipping by other UI elements), whereas visibleContentRect is // internal to WebCore and doesn't respect those things. - void setExposedRect(FloatRect); - FloatRect exposedRect() const { return m_exposedRect; } + WEBCORE_EXPORT void setViewExposedRect(std::optional<FloatRect>); + std::optional<FloatRect> viewExposedRect() const { return m_viewExposedRect; } + +#if ENABLE(CSS_SCROLL_SNAP) + void updateSnapOffsets() final; + bool isScrollSnapInProgress() const final; + void updateScrollingCoordinatorScrollSnapProperties() const; +#endif + + float adjustScrollStepForFixedContent(float step, ScrollbarOrientation, ScrollGranularity) final; + + void didChangeScrollOffset(); + + void show() final; + + bool shouldPlaceBlockDirectionScrollbarOnLeft() const final; + + void didRestoreFromPageCache(); + + void willDestroyRenderTree(); + void didDestroyRenderTree(); protected: - virtual bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) override; - virtual void scrollContentsSlowPath(const IntRect& updateRect) override; + bool scrollContentsFastPath(const IntSize& scrollDelta, const IntRect& rectToScroll, const IntRect& clipRect) final; + void scrollContentsSlowPath(const IntRect& updateRect) final; void repaintSlowRepaintObjects(); - virtual bool isVerticalDocument() const override; - virtual bool isFlippedDocument() const override; + bool isVerticalDocument() const final; + bool isFlippedDocument() const final; private: explicit FrameView(Frame&); @@ -465,90 +609,107 @@ private: OutsideLayout, InPreLayout, InPreLayoutStyleUpdate, - InLayout, + InRenderTreeLayout, InViewSizeAdjust, InPostLayout, + InPostLayerPositionsUpdatedAfterLayout, }; LayoutPhase layoutPhase() const { return m_layoutPhase; } bool inPreLayoutStyleUpdate() const { return m_layoutPhase == InPreLayoutStyleUpdate; } - virtual bool isFrameView() const override { return true; } + bool isFrameView() const final { return true; } friend class RenderWidget; bool useSlowRepaints(bool considerOverlap = true) const; bool useSlowRepaintsIfNotOverlapped() const; void updateCanBlitOnScrollRecursively(); - bool contentsInCompositedLayer() const; + bool shouldLayoutAfterContentsResized() const; bool shouldUpdateCompositingLayersAfterScrolling() const; + bool flushCompositingStateForThisFrame(const Frame& rootFrameForFlush); - void applyOverflowToViewport(RenderElement*, ScrollbarMode& hMode, ScrollbarMode& vMode); + bool shouldDeferScrollUpdateAfterContentSizeChange() final; + + void scrollOffsetChangedViaPlatformWidgetImpl(const ScrollOffset& oldOffset, const ScrollOffset& newOffset) final; + + void applyOverflowToViewport(const RenderElement&, ScrollbarMode& hMode, ScrollbarMode& vMode); void applyPaginationToViewport(); void updateOverflowStatus(bool horizontalOverflow, bool verticalOverflow); - void paintControlTints(); + WEBCORE_EXPORT void paintControlTints(); void forceLayoutParentViewIfNeeded(); + void flushPostLayoutTasksQueue(); void performPostLayoutTasks(); void autoSizeIfEnabled(); - virtual void repaintContentRectangle(const IntRect&, bool immediate) override; - virtual void contentsResized() override; - virtual void visibleContentsResized() override; - virtual void addedOrRemovedScrollbar() override; - virtual void fixedLayoutSizeChanged() override; + void applyRecursivelyWithVisibleRect(const std::function<void (FrameView& frameView, const IntRect& visibleRect)>&); + void resumeVisibleImageAnimations(const IntRect& visibleRect); + void updateScriptedAnimationsAndTimersThrottlingState(const IntRect& visibleRect); + + void updateLayerFlushThrottling(); + WEBCORE_EXPORT void adjustTiledBackingCoverage(); - virtual void delegatesScrollingDidChange() override; + void repaintContentRectangle(const IntRect&) final; + void addedOrRemovedScrollbar() final; - // Override ScrollView methods to do point conversion via renderers, in order to - // take transforms into account. - virtual IntRect convertToContainingView(const IntRect&) const override; - virtual IntRect convertFromContainingView(const IntRect&) const override; - virtual IntPoint convertToContainingView(const IntPoint&) const override; - virtual IntPoint convertFromContainingView(const IntPoint&) const override; + void delegatesScrollingDidChange() final; // ScrollableArea interface - virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) override; - virtual void scrollTo(const IntSize&) override; - virtual void setVisibleScrollerThumbRect(const IntRect&) override; - virtual ScrollableArea* enclosingScrollableArea() const override; - virtual IntRect scrollableAreaBoundingBox() const override; - virtual bool scrollAnimatorEnabled() const override; -#if USE(ACCELERATED_COMPOSITING) - virtual bool usesCompositedScrolling() const override; - virtual GraphicsLayer* layerForScrolling() const override; - virtual GraphicsLayer* layerForHorizontalScrollbar() const override; - virtual GraphicsLayer* layerForVerticalScrollbar() const override; - virtual GraphicsLayer* layerForScrollCorner() const override; + void invalidateScrollbarRect(Scrollbar&, const IntRect&) final; + void scrollTo(const ScrollPosition&) final; + void setVisibleScrollerThumbRect(const IntRect&) final; + ScrollableArea* enclosingScrollableArea() const final; + IntRect scrollableAreaBoundingBox(bool* = nullptr) const final; + bool scrollAnimatorEnabled() const final; + GraphicsLayer* layerForScrolling() const final; + GraphicsLayer* layerForHorizontalScrollbar() const final; + GraphicsLayer* layerForVerticalScrollbar() const final; + GraphicsLayer* layerForScrollCorner() const final; #if ENABLE(RUBBER_BANDING) - virtual GraphicsLayer* layerForOverhangAreas() const override; + GraphicsLayer* layerForOverhangAreas() const final; #endif + void contentsResized() final; + +#if PLATFORM(IOS) + void unobscuredContentSizeChanged() final; #endif + bool usesCompositedScrolling() const final; + bool usesAsyncScrolling() const final; + bool usesMockScrollAnimator() const final; + void logMockScrollAnimatorMessage(const String&) const final; + // Override scrollbar notifications to update the AXObject cache. - virtual void didAddScrollbar(Scrollbar*, ScrollbarOrientation) override; - virtual void willRemoveScrollbar(Scrollbar*, ScrollbarOrientation) override; + void didAddScrollbar(Scrollbar*, ScrollbarOrientation) final; + void willRemoveScrollbar(Scrollbar*, ScrollbarOrientation) final; + IntSize sizeForResizeEvent() const; void sendResizeEventIfNeeded(); + void handleDeferredScrollbarsUpdateAfterDirectionChange(); + void updateScrollableAreaSet(); + void updateLayoutViewport(); - virtual void notifyPageThatContentAreaWillPaint() const override; + void notifyPageThatContentAreaWillPaint() const final; void enableSpeculativeTilingIfNeeded(); - void speculativeTilingEnableTimerFired(Timer<FrameView>&); + void speculativeTilingEnableTimerFired(); - void updateEmbeddedObjectsTimerFired(Timer<FrameView>*); + void updateEmbeddedObjectsTimerFired(); bool updateEmbeddedObjects(); void updateEmbeddedObject(RenderEmbeddedObject&); void scrollToAnchor(); - void scrollPositionChanged(); + void scrollPositionChanged(const ScrollPosition& oldPosition, const ScrollPosition& newPosition); + void scrollableAreaSetChanged(); + void sendScrollEvent(); bool hasCustomScrollbars() const; - virtual void updateScrollCorner() override; + void updateScrollCorner() final; FrameView* parentFrameView() const; @@ -557,12 +718,17 @@ private: bool isFrameFlatteningValidForThisFrame() const; bool qualifiesAsVisuallyNonEmpty() const; + bool isViewForDocumentInFrame() const; AXObjectCache* axObjectCache() const; void notifyWidgetsInAllFrames(WidgetNotification); void removeFromAXObjectCache(); void notifyWidgets(WidgetNotification); + void convertSubtreeLayoutToFullLayout(); + + RenderElement* viewportRenderer() const; + HashSet<Widget*> m_widgetsInRenderTree; static double sCurrentPaintTimeStamp; // used for detecting decoded resource thrash in the cache @@ -570,32 +736,29 @@ private: LayoutSize m_size; LayoutSize m_margins; - OwnPtr<ListHashSet<RenderEmbeddedObject*>> m_embeddedObjectsToUpdate; - const RefPtr<Frame> m_frame; + std::unique_ptr<ListHashSet<RenderEmbeddedObject*>> m_embeddedObjectsToUpdate; + const Ref<Frame> m_frame; - OwnPtr<HashSet<RenderElement*>> m_slowRepaintObjects; + std::unique_ptr<HashSet<const RenderElement*>> m_slowRepaintObjects; bool m_needsFullRepaint; bool m_canHaveScrollbars; bool m_cannotBlitToWindow; - bool m_isOverlapped; + bool m_isOverlapped { false }; bool m_contentIsOpaque; - int m_borderX; - int m_borderY; - - Timer<FrameView> m_layoutTimer; + Timer m_layoutTimer; bool m_delayedLayout; - RenderElement* m_layoutRoot; + RenderElement* m_layoutRoot { nullptr }; LayoutPhase m_layoutPhase; bool m_layoutSchedulingEnabled; bool m_inSynchronousPostLayout; int m_layoutCount; unsigned m_nestedLayoutCount; - Timer<FrameView> m_postLayoutTasksTimer; - Timer<FrameView> m_updateEmbeddedObjectsTimer; + Timer m_postLayoutTasksTimer; + Timer m_updateEmbeddedObjectsTimer; bool m_firstLayoutCallbackPending; bool m_firstLayout; @@ -609,26 +772,32 @@ private: bool m_overflowStatusDirty; bool m_horizontalOverflow; - bool m_verticalOverflow; - RenderElement* m_viewportRenderer; + bool m_verticalOverflow; + enum class ViewportRendererType { None, Document, Body }; + ViewportRendererType m_viewportRendererType { ViewportRendererType::None }; Pagination m_pagination; bool m_wasScrolledByUser; bool m_inProgrammaticScroll; bool m_safeToPropagateScrollToParent; + Timer m_delayedScrollEventTimer; double m_lastPaintTime; bool m_isTrackingRepaints; // Used for testing. - Vector<IntRect> m_trackedRepaintRects; + Vector<FloatRect> m_trackedRepaintRects; bool m_shouldUpdateWhileOffscreen; - FloatRect m_exposedRect; + std::optional<FloatRect> m_viewExposedRect; + + LayoutPoint m_layoutViewportOrigin; + std::optional<LayoutRect> m_layoutViewportOverrideRect; - unsigned m_deferSetNeedsLayouts; + unsigned m_deferSetNeedsLayoutCount; bool m_setNeedsLayoutWasDeferred; + int m_layoutDisallowedCount { 0 }; RefPtr<Node> m_nodeToDraw; PaintBehavior m_paintBehavior; @@ -639,19 +808,27 @@ private: bool m_isVisuallyNonEmpty; bool m_firstVisuallyNonEmptyLayoutCallbackPending; - RefPtr<Node> m_maintainScrollPositionAnchor; + bool m_needsDeferredScrollbarsUpdate { false }; + + RefPtr<ContainerNode> m_maintainScrollPositionAnchor; // Renderer to hold our custom scroll corner. RenderPtr<RenderScrollbarPart> m_scrollCorner; bool m_speculativeTilingEnabled; - Timer<FrameView> m_speculativeTilingEnableTimer; + Timer m_speculativeTilingEnableTimer; #if PLATFORM(IOS) bool m_useCustomFixedPositionLayoutRect; IntRect m_customFixedPositionLayoutRect; + + bool m_useCustomSizeForResizeEvent; + IntSize m_customSizeForResizeEvent; #endif + IntSize m_overrideViewportSize; + bool m_hasOverrideViewportSize; + // If true, automatically resize the frame view around its content. bool m_shouldAutoSize; bool m_inAutoSize; @@ -666,8 +843,8 @@ private: // The intrinsic content size decided by autosizing. IntSize m_autoSizeContentSize; - OwnPtr<ScrollableAreaSet> m_scrollableAreas; - OwnPtr<ViewportConstrainedObjectSet> m_viewportConstrainedObjects; + std::unique_ptr<ScrollableAreaSet> m_scrollableAreas; + std::unique_ptr<ViewportConstrainedObjectSet> m_viewportConstrainedObjects; int m_headerHeight; int m_footerHeight; @@ -684,8 +861,12 @@ private: #endif bool m_visualUpdatesAllowedByClient; - + bool m_hasFlippedBlockRenderers; + ScrollPinningBehavior m_scrollPinningBehavior; + + IntRect* m_cachedWindowClipRect { nullptr }; + Vector<WTF::Function<void ()>> m_postLayoutCallbackQueue; }; inline void FrameView::incrementVisuallyNonEmptyCharacterCount(unsigned count) @@ -708,8 +889,6 @@ inline void FrameView::incrementVisuallyNonEmptyPixelCount(const IntSize& size) updateIsVisuallyNonEmpty(); } -WIDGET_TYPE_CASTS(FrameView, isFrameView()); - } // namespace WebCore -#endif // FrameView_h +SPECIALIZE_TYPE_TRAITS_WIDGET(FrameView, isFrameView()) |