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/rendering/RenderLayer.h | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WebCore/rendering/RenderLayer.h')
-rw-r--r-- | Source/WebCore/rendering/RenderLayer.h | 863 |
1 files changed, 344 insertions, 519 deletions
diff --git a/Source/WebCore/rendering/RenderLayer.h b/Source/WebCore/rendering/RenderLayer.h index 239214358..1ae683dd0 100644 --- a/Source/WebCore/rendering/RenderLayer.h +++ b/Source/WebCore/rendering/RenderLayer.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2003, 2009, 2012 Apple Inc. All rights reserved. + * Copyright (C) 2003, 2009, 2012, 2015 Apple Inc. All rights reserved. * * Portions are Copyright (C) 1998 Netscape Communications Corporation. * @@ -41,18 +41,21 @@ * version of this file under any of the LGPL, the MPL or the GPL. */ -#ifndef RenderLayer_h -#define RenderLayer_h +#pragma once +#include "ClipRect.h" #include "GraphicsLayer.h" +#include "LayerFragment.h" #include "PaintInfo.h" #include "RenderBox.h" #include "RenderPtr.h" #include "ScrollableArea.h" -#include <wtf/OwnPtr.h> +#include <memory> namespace WebCore { +class ClipRects; +class ClipRectsCache; class FilterEffectRenderer; class FilterEffectRendererHelper; class FilterOperations; @@ -81,147 +84,6 @@ enum RepaintStatus { NeedsFullRepaintForPositionedMovementLayout }; -class ClipRect { -public: - ClipRect() - : m_hasRadius(false) - { } - - ClipRect(const LayoutRect& rect) - : m_rect(rect) - , m_hasRadius(false) - { } - - const LayoutRect& rect() const { return m_rect; } - void setRect(const LayoutRect& rect) { m_rect = rect; } - - bool hasRadius() const { return m_hasRadius; } - void setHasRadius(bool hasRadius) { m_hasRadius = hasRadius; } - - bool operator==(const ClipRect& other) const { return rect() == other.rect() && hasRadius() == other.hasRadius(); } - bool operator!=(const ClipRect& other) const { return rect() != other.rect() || hasRadius() != other.hasRadius(); } - bool operator!=(const LayoutRect& otherRect) const { return rect() != otherRect; } - - void intersect(const LayoutRect& other) { m_rect.intersect(other); } - void intersect(const ClipRect& other) - { - m_rect.intersect(other.rect()); - if (other.hasRadius()) - m_hasRadius = true; - } - void move(LayoutUnit x, LayoutUnit y) { m_rect.move(x, y); } - void move(const LayoutSize& size) { m_rect.move(size); } - void moveBy(const LayoutPoint& point) { m_rect.moveBy(point); } - - bool isEmpty() const { return m_rect.isEmpty(); } - bool intersects(const LayoutRect& rect) const { return m_rect.intersects(rect); } - bool intersects(const HitTestLocation&) const; - - void inflateX(LayoutUnit dx) { m_rect.inflateX(dx); } - void inflateY(LayoutUnit dy) { m_rect.inflateY(dy); } - void inflate(LayoutUnit d) { inflateX(d); inflateY(d); } - -private: - LayoutRect m_rect; - bool m_hasRadius; -}; - -inline ClipRect intersection(const ClipRect& a, const ClipRect& b) -{ - ClipRect c = a; - c.intersect(b); - return c; -} - -class ClipRects { - WTF_MAKE_FAST_ALLOCATED; -public: - static PassRefPtr<ClipRects> create() - { - return adoptRef(new ClipRects); - } - - static PassRefPtr<ClipRects> create(const ClipRects& other) - { - return adoptRef(new ClipRects(other)); - } - - ClipRects() - : m_refCnt(1) - , m_fixed(false) - { - } - - void reset(const LayoutRect& r) - { - m_overflowClipRect = r; - m_fixedClipRect = r; - m_posClipRect = r; - m_fixed = false; - } - - const ClipRect& overflowClipRect() const { return m_overflowClipRect; } - void setOverflowClipRect(const ClipRect& r) { m_overflowClipRect = r; } - - const ClipRect& fixedClipRect() const { return m_fixedClipRect; } - void setFixedClipRect(const ClipRect&r) { m_fixedClipRect = r; } - - const ClipRect& posClipRect() const { return m_posClipRect; } - void setPosClipRect(const ClipRect& r) { m_posClipRect = r; } - - bool fixed() const { return m_fixed; } - void setFixed(bool fixed) { m_fixed = fixed; } - - void ref() { m_refCnt++; } - void deref() - { - if (!--m_refCnt) - delete this; - } - - bool operator==(const ClipRects& other) const - { - return m_overflowClipRect == other.overflowClipRect() && - m_fixedClipRect == other.fixedClipRect() && - m_posClipRect == other.posClipRect() && - m_fixed == other.fixed(); - } - - ClipRects& operator=(const ClipRects& other) - { - m_overflowClipRect = other.overflowClipRect(); - m_fixedClipRect = other.fixedClipRect(); - m_posClipRect = other.posClipRect(); - m_fixed = other.fixed(); - return *this; - } - -private: - ClipRects(const LayoutRect& r) - : m_overflowClipRect(r) - , m_fixedClipRect(r) - , m_posClipRect(r) - , m_refCnt(1) - , m_fixed(false) - { - } - - ClipRects(const ClipRects& other) - : m_overflowClipRect(other.overflowClipRect()) - , m_fixedClipRect(other.fixedClipRect()) - , m_posClipRect(other.posClipRect()) - , m_refCnt(1) - , m_fixed(other.fixed()) - { - } - - ClipRect m_overflowClipRect; - ClipRect m_fixedClipRect; - ClipRect m_posClipRect; - unsigned m_refCnt : 31; - bool m_fixed : 1; -}; - enum ClipRectsType { PaintingClipRects, // Relative to painting ancestor. Used for painting. RootRelativeClipRects, // Relative to the ancestor treated as the root (e.g. transformed layer). Used for hit testing. @@ -236,86 +98,19 @@ enum ShouldRespectOverflowClip { RespectOverflowClip }; -struct ClipRectsCache { - WTF_MAKE_FAST_ALLOCATED; -public: - ClipRectsCache() - { -#ifndef NDEBUG - for (int i = 0; i < NumCachedClipRectsTypes; ++i) { - m_clipRectsRoot[i] = 0; - m_scrollbarRelevancy[i] = IgnoreOverlayScrollbarSize; - } -#endif - } - - PassRefPtr<ClipRects> getClipRects(ClipRectsType clipRectsType, ShouldRespectOverflowClip respectOverflow) { return m_clipRects[getIndex(clipRectsType, respectOverflow)]; } - void setClipRects(ClipRectsType clipRectsType, ShouldRespectOverflowClip respectOverflow, PassRefPtr<ClipRects> clipRects) { m_clipRects[getIndex(clipRectsType, respectOverflow)] = clipRects; } - -#ifndef NDEBUG - const RenderLayer* m_clipRectsRoot[NumCachedClipRectsTypes]; - OverlayScrollbarSizeRelevancy m_scrollbarRelevancy[NumCachedClipRectsTypes]; -#endif - -private: - int getIndex(ClipRectsType clipRectsType, ShouldRespectOverflowClip respectOverflow) - { - int index = static_cast<int>(clipRectsType); - if (respectOverflow == RespectOverflowClip) - index += static_cast<int>(NumCachedClipRectsTypes); - return index; - } - - RefPtr<ClipRects> m_clipRects[NumCachedClipRectsTypes * 2]; +enum ShouldApplyRootOffsetToFragments { + ApplyRootOffsetToFragments, + IgnoreRootOffsetForFragments }; -struct LayerFragment { -public: - LayerFragment() - : shouldPaintContent(false) - { } - - void setRects(const LayoutRect& bounds, const ClipRect& background, const ClipRect& foreground, const ClipRect& outline) - { - layerBounds = bounds; - backgroundRect = background; - foregroundRect = foreground; - outlineRect = outline; - } - - void moveBy(const LayoutPoint& offset) - { - layerBounds.moveBy(offset); - backgroundRect.moveBy(offset); - foregroundRect.moveBy(offset); - outlineRect.moveBy(offset); - paginationClip.moveBy(offset); - } - - void intersect(const LayoutRect& rect) - { - backgroundRect.intersect(rect); - foregroundRect.intersect(rect); - outlineRect.intersect(rect); - } - - bool shouldPaintContent; - LayoutRect layerBounds; - ClipRect backgroundRect; - ClipRect foregroundRect; - ClipRect outlineRect; - - // Unique to paginated fragments. The physical translation to apply to shift the layer when painting/hit-testing. - LayoutPoint paginationOffset; - - // Also unique to paginated fragments. An additional clip that applies to the layer. It is in layer-local - // (physical) coordinates. - LayoutRect paginationClip; +enum LayerScrollCoordinationRole { + ViewportConstrained = 1 << 0, + Scrolling = 1 << 1 }; - -typedef Vector<LayerFragment, 1> LayerFragments; +typedef unsigned LayerScrollCoordinationRoles; class RenderLayer final : public ScrollableArea { + WTF_MAKE_FAST_ALLOCATED; public: friend class RenderReplica; @@ -329,22 +124,23 @@ public: String name() const; RenderLayerModelObject& renderer() const { return m_renderer; } - RenderBox* renderBox() const { return renderer().isBox() ? &toRenderBox(renderer()) : 0; } + RenderBox* renderBox() const { return is<RenderBox>(renderer()) ? &downcast<RenderBox>(renderer()) : nullptr; } RenderLayer* parent() const { return m_parent; } RenderLayer* previousSibling() const { return m_previous; } RenderLayer* nextSibling() const { return m_next; } RenderLayer* firstChild() const { return m_first; } RenderLayer* lastChild() const { return m_last; } - void addChild(RenderLayer* newChild, RenderLayer* beforeChild = 0); + void addChild(RenderLayer* newChild, RenderLayer* beforeChild = nullptr); RenderLayer* removeChild(RenderLayer*); + Page& page() const { return renderer().page(); } + void removeOnlyThisLayer(); void insertOnlyThisLayer(); void repaintIncludingDescendants(); -#if USE(ACCELERATED_COMPOSITING) // Indicate that the layer contents need to be repainted. Only has an effect // if layer compositing is being used. void setBackingNeedsRepaint(GraphicsLayer::ShouldClipToLayer = GraphicsLayer::ClipToLayer); @@ -352,7 +148,6 @@ public: // The rect is in the coordinate space of the layer's render object. void setBackingNeedsRepaintInRect(const LayoutRect&, GraphicsLayer::ShouldClipToLayer = GraphicsLayer::ClipToLayer); void repaintIncludingNonCompositingDescendants(RenderLayerModelObject* repaintContainer); -#endif void styleChanged(StyleDifference, const RenderStyle* oldStyle); @@ -363,9 +158,7 @@ public: bool cannotBlitToWindow() const; - bool isTransparent() const; - RenderLayer* transparentPaintingAncestor(); - void beginTransparencyLayers(GraphicsContext*, const RenderLayer* rootLayer, const LayoutRect& paintDirtyRect, PaintBehavior); + bool isTransparent() const { return renderer().isTransparent() || renderer().hasMask(); } bool hasReflection() const { return renderer().hasReflection(); } bool isReflection() const { return renderer().isReplica(); } @@ -399,54 +192,70 @@ public: }; // Scrolling methods for layers that can scroll their overflow. - void scrollByRecursively(const IntSize&, ScrollOffsetClamping = ScrollOffsetUnclamped, ScrollableArea** scrolledArea = 0); - void scrollToOffset(const IntSize&, ScrollOffsetClamping = ScrollOffsetUnclamped); - void scrollToXOffset(int x, ScrollOffsetClamping clamp = ScrollOffsetUnclamped) { scrollToOffset(IntSize(x, scrollYOffset()), clamp); } - void scrollToYOffset(int y, ScrollOffsetClamping clamp = ScrollOffsetUnclamped) { scrollToOffset(IntSize(scrollXOffset(), y), clamp); } + void scrollByRecursively(const IntSize& delta, ScrollOffsetClamping = ScrollOffsetUnclamped, ScrollableArea** scrolledArea = nullptr); + + WEBCORE_EXPORT void scrollToOffset(const ScrollOffset&, ScrollOffsetClamping = ScrollOffsetUnclamped); + void scrollToXOffset(int x, ScrollOffsetClamping clamp = ScrollOffsetUnclamped) { scrollToOffset(ScrollOffset(x, scrollOffset().y()), clamp); } + void scrollToYOffset(int y, ScrollOffsetClamping clamp = ScrollOffsetUnclamped) { scrollToOffset(ScrollOffset(scrollOffset().x(), y), clamp); } - int scrollXOffset() const { return m_scrollOffset.width() + scrollOrigin().x(); } - int scrollYOffset() const { return m_scrollOffset.height() + scrollOrigin().y(); } - IntSize scrollOffset() const { return IntSize(scrollXOffset(), scrollYOffset()); } + void scrollToXPosition(int x, ScrollOffsetClamping = ScrollOffsetUnclamped); + void scrollToYPosition(int y, ScrollOffsetClamping = ScrollOffsetUnclamped); - void scrollRectToVisible(const LayoutRect&, const ScrollAlignment& alignX, const ScrollAlignment& alignY); + ScrollOffset scrollOffset() const { return scrollOffsetFromPosition(m_scrollPosition); } + IntSize scrollableContentsSize() const; - LayoutRect getRectToExpose(const LayoutRect& visibleRect, const LayoutRect& visibleRectRelativeToDocument, const LayoutRect& exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& alignY); + void availableContentSizeChanged(AvailableSizeChangeReason) override; + + // "absoluteRect" is in scaled document coordinates. + void scrollRectToVisible(SelectionRevealMode, const LayoutRect& absoluteRect, bool insideFixed, const ScrollAlignment& alignX, const ScrollAlignment& alignY); bool scrollsOverflow() const; bool hasScrollbars() const { return m_hBar || m_vBar; } void setHasHorizontalScrollbar(bool); void setHasVerticalScrollbar(bool); - PassRefPtr<Scrollbar> createScrollbar(ScrollbarOrientation); + Ref<Scrollbar> createScrollbar(ScrollbarOrientation); void destroyScrollbar(ScrollbarOrientation); bool hasHorizontalScrollbar() const { return horizontalScrollbar(); } bool hasVerticalScrollbar() const { return verticalScrollbar(); } // ScrollableArea overrides - virtual Scrollbar* horizontalScrollbar() const override { return m_hBar.get(); } - virtual Scrollbar* verticalScrollbar() const override { return m_vBar.get(); } - virtual ScrollableArea* enclosingScrollableArea() const override; + ScrollPosition scrollPosition() const override { return m_scrollPosition; } + + Scrollbar* horizontalScrollbar() const override { return m_hBar.get(); } + Scrollbar* verticalScrollbar() const override { return m_vBar.get(); } + ScrollableArea* enclosingScrollableArea() const override; + bool isScrollableOrRubberbandable() override; + bool hasScrollableOrRubberbandableAncestor() override; +#if ENABLE(CSS_SCROLL_SNAP) + void updateSnapOffsets() override; +#endif #if PLATFORM(IOS) #if ENABLE(TOUCH_EVENTS) - virtual bool handleTouchEvent(const PlatformTouchEvent&) override; - virtual bool isTouchScrollable() const override { return true; } + bool handleTouchEvent(const PlatformTouchEvent&) override; + bool isTouchScrollable() const override { return true; } #endif - virtual bool isOverflowScroll() const override { return true; } + bool isOverflowScroll() const override { return true; } - virtual void didStartScroll() override; - virtual void didEndScroll() override; - virtual void didUpdateScroll() override; - virtual void setIsUserScroll(bool isUserScroll) override { m_inUserScroll = isUserScroll; } + void didStartScroll() override; + void didEndScroll() override; + void didUpdateScroll() override; + void setIsUserScroll(bool isUserScroll) override { m_inUserScroll = isUserScroll; } bool isInUserScroll() const { return m_inUserScroll; } bool requiresScrollBoundsOriginUpdate() const { return m_requiresScrollBoundsOriginUpdate; } void setRequiresScrollBoundsOriginUpdate(bool requiresUpdate = true) { m_requiresScrollBoundsOriginUpdate = requiresUpdate; } + // Returns true when the layer could do touch scrolling, but doesn't look at whether there is actually scrollable overflow. bool hasAcceleratedTouchScrolling() const; - + // Returns true when there is actually scrollable overflow (requires layout to be up-to-date). + bool hasTouchScrollableOverflow() const; +#else + bool hasAcceleratedTouchScrolling() const { return false; } + bool hasTouchScrollableOverflow() const { return false; } #endif int verticalScrollbarWidth(OverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize) const; @@ -457,9 +266,9 @@ public: bool hitTestOverflowControls(HitTestResult&, const IntPoint& localPoint); IntSize offsetFromResizeCorner(const IntPoint& absolutePoint) const; - void paintOverflowControls(GraphicsContext*, const IntPoint&, const IntRect& damageRect, bool paintingOverlayControls = false); - void paintScrollCorner(GraphicsContext*, const IntPoint&, const IntRect& damageRect); - void paintResizer(GraphicsContext*, const LayoutPoint&, const LayoutRect& damageRect); + void paintOverflowControls(GraphicsContext&, const IntPoint&, const IntRect& damageRect, bool paintingOverlayControls = false); + void paintScrollCorner(GraphicsContext&, const IntPoint&, const IntRect& damageRect); + void paintResizer(GraphicsContext&, const LayoutPoint&, const LayoutRect& damageRect); void updateScrollInfoAfterLayout(); @@ -473,13 +282,11 @@ public: bool isRootLayer() const { return m_isRootLayer; } -#if USE(ACCELERATED_COMPOSITING) RenderLayerCompositor& compositor() const; // Notification from the renderer that its content changed (e.g. current frame of image changed). // Allows updates of layer content without repainting. void contentChanged(ContentChangeType); -#endif bool canRender3DTransforms() const; @@ -488,7 +295,9 @@ public: NeedsFullRepaintInBacking = 1 << 1, IsCompositingUpdateRoot = 1 << 2, UpdateCompositingLayers = 1 << 3, - UpdatePagination = 1 << 4 + UpdatePagination = 1 << 4, + SeenTransformedLayer = 1 << 5, + Seen3DTransformedLayer = 1 << 6 }; typedef unsigned UpdateLayerPositionsFlags; static const UpdateLayerPositionsFlags defaultFlags = CheckForRepaint | IsCompositingUpdateRoot | UpdateCompositingLayers; @@ -498,12 +307,16 @@ public: void updateLayerPositionsAfterOverflowScroll(); void updateLayerPositionsAfterDocumentScroll(); -#if USE(ACCELERATED_COMPOSITING) void positionNewlyCreatedOverflowControls(); -#endif - - bool isPaginated() const { return m_isPaginated; } - RenderLayer* enclosingPaginationLayer() const { return m_enclosingPaginationLayer; } + + bool hasCompositedLayerInEnclosingPaginationChain() const; + enum PaginationInclusionMode { ExcludeCompositedPaginatedLayers, IncludeCompositedPaginatedLayers }; + RenderLayer* enclosingPaginationLayer(PaginationInclusionMode mode) const + { + if (mode == ExcludeCompositedPaginatedLayers && hasCompositedLayerInEnclosingPaginationChain()) + return nullptr; + return m_enclosingPaginationLayer; + } void updateTransform(); @@ -573,7 +386,7 @@ public: void setHasVisibleContent(); void dirtyVisibleContentStatus(); - bool hasBoxDecorationsOrBackground() const; + bool hasVisibleBoxDecorationsOrBackground() const; bool hasVisibleBoxDecorations() const; // Returns true if this layer has visible content (ignoring any child layers). bool isVisuallyNonEmpty() const; @@ -594,7 +407,7 @@ public: // Gets the nearest enclosing positioned ancestor layer (also includes // the <html> layer and the root layer). - RenderLayer* enclosingPositionedAncestor() const; + RenderLayer* enclosingAncestorForPosition(EPosition) const; // Returns the nearest enclosing layer that is scrollable. RenderLayer* enclosingScrollableLayer() const; @@ -604,80 +417,73 @@ public: RenderLayer* enclosingOverflowClipLayer(IncludeSelfOrNot) const; -#if USE(ACCELERATED_COMPOSITING) // Enclosing compositing layer; if includeSelf is true, may return this. RenderLayer* enclosingCompositingLayer(IncludeSelfOrNot = IncludeSelf) const; RenderLayer* enclosingCompositingLayerForRepaint(IncludeSelfOrNot = IncludeSelf) const; // Ancestor compositing layer, excluding this. RenderLayer* ancestorCompositingLayer() const { return enclosingCompositingLayer(ExcludeSelf); } -#endif -#if ENABLE(CSS_FILTERS) RenderLayer* enclosingFilterLayer(IncludeSelfOrNot = IncludeSelf) const; RenderLayer* enclosingFilterRepaintLayer() const; - void setFilterBackendNeedsRepaintingInRect(const LayoutRect&, bool immediate); + void setFilterBackendNeedsRepaintingInRect(const LayoutRect&); bool hasAncestorWithFilterOutsets() const; -#endif bool canUseConvertToLayerCoords() const { // These RenderObject have an impact on their layers' without them knowing about it. - return !renderer().hasColumns() && !renderer().hasTransform() -#if ENABLE(SVG) - && !renderer().isSVGRoot() -#endif - ; + return !renderer().hasTransform() && !renderer().isSVGRoot(); } // FIXME: adjustForColumns allows us to position compositing layers in columns correctly, but eventually they need to be split across columns too. enum ColumnOffsetAdjustment { DontAdjustForColumns, AdjustForColumns }; void convertToPixelSnappedLayerCoords(const RenderLayer* ancestorLayer, IntPoint& location, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const; - void convertToPixelSnappedLayerCoords(const RenderLayer* ancestorLayer, IntRect&, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const; - void convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutPoint&, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const; - void convertToLayerCoords(const RenderLayer* ancestorLayer, LayoutRect&, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const; + LayoutPoint convertToLayerCoords(const RenderLayer* ancestorLayer, const LayoutPoint&, ColumnOffsetAdjustment adjustForColumns = DontAdjustForColumns) const; + LayoutSize offsetFromAncestor(const RenderLayer*, ColumnOffsetAdjustment = DontAdjustForColumns) const; int zIndex() const { return renderer().style().zIndex(); } enum PaintLayerFlag { - PaintLayerHaveTransparency = 1, - PaintLayerAppliedTransform = 1 << 1, - PaintLayerTemporaryClipRects = 1 << 2, - PaintLayerPaintingReflection = 1 << 3, - PaintLayerPaintingOverlayScrollbars = 1 << 4, - PaintLayerPaintingCompositingBackgroundPhase = 1 << 5, - PaintLayerPaintingCompositingForegroundPhase = 1 << 6, - PaintLayerPaintingCompositingMaskPhase = 1 << 7, - PaintLayerPaintingCompositingScrollingPhase = 1 << 8, - PaintLayerPaintingOverflowContents = 1 << 9, - PaintLayerPaintingRootBackgroundOnly = 1 << 10, - PaintLayerPaintingSkipRootBackground = 1 << 11, - PaintLayerPaintingCompositingAllPhases = (PaintLayerPaintingCompositingBackgroundPhase | PaintLayerPaintingCompositingForegroundPhase | PaintLayerPaintingCompositingMaskPhase) + PaintLayerHaveTransparency = 1 << 0, + PaintLayerAppliedTransform = 1 << 1, + PaintLayerTemporaryClipRects = 1 << 2, + PaintLayerPaintingReflection = 1 << 3, + PaintLayerPaintingOverlayScrollbars = 1 << 4, + PaintLayerPaintingCompositingBackgroundPhase = 1 << 5, + PaintLayerPaintingCompositingForegroundPhase = 1 << 6, + PaintLayerPaintingCompositingMaskPhase = 1 << 7, + PaintLayerPaintingCompositingClipPathPhase = 1 << 8, + PaintLayerPaintingCompositingScrollingPhase = 1 << 9, + PaintLayerPaintingOverflowContents = 1 << 10, + PaintLayerPaintingRootBackgroundOnly = 1 << 11, + PaintLayerPaintingSkipRootBackground = 1 << 12, + PaintLayerPaintingChildClippingMaskPhase = 1 << 13, + PaintLayerPaintingCompositingAllPhases = PaintLayerPaintingCompositingBackgroundPhase | PaintLayerPaintingCompositingForegroundPhase }; typedef unsigned PaintLayerFlags; + enum class SecurityOriginPaintPolicy { AnyOrigin, AccessibleOriginOnly }; + // The two main functions that use the layer system. The paint method // paints the layers that intersect the damage rect from back to // front. The hitTest method looks for mouse events by walking // layers that intersect the point from front to back. - void paint(GraphicsContext*, const LayoutRect& damageRect, PaintBehavior = PaintBehaviorNormal, RenderObject* subtreePaintRoot = 0, - RenderRegion* = 0, PaintLayerFlags = 0); + void paint(GraphicsContext&, const LayoutRect& damageRect, const LayoutSize& subpixelOffset = LayoutSize(), PaintBehavior = PaintBehaviorNormal, + RenderObject* subtreePaintRoot = nullptr, PaintLayerFlags = 0, SecurityOriginPaintPolicy = SecurityOriginPaintPolicy::AnyOrigin); bool hitTest(const HitTestRequest&, HitTestResult&); bool hitTest(const HitTestRequest&, const HitTestLocation&, HitTestResult&); - void paintOverlayScrollbars(GraphicsContext*, const LayoutRect& damageRect, PaintBehavior, RenderObject* subtreePaintRoot = 0); + void paintOverlayScrollbars(GraphicsContext&, const LayoutRect& damageRect, PaintBehavior, RenderObject* subtreePaintRoot = nullptr); - void paintNamedFlowThreadInsideRegion(GraphicsContext*, RenderNamedFlowFragment*, LayoutRect, LayoutPoint, PaintBehavior = PaintBehaviorNormal, PaintLayerFlags = 0); + void paintNamedFlowThreadInsideRegion(GraphicsContext&, RenderNamedFlowFragment*, LayoutRect, LayoutPoint, PaintBehavior = PaintBehaviorNormal, PaintLayerFlags = 0); struct ClipRectsContext { - ClipRectsContext(const RenderLayer* inRootLayer, RenderRegion* inRegion, ClipRectsType inClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize, ShouldRespectOverflowClip inRespectOverflowClip = RespectOverflowClip) + ClipRectsContext(const RenderLayer* inRootLayer, ClipRectsType inClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize, ShouldRespectOverflowClip inRespectOverflowClip = RespectOverflowClip) : rootLayer(inRootLayer) - , region(inRegion) , clipRectsType(inClipRectsType) , overlayScrollbarSizeRelevancy(inOverlayScrollbarSizeRelevancy) , respectOverflowClip(inRespectOverflowClip) { } const RenderLayer* rootLayer; - RenderRegion* region; ClipRectsType clipRectsType; OverlayScrollbarSizeRelevancy overlayScrollbarSizeRelevancy; ShouldRespectOverflowClip respectOverflowClip; @@ -688,68 +494,58 @@ public: // for painting/event handling. // Pass offsetFromRoot if known. void calculateRects(const ClipRectsContext&, const LayoutRect& paintDirtyRect, LayoutRect& layerBounds, - ClipRect& backgroundRect, ClipRect& foregroundRect, ClipRect& outlineRect, const LayoutPoint* offsetFromRoot = 0) const; - - // Compute and cache clip rects computed with the given layer as the root - void updateClipRects(const ClipRectsContext&); - // Compute and return the clip rects. If useCached is true, will used previously computed clip rects on ancestors - // (rather than computing them all from scratch up the parent chain). - void calculateClipRects(const ClipRectsContext&, ClipRects&) const; - - ClipRects* clipRects(const ClipRectsContext& context) const - { - ASSERT(context.clipRectsType < NumCachedClipRectsTypes); - return m_clipRectsCache ? m_clipRectsCache->getClipRects(context.clipRectsType, context.respectOverflowClip).get() : 0; - } + ClipRect& backgroundRect, ClipRect& foregroundRect, const LayoutSize& offsetFromRoot) const; LayoutRect childrenClipRect() const; // Returns the foreground clip rect of the layer in the document's coordinate space. LayoutRect selfClipRect() const; // Returns the background clip rect of the layer in the document's coordinate space. - LayoutRect localClipRect() const; // Returns the background clip rect of the layer in the local coordinate space. + LayoutRect localClipRect(bool& clipExceedsBounds) const; // Returns the background clip rect of the layer in the local coordinate space. // Pass offsetFromRoot if known. - bool intersectsDamageRect(const LayoutRect& layerBounds, const LayoutRect& damageRect, const RenderLayer* rootLayer, const LayoutPoint* offsetFromRoot = 0, RenderRegion* = 0) const; + bool intersectsDamageRect(const LayoutRect& layerBounds, const LayoutRect& damageRect, const RenderLayer* rootLayer, const LayoutSize& offsetFromRoot, const LayoutRect* cachedBoundingBox = nullptr) const; enum CalculateLayerBoundsFlag { - IncludeSelfTransform = 1 << 0, - UseLocalClipRectIfPossible = 1 << 1, - IncludeLayerFilterOutsets = 1 << 2, - ExcludeHiddenDescendants = 1 << 3, - DontConstrainForMask = 1 << 4, - IncludeCompositedDescendants = 1 << 5, - UseFragmentBoxes = 1 << 6, - DefaultCalculateLayerBoundsFlags = IncludeSelfTransform | UseLocalClipRectIfPossible | IncludeLayerFilterOutsets | UseFragmentBoxes + IncludeSelfTransform = 1 << 0, + UseLocalClipRectIfPossible = 1 << 1, + IncludeLayerFilterOutsets = 1 << 2, + ExcludeHiddenDescendants = 1 << 3, + DontConstrainForMask = 1 << 4, + IncludeCompositedDescendants = 1 << 5, + UseFragmentBoxesExcludingCompositing = 1 << 6, + UseFragmentBoxesIncludingCompositing = 1 << 7, + DefaultCalculateLayerBoundsFlags = IncludeSelfTransform | UseLocalClipRectIfPossible | IncludeLayerFilterOutsets | UseFragmentBoxesExcludingCompositing }; typedef unsigned CalculateLayerBoundsFlags; // Bounding box relative to some ancestor layer. Pass offsetFromRoot if known. - LayoutRect boundingBox(const RenderLayer* rootLayer, CalculateLayerBoundsFlags = 0, const LayoutPoint* offsetFromRoot = 0) const; + LayoutRect boundingBox(const RenderLayer* rootLayer, const LayoutSize& offsetFromRoot = LayoutSize(), CalculateLayerBoundsFlags = 0) const; // Bounding box in the coordinates of this layer. LayoutRect localBoundingBox(CalculateLayerBoundsFlags = 0) const; - // Pixel snapped bounding box relative to the root. - IntRect absoluteBoundingBox() const; + // Deprecated: Pixel snapped bounding box relative to the root. + WEBCORE_EXPORT IntRect absoluteBoundingBox() const; + // Device pixel snapped bounding box relative to the root. absoluteBoundingBox() callers will be directed to this. + FloatRect absoluteBoundingBoxForPainting() const; // Bounds used for layer overlap testing in RenderLayerCompositor. - LayoutRect overlapBounds() const { return overlapBoundsIncludeChildren() ? calculateLayerBounds(this) : localBoundingBox(); } + LayoutRect overlapBounds() const { return overlapBoundsIncludeChildren() ? calculateLayerBounds(this, LayoutSize()) : localBoundingBox(); } + + // Takes transform animations into account, returning true if they could be cheaply computed. + // Unlike overlapBounds, these bounds include descendant layers. + bool getOverlapBoundsIncludingChildrenAccountingForTransformAnimations(LayoutRect&) const; -#if ENABLE(CSS_FILTERS) // If true, this layer's children are included in its bounds for overlap testing. // We can't rely on the children's positions if this layer has a filter that could have moved the children's pixels around. bool overlapBoundsIncludeChildren() const { return hasFilter() && renderer().style().filter().hasFilterThatMovesPixels(); } -#else - bool overlapBoundsIncludeChildren() const { return false; } -#endif // Can pass offsetFromRoot if known. - LayoutRect calculateLayerBounds(const RenderLayer* ancestorLayer, const LayoutPoint* offsetFromRoot = 0, CalculateLayerBoundsFlags = DefaultCalculateLayerBoundsFlags) const; + LayoutRect calculateLayerBounds(const RenderLayer* ancestorLayer, const LayoutSize& offsetFromRoot, CalculateLayerBoundsFlags = DefaultCalculateLayerBoundsFlags) const; - // WARNING: This method returns the offset for the parent as this is what updateLayerPositions expects. - LayoutPoint computeOffsetFromRoot(bool& hasLayerOffset) const; - // Return a cached repaint rect, computed relative to the layer renderer's containerForRepaint. - LayoutRect repaintRect() const { return m_repaintRect; } + bool hasComputedRepaintRect() const { return m_hasComputedRepaintRect; } + LayoutRect repaintRect() const { ASSERT(hasComputedRepaintRect()); return m_repaintRect; } LayoutRect repaintRectIncludingNonCompositingDescendants() const; void setRepaintStatus(RepaintStatus status) { m_repaintStatus = status; } + RepaintStatus repaintStatus() const { return static_cast<RepaintStatus>(m_repaintStatus); } LayoutUnit staticInlinePosition() const { return m_staticInlinePosition; } LayoutUnit staticBlockPosition() const { return m_staticBlockPosition; } @@ -779,47 +575,62 @@ public: bool preserves3D() const { return renderer().style().transformStyle3D() == TransformStyle3DPreserve3D; } bool has3DTransform() const { return m_transform && !m_transform->isAffine(); } -#if ENABLE(CSS_FILTERS) - virtual void filterNeedsRepaint(); + void filterNeedsRepaint(); bool hasFilter() const { return renderer().hasFilter(); } + bool hasBackdropFilter() const + { +#if ENABLE(FILTERS_LEVEL_2) + return renderer().hasBackdropFilter(); #else - bool hasFilter() const { return false; } + return false; #endif + } #if ENABLE(CSS_COMPOSITING) bool hasBlendMode() const { return renderer().hasBlendMode(); } + BlendMode blendMode() const { return static_cast<BlendMode>(m_blendMode); } + + bool isolatesCompositedBlending() const { return m_hasNotIsolatedCompositedBlendingDescendants && isStackingContext(); } + bool hasNotIsolatedCompositedBlendingDescendants() const { return m_hasNotIsolatedCompositedBlendingDescendants; } + void setHasNotIsolatedCompositedBlendingDescendants(bool hasNotIsolatedCompositedBlendingDescendants) + { + m_hasNotIsolatedCompositedBlendingDescendants = hasNotIsolatedCompositedBlendingDescendants; + } + + bool isolatesBlending() const { return hasNotIsolatedBlendingDescendants() && isStackingContext(); } + + // FIXME: We should ASSERT(!m_hasNotIsolatedBlendingDescendantsStatusDirty); here but we hit the same bugs as visible content above. + bool hasNotIsolatedBlendingDescendants() const { return m_hasNotIsolatedBlendingDescendants; } + bool hasNotIsolatedBlendingDescendantsStatusDirty() const { return m_hasNotIsolatedBlendingDescendantsStatusDirty; } #else bool hasBlendMode() const { return false; } + bool isolatesCompositedBlending() const { return false; } + bool isolatesBlending() const { return false; } + bool hasNotIsolatedBlendingDescendantsStatusDirty() const { return false; } #endif -#if USE(ACCELERATED_COMPOSITING) bool isComposited() const { return m_backing != 0; } bool hasCompositingDescendant() const { return m_hasCompositingDescendant; } bool hasCompositedMask() const; RenderLayerBacking* backing() const { return m_backing.get(); } RenderLayerBacking* ensureBacking(); void clearBacking(bool layerBeingDestroyed = false); - virtual GraphicsLayer* layerForScrolling() const override; - virtual GraphicsLayer* layerForHorizontalScrollbar() const override; - virtual GraphicsLayer* layerForVerticalScrollbar() const override; - virtual GraphicsLayer* layerForScrollCorner() const override; - virtual bool usesCompositedScrolling() const override; - bool needsCompositedScrolling() const; - bool needsCompositingLayersRebuiltForClip(const RenderStyle* oldStyle, const RenderStyle* newStyle) const; - bool needsCompositingLayersRebuiltForOverflow(const RenderStyle* oldStyle, const RenderStyle* newStyle) const; -#else - bool isComposited() const { return false; } - bool hasCompositedMask() const { return false; } - bool usesCompositedScrolling() const { return false; } - bool needsCompositedScrolling() const { return false; } -#endif + GraphicsLayer* layerForScrolling() const override; + GraphicsLayer* layerForHorizontalScrollbar() const override; + GraphicsLayer* layerForVerticalScrollbar() const override; + GraphicsLayer* layerForScrollCorner() const override; + bool usesCompositedScrolling() const override; + bool usesAsyncScrolling() const override; + WEBCORE_EXPORT bool needsCompositedScrolling() const; bool paintsWithTransparency(PaintBehavior paintBehavior) const { - return isTransparent() && ((paintBehavior & PaintBehaviorFlattenCompositingLayers) || !isComposited()); + return (isTransparent() || hasBlendMode() || (isolatesBlending() && !renderer().isDocumentElementRenderer())) && ((paintBehavior & PaintBehaviorFlattenCompositingLayers) || !isComposited()); } bool paintsWithTransform(PaintBehavior) const; + bool shouldPaintMask(PaintBehavior, PaintLayerFlags) const; + bool shouldApplyClipPath(PaintBehavior, PaintLayerFlags) const; // Returns true if background phase is painted opaque in the given rect. // The query rect is given in local coordinates. @@ -828,11 +639,9 @@ public: bool containsDirtyOverlayScrollbars() const { return m_containsDirtyOverlayScrollbars; } void setContainsDirtyOverlayScrollbars(bool dirtyScrollbars) { m_containsDirtyOverlayScrollbars = dirtyScrollbars; } -#if ENABLE(CSS_FILTERS) bool paintsWithFilters() const; bool requiresFullLayerImageForFilters() const; FilterEffectRenderer* filterRenderer() const; -#endif #if !ASSERT_DISABLED bool layerListMutationAllowed() const { return m_layerListMutationAllowed; } @@ -841,7 +650,6 @@ public: Element* enclosingElement() const; -#if USE(ACCELERATED_COMPOSITING) enum ViewportConstrainedNotCompositedReason { NoNotCompositedReason, NotCompositedForBoundsOutOfView, @@ -851,7 +659,6 @@ public: void setViewportConstrainedNotCompositedReason(ViewportConstrainedNotCompositedReason reason) { m_viewportConstrainedNotCompositedReason = reason; } ViewportConstrainedNotCompositedReason viewportConstrainedNotCompositedReason() const { return static_cast<ViewportConstrainedNotCompositedReason>(m_viewportConstrainedNotCompositedReason); } -#endif bool isRenderFlowThread() const { return renderer().isRenderFlowThread(); } bool isOutOfFlowRenderFlowThread() const { return renderer().isOutOfFlowRenderFlowThread(); } @@ -867,19 +674,48 @@ public: RenderLayer* enclosingFlowThreadAncestor() const; + bool shouldPlaceBlockDirectionScrollbarOnLeft() const final { return renderer().shouldPlaceBlockDirectionScrollbarOnLeft(); } + private: enum CollectLayersBehavior { StopAtStackingContexts, StopAtStackingContainers }; + struct LayerPaintingInfo { + LayerPaintingInfo(RenderLayer* inRootLayer, const LayoutRect& inDirtyRect, PaintBehavior inPaintBehavior, const LayoutSize& inSupixelOffset, RenderObject* inSubtreePaintRoot = nullptr, OverlapTestRequestMap* inOverlapTestRequests = nullptr, bool inRequireSecurityOriginAccessForWidgets = false) + : rootLayer(inRootLayer) + , subtreePaintRoot(inSubtreePaintRoot) + , paintDirtyRect(inDirtyRect) + , subpixelOffset(inSupixelOffset) + , overlapTestRequests(inOverlapTestRequests) + , paintBehavior(inPaintBehavior) + , requireSecurityOriginAccessForWidgets(inRequireSecurityOriginAccessForWidgets) + { } + RenderLayer* rootLayer; + RenderObject* subtreePaintRoot; // only paint descendants of this object + LayoutRect paintDirtyRect; // relative to rootLayer; + LayoutSize subpixelOffset; + OverlapTestRequestMap* overlapTestRequests; // May be null. + PaintBehavior paintBehavior; + bool requireSecurityOriginAccessForWidgets; + bool clipToDirtyRect { true }; + }; + + // Compute, cache and return clip rects computed with the given layer as the root. + Ref<ClipRects> updateClipRects(const ClipRectsContext&); + // Compute and return the clip rects. If useCached is true, will used previously computed clip rects on ancestors + // (rather than computing them all from scratch up the parent chain). + void calculateClipRects(const ClipRectsContext&, ClipRects&) const; + ClipRects* clipRects(const ClipRectsContext&) const; + void updateZOrderLists(); void rebuildZOrderLists(); - void rebuildZOrderLists(CollectLayersBehavior, OwnPtr<Vector<RenderLayer*>>&, OwnPtr<Vector<RenderLayer*>>&); + void rebuildZOrderLists(CollectLayersBehavior, std::unique_ptr<Vector<RenderLayer*>>&, std::unique_ptr<Vector<RenderLayer*>>&); void clearZOrderLists(); void updateNormalFlowList(); // Non-auto z-index always implies stacking context here, because StyleResolver::adjustRenderStyle already adjusts z-index // based on positioning and other criteria. - bool isStackingContext(const RenderStyle* style) const { return !style->hasAutoZIndex() || isRootLayer(); } + bool isStackingContext(const RenderStyle* style) const { return !style->hasAutoZIndex() || isRootLayer() || m_forcedStackingContext; } bool isDirtyStackingContainer() const { return m_zOrderListsDirty && isStackingContainer(); } @@ -890,13 +726,14 @@ private: void updateDescendantsAreContiguousInStackingOrder(); void updateDescendantsAreContiguousInStackingOrderRecursive(const HashMap<const RenderLayer*, int>&, int& minIndex, int& maxIndex, int& count, bool firstIteration); - void computeRepaintRects(const RenderLayerModelObject* repaintContainer, const RenderGeometryMap* = 0); + void computeRepaintRects(const RenderLayerModelObject* repaintContainer, const RenderGeometryMap* = nullptr); void computeRepaintRectsIncludingDescendants(); void clearRepaintRects(); - void clipToRect(RenderLayer* rootLayer, GraphicsContext*, const LayoutRect& paintDirtyRect, const ClipRect&, - BorderRadiusClippingRule = IncludeSelfForBorderRadius); - void restoreClip(GraphicsContext*, const LayoutRect& paintDirtyRect, const ClipRect&); + LayoutRect clipRectRelativeToAncestor(RenderLayer* ancestor, LayoutSize offsetFromAncestor, const LayoutRect& constrainingRect) const; + + void clipToRect(GraphicsContext&, const LayerPaintingInfo&, const ClipRect&, BorderRadiusClippingRule = IncludeSelfForBorderRadius); + void restoreClip(GraphicsContext&, const LayerPaintingInfo&, const ClipRect&); bool shouldRepaintAfterLayout() const; @@ -915,7 +752,7 @@ private: // Returns true if the position changed. bool updateLayerPosition(); - void updateLayerPositions(RenderGeometryMap* = 0, UpdateLayerPositionsFlags = defaultFlags); + void updateLayerPositions(RenderGeometryMap* = nullptr, UpdateLayerPositionsFlags = defaultFlags); enum UpdateLayerPositionsAfterScrollFlag { NoFlag = 0, @@ -927,10 +764,9 @@ private: typedef unsigned UpdateLayerPositionsAfterScrollFlags; void updateLayerPositionsAfterScroll(RenderGeometryMap*, UpdateLayerPositionsAfterScrollFlags = NoFlag); - friend IntSize RenderBox::scrolledContentOffset() const; - IntSize scrolledContentOffset() const { return m_scrollOffset; } + ScrollOffset clampScrollOffset(const ScrollOffset&) const; - IntSize clampScrollOffset(const IntSize&) const; + RenderLayer* enclosingPaginationLayerInSubtree(const RenderLayer* rootLayer, PaginationInclusionMode) const; void setNextSibling(RenderLayer* next) { m_next = next; } void setPreviousSibling(RenderLayer* prev) { m_previous = prev; } @@ -938,81 +774,61 @@ private: void setFirstChild(RenderLayer* first) { m_first = first; } void setLastChild(RenderLayer* last) { m_last = last; } - LayoutPoint renderBoxLocation() const { return renderer().isBox() ? toRenderBox(renderer()).location() : LayoutPoint(); } + LayoutPoint renderBoxLocation() const { return is<RenderBox>(renderer()) ? downcast<RenderBox>(renderer()).location() : LayoutPoint(); } - void collectLayers(bool includeHiddenLayers, CollectLayersBehavior, OwnPtr<Vector<RenderLayer*>>&, OwnPtr<Vector<RenderLayer*>>&); + void collectLayers(bool includeHiddenLayers, CollectLayersBehavior, std::unique_ptr<Vector<RenderLayer*>>&, std::unique_ptr<Vector<RenderLayer*>>&); void updateCompositingAndLayerListsIfNeeded(); - struct LayerPaintingInfo { - LayerPaintingInfo(RenderLayer* inRootLayer, const LayoutRect& inDirtyRect, PaintBehavior inPaintBehavior, const LayoutSize& inSubPixelAccumulation, RenderObject* inSubtreePaintRoot = 0, RenderRegion*inRegion = 0, OverlapTestRequestMap* inOverlapTestRequests = 0) - : rootLayer(inRootLayer) - , subtreePaintRoot(inSubtreePaintRoot) - , paintDirtyRect(inDirtyRect) - , subPixelAccumulation(inSubPixelAccumulation) - , region(inRegion) - , overlapTestRequests(inOverlapTestRequests) - , paintBehavior(inPaintBehavior) - , clipToDirtyRect(true) - { } - RenderLayer* rootLayer; - RenderObject* subtreePaintRoot; // only paint descendants of this object - LayoutRect paintDirtyRect; // relative to rootLayer; - LayoutSize subPixelAccumulation; - RenderRegion* region; // May be null. - OverlapTestRequestMap* overlapTestRequests; // May be null. - PaintBehavior paintBehavior; - bool clipToDirtyRect; - }; + bool setupFontSubpixelQuantization(GraphicsContext&, bool& didQuantizeFonts); - bool setupFontSubpixelQuantization(GraphicsContext*, bool& didQuantizeFonts); - bool setupClipPath(GraphicsContext*, const LayerPaintingInfo&, const LayoutPoint& offsetFromRoot, LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed); -#if ENABLE(CSS_FILTERS) - PassOwnPtr<FilterEffectRendererHelper> setupFilters(GraphicsContext*, LayerPaintingInfo&, PaintLayerFlags, const LayoutPoint& offsetFromRoot, LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed); - GraphicsContext* applyFilters(FilterEffectRendererHelper*, GraphicsContext* originalContext, LayerPaintingInfo&, LayerFragments&); -#endif + Path computeClipPath(const LayoutSize& offsetFromRoot, LayoutRect& rootRelativeBounds, WindRule&) const; - void paintLayer(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags); - void paintFixedLayersInNamedFlows(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags); - void paintLayerContentsAndReflection(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags); - void paintLayerByApplyingTransform(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags, const LayoutPoint& translationOffset = LayoutPoint()); - void paintLayerContents(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags); - void paintList(Vector<RenderLayer*>*, GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags); - void paintPaginatedChildLayer(RenderLayer* childLayer, GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags); - void paintChildLayerIntoColumns(RenderLayer* childLayer, GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags, const Vector<RenderLayer*>& columnLayers, size_t columnIndex); - - void collectFragments(LayerFragments&, const RenderLayer* rootLayer, RenderRegion*, const LayoutRect& dirtyRect, - ClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy = IgnoreOverlayScrollbarSize, - ShouldRespectOverflowClip = RespectOverflowClip, const LayoutPoint* offsetFromRoot = 0, const LayoutRect* layerBoundingBox = 0); - void updatePaintingInfoForFragments(LayerFragments&, const LayerPaintingInfo&, PaintLayerFlags, bool shouldPaintContent, const LayoutPoint* offsetFromRoot); - void paintBackgroundForFragments(const LayerFragments&, GraphicsContext*, GraphicsContext* transparencyLayerContext, + bool setupClipPath(GraphicsContext&, const LayerPaintingInfo&, const LayoutSize& offsetFromRoot, LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed); + + class FilterInfo; + std::pair<FilterInfo*, std::unique_ptr<FilterEffectRendererHelper>> filterPainter(GraphicsContext&, PaintLayerFlags) const; + bool hasFilterThatIsPainting(GraphicsContext&, PaintLayerFlags) const; + std::unique_ptr<FilterEffectRendererHelper> setupFilters(GraphicsContext&, LayerPaintingInfo&, PaintLayerFlags, const LayoutSize& offsetFromRoot, LayoutRect& rootRelativeBounds, bool& rootRelativeBoundsComputed); + void applyFilters(FilterEffectRendererHelper*, GraphicsContext& originalContext, const LayerPaintingInfo&, const LayerFragments&); + + void paintLayer(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags); + void paintFixedLayersInNamedFlows(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags); + void paintLayerContentsAndReflection(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags); + void paintLayerByApplyingTransform(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags, const LayoutSize& translationOffset = LayoutSize()); + void paintLayerContents(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags); + void paintList(Vector<RenderLayer*>*, GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags); + + void collectFragments(LayerFragments&, const RenderLayer* rootLayer, const LayoutRect& dirtyRect, + PaginationInclusionMode, + ClipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollbarSizeRelevancy, ShouldRespectOverflowClip, const LayoutSize& offsetFromRoot, + const LayoutRect* layerBoundingBox = nullptr, ShouldApplyRootOffsetToFragments = IgnoreRootOffsetForFragments); + void updatePaintingInfoForFragments(LayerFragments&, const LayerPaintingInfo&, PaintLayerFlags, bool shouldPaintContent, const LayoutSize& offsetFromRoot); + void paintBackgroundForFragments(const LayerFragments&, GraphicsContext&, GraphicsContext& transparencyLayerContext, const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer); - void paintForegroundForFragments(const LayerFragments&, GraphicsContext*, GraphicsContext* transparencyLayerContext, + void paintForegroundForFragments(const LayerFragments&, GraphicsContext&, GraphicsContext& transparencyLayerContext, const LayoutRect& transparencyPaintDirtyRect, bool haveTransparency, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer, - bool selectionOnly, bool forceBlackText); - void paintForegroundForFragmentsWithPhase(PaintPhase, const LayerFragments&, GraphicsContext*, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer); - void paintOutlineForFragments(const LayerFragments&, GraphicsContext*, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer); - void paintOverflowControlsForFragments(const LayerFragments&, GraphicsContext*, const LayerPaintingInfo&); - void paintMaskForFragments(const LayerFragments&, GraphicsContext*, const LayerPaintingInfo&, RenderObject* paintingRootForRenderer); - void paintTransformedLayerIntoFragments(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags); + bool selectionOnly); + void paintForegroundForFragmentsWithPhase(PaintPhase, const LayerFragments&, GraphicsContext&, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer); + void paintOutlineForFragments(const LayerFragments&, GraphicsContext&, const LayerPaintingInfo&, PaintBehavior, RenderObject* paintingRootForRenderer); + void paintOverflowControlsForFragments(const LayerFragments&, GraphicsContext&, const LayerPaintingInfo&); + void paintMaskForFragments(const LayerFragments&, GraphicsContext&, const LayerPaintingInfo&, RenderObject* paintingRootForRenderer); + void paintChildClippingMaskForFragments(const LayerFragments&, GraphicsContext&, const LayerPaintingInfo&, RenderObject* paintingRootForRenderer); + void paintTransformedLayerIntoFragments(GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags); + + RenderLayer* transparentPaintingAncestor(); + void beginTransparencyLayers(GraphicsContext&, const LayerPaintingInfo&, const LayoutRect& dirtyRect); RenderLayer* hitTestLayer(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult& result, - const LayoutRect& hitTestRect, const HitTestLocation&, bool appliedTransform, - const HitTestingTransformState* transformState = 0, double* zOffset = 0); + const LayoutRect& hitTestRect, const HitTestLocation&, bool appliedTransform, + const HitTestingTransformState* = nullptr, double* zOffset = nullptr); RenderLayer* hitTestLayerByApplyingTransform(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest&, HitTestResult&, - const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = 0, double* zOffset = 0, - const LayoutPoint& translationOffset = LayoutPoint()); + const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = nullptr, double* zOffset = nullptr, + const LayoutSize& translationOffset = LayoutSize()); RenderLayer* hitTestList(Vector<RenderLayer*>*, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, - const LayoutRect& hitTestRect, const HitTestLocation&, - const HitTestingTransformState* transformState, double* zOffsetForDescendants, double* zOffset, - const HitTestingTransformState* unflattenedTransformState, bool depthSortDescendants); - RenderLayer* hitTestPaginatedChildLayer(RenderLayer* childLayer, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, - const LayoutRect& hitTestRect, const HitTestLocation&, - const HitTestingTransformState* transformState, double* zOffset); - RenderLayer* hitTestChildLayerColumns(RenderLayer* childLayer, RenderLayer* rootLayer, const HitTestRequest& request, HitTestResult& result, - const LayoutRect& hitTestRect, const HitTestLocation&, - const HitTestingTransformState* transformState, double* zOffset, - const Vector<RenderLayer*>& columnLayers, size_t columnIndex); + const LayoutRect& hitTestRect, const HitTestLocation&, + const HitTestingTransformState*, double* zOffsetForDescendants, double* zOffset, + const HitTestingTransformState* unflattenedTransformState, bool depthSortDescendants); RenderLayer* hitTestFixedLayersInNamedFlows(RenderLayer* rootLayer, const HitTestRequest&, HitTestResult&, @@ -1022,16 +838,16 @@ private: const HitTestingTransformState* unflattenedTransformState, bool depthSortDescendants); - PassRefPtr<HitTestingTransformState> createLocalTransformState(RenderLayer* rootLayer, RenderLayer* containerLayer, - const LayoutRect& hitTestRect, const HitTestLocation&, - const HitTestingTransformState* containerTransformState, - const LayoutPoint& translationOffset = LayoutPoint()) const; + Ref<HitTestingTransformState> createLocalTransformState(RenderLayer* rootLayer, RenderLayer* containerLayer, + const LayoutRect& hitTestRect, const HitTestLocation&, + const HitTestingTransformState* containerTransformState, + const LayoutSize& translationOffset = LayoutSize()) const; bool hitTestContents(const HitTestRequest&, HitTestResult&, const LayoutRect& layerBounds, const HitTestLocation&, HitTestFilter) const; bool hitTestContentsForFragments(const LayerFragments&, const HitTestRequest&, HitTestResult&, const HitTestLocation&, HitTestFilter, bool& insideClipRect) const; bool hitTestResizerInFragments(const LayerFragments&, const HitTestLocation&) const; RenderLayer* hitTestTransformedLayerInFragments(RenderLayer* rootLayer, RenderLayer* containerLayer, const HitTestRequest&, HitTestResult&, - const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = 0, double* zOffset = 0); + const LayoutRect& hitTestRect, const HitTestLocation&, const HitTestingTransformState* = nullptr, double* zOffset = nullptr); bool listBackgroundIsKnownToBeOpaqueInRect(const Vector<RenderLayer*>*, const LayoutRect&) const; @@ -1041,36 +857,42 @@ private: bool hasScrollableHorizontalOverflow() const; bool hasScrollableVerticalOverflow() const; + bool showsOverflowControls() const; + bool shouldBeNormalFlowOnly() const; bool shouldBeSelfPaintingLayer() const; - virtual int scrollPosition(Scrollbar*) const override; + int scrollOffset(ScrollbarOrientation) const override; // ScrollableArea interface - virtual void invalidateScrollbarRect(Scrollbar*, const IntRect&) override; - virtual void invalidateScrollCornerRect(const IntRect&) override; - virtual bool isActive() const override; - virtual bool isScrollCornerVisible() const override; - virtual IntRect scrollCornerRect() const override; - virtual IntRect convertFromScrollbarToContainingView(const Scrollbar*, const IntRect&) const override; - virtual IntRect convertFromContainingViewToScrollbar(const Scrollbar*, const IntRect&) const override; - virtual IntPoint convertFromScrollbarToContainingView(const Scrollbar*, const IntPoint&) const override; - virtual IntPoint convertFromContainingViewToScrollbar(const Scrollbar*, const IntPoint&) const override; - virtual int scrollSize(ScrollbarOrientation) const override; - virtual void setScrollOffset(const IntPoint&) override; - virtual IntPoint scrollPosition() const override; - virtual IntPoint minimumScrollPosition() const override; - virtual IntPoint maximumScrollPosition() const override; - virtual IntRect visibleContentRectInternal(VisibleContentRectIncludesScrollbars, VisibleContentRectBehavior) const override; - virtual IntSize visibleSize() const override { return m_layerSize; } - virtual IntSize contentsSize() const override; - virtual IntSize overhangAmount() const override; - virtual IntPoint lastKnownMousePosition() const override; - virtual bool isHandlingWheelEvent() const override; - virtual bool shouldSuspendScrollAnimations() const override; - virtual IntRect scrollableAreaBoundingBox() const override; - virtual bool updatesScrollLayerPositionOnMainThread() const override { return true; } + void invalidateScrollbarRect(Scrollbar&, const IntRect&) override; + void invalidateScrollCornerRect(const IntRect&) override; + bool isActive() const override; + bool isScrollCornerVisible() const override; + IntRect scrollCornerRect() const override; + IntRect convertFromScrollbarToContainingView(const Scrollbar&, const IntRect&) const override; + IntRect convertFromContainingViewToScrollbar(const Scrollbar&, const IntRect&) const override; + IntPoint convertFromScrollbarToContainingView(const Scrollbar&, const IntPoint&) const override; + IntPoint convertFromContainingViewToScrollbar(const Scrollbar&, const IntPoint&) const override; + int scrollSize(ScrollbarOrientation) const override; + void setScrollOffset(const ScrollOffset&) override; + + IntRect visibleContentRectInternal(VisibleContentRectIncludesScrollbars, VisibleContentRectBehavior) const override; + IntSize visibleSize() const override; + IntSize contentsSize() const override; + IntSize overhangAmount() const override; + IntPoint lastKnownMousePosition() const override; + bool isHandlingWheelEvent() const override; + bool shouldSuspendScrollAnimations() const override; + IntRect scrollableAreaBoundingBox(bool* isInsideFixed = nullptr) const override; + bool isRubberBandInProgress() const override; + bool forceUpdateScrollbarsOnMainThreadForPerformanceTesting() const override; +#if ENABLE(CSS_SCROLL_SNAP) + bool isScrollSnapInProgress() const override; +#endif + bool usesMockScrollAnimator() const override; + void logMockScrollAnimatorMessage(const String&) const override; #if PLATFORM(IOS) void registerAsTouchEventListenerForScrolling(); @@ -1081,25 +903,25 @@ private: LayoutRect scrollCornerAndResizerRect() const; // NOTE: This should only be called by the overriden setScrollOffset from ScrollableArea. - void scrollTo(int, int); + void scrollTo(const ScrollPosition&); void updateCompositingLayersAfterScroll(); - IntSize scrollbarOffset(const Scrollbar*) const; + IntSize scrollbarOffset(const Scrollbar&) const; void updateScrollableAreaSet(bool hasOverflow); + + bool allowsCurrentScroll() const; void dirtyAncestorChainVisibleDescendantStatus(); void setAncestorChainHasVisibleDescendant(); - void updateDescendantDependentFlags(HashSet<const RenderObject*>* outOfFlowDescendantContainingBlocks = 0); -#if USE(ACCELERATED_COMPOSITING) - bool checkIfDescendantClippingContextNeedsUpdate(bool isClipping); -#endif + void updateDescendantDependentFlags(HashSet<const RenderObject*>* outOfFlowDescendantContainingBlocks = nullptr); - // This flag is computed by RenderLayerCompositor, which knows more about 3d hierarchies than we do. - void setHas3DTransformedDescendant(bool b) { m_has3DTransformedDescendant = b; } bool has3DTransformedDescendant() const { return m_has3DTransformedDescendant; } - + + bool hasTransformedAncestor() const { return m_hasTransformedAncestor; } + bool has3DTransformedAncestor() const { return m_has3DTransformedAncestor; } + void dirty3DTransformedDescendantStatus(); // Both updates the status, and returns true if descendants of this have 3d. bool update3DTransformedDescendantStatus(); @@ -1107,22 +929,25 @@ private: void createReflection(); void removeReflection(); - PassRef<RenderStyle> createReflectionStyle(); + RenderStyle createReflectionStyle(); bool paintingInsideReflection() const { return m_paintingInsideReflection; } void setPaintingInsideReflection(bool b) { m_paintingInsideReflection = b; } -#if ENABLE(CSS_FILTERS) void updateOrRemoveFilterClients(); void updateOrRemoveFilterEffectRenderer(); + +#if ENABLE(CSS_COMPOSITING) + void updateAncestorChainHasBlendingDescendants(); + void dirtyAncestorChainHasBlendingDescendants(); #endif - void parentClipRects(const ClipRectsContext&, ClipRects&) const; + Ref<ClipRects> parentClipRects(const ClipRectsContext&) const; ClipRect backgroundClipRect(const ClipRectsContext&) const; - LayoutRect paintingExtent(const RenderLayer* rootLayer, const LayoutRect& paintDirtyRect, PaintBehavior); - RenderLayer* enclosingTransformedAncestor() const; + LayoutRect getRectToExpose(const LayoutRect& visibleRect, const LayoutRect& exposeRect, bool insideFixed, const ScrollAlignment& alignX, const ScrollAlignment& alignY) const; + // Convert a point in absolute coords into layer coords, taking transforms into account LayoutPoint absoluteToContents(const LayoutPoint&) const; @@ -1130,30 +955,25 @@ private: void updateScrollCornerStyle(); void updateResizerStyle(); - void drawPlatformResizerImage(GraphicsContext*, const LayoutRect& resizerCornerRect); + void drawPlatformResizerImage(GraphicsContext&, const LayoutRect& resizerCornerRect); void updatePagination(); - - // FIXME: Temporary. Remove when new columns come online. - bool useRegionBasedColumns() const; - -#if USE(ACCELERATED_COMPOSITING) + void setHasCompositingDescendant(bool b) { m_hasCompositingDescendant = b; } - enum IndirectCompositingReason { - NoIndirectCompositingReason, - IndirectCompositingForStacking, - IndirectCompositingForOverlap, - IndirectCompositingForBackgroundLayer, - IndirectCompositingForGraphicalEffect, // opacity, mask, filter, transform etc. - IndirectCompositingForPerspective, - IndirectCompositingForPreserve3D + enum class IndirectCompositingReason { + None, + Stacking, + Overlap, + BackgroundLayer, + GraphicalEffect, // opacity, mask, filter, transform etc. + Perspective, + Preserve3D }; - void setIndirectCompositingReason(IndirectCompositingReason reason) { m_indirectCompositingReason = reason; } + void setIndirectCompositingReason(IndirectCompositingReason reason) { m_indirectCompositingReason = static_cast<unsigned>(reason); } IndirectCompositingReason indirectCompositingReason() const { return static_cast<IndirectCompositingReason>(m_indirectCompositingReason); } bool mustCompositeForIndirectReasons() const { return m_indirectCompositingReason; } -#endif // Returns true if z ordering would not change if this layer were a stacking container. bool canBeStackingContainer() const; @@ -1175,15 +995,20 @@ private: bool overflowControlsIntersectRect(const IntRect& localRect) const; - RenderLayer* hitTestFlowThreadIfRegion(RenderLayer*, const HitTestRequest&, HitTestResult&, + RenderLayer* hitTestFlowThreadIfRegionForFragments(const LayerFragments&, RenderLayer*, const HitTestRequest&, HitTestResult&, const LayoutRect&, const HitTestLocation&, - const HitTestingTransformState*, double*); - void paintFlowThreadIfRegion(GraphicsContext*, const LayerPaintingInfo&, PaintLayerFlags, LayoutPoint, LayoutRect, bool); - void mapLayerClipRectsToFragmentationLayer(RenderRegion*, ClipRects&) const; + const HitTestingTransformState*, double* zOffsetForDescendants, + double* zOffset, const HitTestingTransformState* unflattenedTransformState, bool depthSortDescendants); + void paintFlowThreadIfRegionForFragments(const LayerFragments&, GraphicsContext&, const LayerPaintingInfo&, PaintLayerFlags); + bool mapLayerClipRectsToFragmentationLayer(ClipRects&) const; + + RenderNamedFlowFragment* currentRenderNamedFlowFragment() const; -private: // The bitfields are up here so they will fall into the padding from ScrollableArea on 64-bit. + const bool m_isRootLayer : 1; + const bool m_forcedStackingContext : 1; + // Keeps track of whether the layer is currently resizing, so events can cause resizing to start and stop. bool m_inResizeMode : 1; @@ -1212,8 +1037,6 @@ private: // able to safely become a stacking context. bool m_descendantsAreContiguousInStackingOrder : 1; - const bool m_isRootLayer : 1; - bool m_usedTransparency : 1; // Tracks whether we need to close a transparent layer, i.e., whether // we ended up painting this layer or any descendants (and therefore need to // blend). @@ -1225,21 +1048,24 @@ private: bool m_hasVisibleContent : 1; bool m_visibleDescendantStatusDirty : 1; bool m_hasVisibleDescendant : 1; - - bool m_isPaginated : 1; // If we think this layer is split by a multi-column ancestor, then this bit will be set. + bool m_registeredScrollableArea : 1; bool m_3DTransformedDescendantStatusDirty : 1; bool m_has3DTransformedDescendant : 1; // Set on a stacking context layer that has 3D descendants anywhere // in a preserves3D hierarchy. Hint to do 3D-aware hit testing. -#if USE(ACCELERATED_COMPOSITING) bool m_hasCompositingDescendant : 1; // In the z-order tree. + + bool m_hasTransformedAncestor : 1; + bool m_has3DTransformedAncestor : 1; + unsigned m_indirectCompositingReason : 3; unsigned m_viewportConstrainedNotCompositedReason : 2; -#endif #if PLATFORM(IOS) bool m_adjustForIOSCaretWhenScrolling : 1; +#if ENABLE(IOS_TOUCH_EVENTS) bool m_registeredAsTouchEventListenerForScrolling : 1; +#endif bool m_inUserScroll : 1; bool m_requiresScrollBoundsOriginUpdate : 1; #endif @@ -1251,12 +1077,15 @@ private: bool m_layerListMutationAllowed : 1; #endif -#if ENABLE(CSS_FILTERS) bool m_hasFilterInfo : 1; -#endif + + bool m_hasComputedRepaintRect : 1; #if ENABLE(CSS_COMPOSITING) - BlendMode m_blendMode : 5; + unsigned m_blendMode : 5; + bool m_hasNotIsolatedCompositedBlendingDescendants : 1; + bool m_hasNotIsolatedBlendingDescendants : 1; + bool m_hasNotIsolatedBlendingDescendantsStatusDirty : 1; #endif RenderLayerModelObject& m_renderer; @@ -1279,11 +1108,10 @@ private: // The layer's width/height IntSize m_layerSize; - // This is the (scroll) offset from scrollOrigin(). - IntSize m_scrollOffset; + ScrollPosition m_scrollPosition; // The width/height of our scrolled area. - LayoutSize m_scrollSize; + IntSize m_scrollSize; // For layers with overflow, we have a pair of scrollbars. RefPtr<Scrollbar> m_hBar; @@ -1293,24 +1121,24 @@ private: // descendant layers within the stacking context that have z-indices of 0 or greater // (auto will count as 0). m_negZOrderList holds descendants within our stacking context with negative // z-indices. - OwnPtr<Vector<RenderLayer*>> m_posZOrderList; - OwnPtr<Vector<RenderLayer*>> m_negZOrderList; + std::unique_ptr<Vector<RenderLayer*>> m_posZOrderList; + std::unique_ptr<Vector<RenderLayer*>> m_negZOrderList; // This list contains child layers that cannot create stacking contexts. For now it is just // overflow layers, but that may change in the future. - OwnPtr<Vector<RenderLayer*>> m_normalFlowList; + std::unique_ptr<Vector<RenderLayer*>> m_normalFlowList; - OwnPtr<ClipRectsCache> m_clipRectsCache; + std::unique_ptr<ClipRectsCache> m_clipRectsCache; IntPoint m_cachedOverlayScrollbarOffset; - OwnPtr<RenderMarquee> m_marquee; // Used by layers with overflow:marquee + std::unique_ptr<RenderMarquee> m_marquee; // Used for <marquee>. // Cached normal flow values for absolute positioned elements with static left/top values. LayoutUnit m_staticInlinePosition; LayoutUnit m_staticBlockPosition; - OwnPtr<TransformationMatrix> m_transform; + std::unique_ptr<TransformationMatrix> m_transform; // May ultimately be extended to many replicas (with their own paint order). RenderPtr<RenderReplica> m_reflection; @@ -1324,19 +1152,16 @@ private: IntRect m_blockSelectionGapsBounds; -#if USE(ACCELERATED_COMPOSITING) - OwnPtr<RenderLayerBacking> m_backing; -#endif - - class FilterInfo; + std::unique_ptr<RenderLayerBacking> m_backing; }; inline void RenderLayer::clearZOrderLists() { ASSERT(!isStackingContainer()); + ASSERT(m_layerListMutationAllowed); - m_posZOrderList.clear(); - m_negZOrderList.clear(); + m_posZOrderList = nullptr; + m_negZOrderList = nullptr; } inline void RenderLayer::updateZOrderLists() @@ -1376,12 +1201,12 @@ private: void makeMatrixRenderable(TransformationMatrix&, bool has3DRendering); +bool compositedWithOwnBackingStore(const RenderLayer&); + } // namespace WebCore -#ifndef NDEBUG -// Outside the WebCore namespace for ease of invocation from gdb. +#if ENABLE(TREE_DEBUGGING) +// Outside the WebCore namespace for ease of invocation from lldb. void showLayerTree(const WebCore::RenderLayer*); void showLayerTree(const WebCore::RenderObject*); #endif - -#endif // RenderLayer_h |