Index: Source/core/rendering/RenderLayerBacking.h |
diff --git a/Source/core/rendering/RenderLayerBacking.h b/Source/core/rendering/RenderLayerBacking.h |
index 5a18edd82084680b941763762d4d73e2e159268c..6285afd8461769980fc025035ed4b5e5c0454369 100644 |
--- a/Source/core/rendering/RenderLayerBacking.h |
+++ b/Source/core/rendering/RenderLayerBacking.h |
@@ -94,9 +94,12 @@ public: |
GraphicsLayer* clippingLayer() const { return m_childContainmentLayer.get(); } |
// Layer to get clipped by ancestor |
- bool hasAncestorClippingLayer() const { return m_ancestorClippingLayer != 0; } |
+ bool hasAncestorClippingLayer() const { return m_ancestorClippingLayer; } |
GraphicsLayer* ancestorClippingLayer() const { return m_ancestorClippingLayer.get(); } |
+ bool hasAncestorScrollClippingLayer() const { return m_ancestorScrollClippingLayer; } |
+ GraphicsLayer* ancestorScrollClippingLayer() const { return m_ancestorScrollClippingLayer.get(); } |
+ |
bool hasContentsLayer() const { return m_foregroundLayer != 0; } |
GraphicsLayer* foregroundLayer() const { return m_foregroundLayer.get(); } |
@@ -189,7 +192,7 @@ private: |
RenderLayerCompositor* compositor() const { return m_owningLayer->compositor(); } |
void updateInternalHierarchy(); |
- bool updateClippingLayers(bool needsAncestorClip, bool needsDescendantClip); |
+ bool updateClippingLayers(bool needsAncestorClip, bool needsDescendantClip, bool needsScrollClip); |
bool updateOverflowControlsLayers(bool needsHorizontalScrollbarLayer, bool needsVerticalScrollbarLayer, bool needsScrollCornerLayer); |
bool updateForegroundLayer(bool needsForegroundLayer); |
bool updateBackgroundLayer(bool needsBackgroundLayer); |
@@ -198,6 +201,8 @@ private: |
bool requiresVerticalScrollbarLayer() const { return m_owningLayer->verticalScrollbar(); } |
bool requiresScrollCornerLayer() const { return !m_owningLayer->scrollCornerAndResizerRect().isEmpty(); } |
bool updateScrollingLayers(bool scrollingLayers); |
+ void updateScrollParent(RenderLayer*); |
+ void updateClipParent(RenderLayer*); |
void updateDrawsContent(bool isSimpleContainer); |
void registerScrollingLayers(); |
@@ -247,22 +252,91 @@ private: |
RenderLayer* m_owningLayer; |
+ // The hierarchy of layers that is maintained by the RenderLayerBacking looks like this: |
+ // |
+ // m_ancestorScrollClippingLayer [OPTIONAL] |
+ // + m_ancestorClippingLayer [OPTIONAL] |
+ // + m_graphicsLayer |
+ // + m_childContainmentLayer [OPTIONAL] <-OR-> m_scrollingLayer [OPTIONAL] |
+ // + m_scrollingContentsLayer [OPTIONAL] |
+ // |
+ // We need an ancestor scroll clipping layer if we have a "scroll parent". That is, if |
+ // our scrolling ancestor is not our ancestor in the stacking tree. Similarly, we need |
+ // an ancestor clipping layer if our clipping ancestor is not our ancestor in the clipping |
+ // tree. Here's what that might look like. |
+ // |
+ // Let A = the scrolling ancestor, |
+ // B = the clipping ancestor, |
+ // C = the scroll/clip descendant, and |
+ // SC = the stacking context that is the ancestor of A, B and C in the stacking tree. |
+ // |
+ // SC |
+ // + A = m_graphicsLayer |
+ // | + m_scrollingLayer [*] |
+ // | + m_scrollingContentsLayer [+] |
+ // | + ... |
+ // ... |
+ // | |
+ // + B = m_graphicsLayer |
+ // | + m_childContainmentLayer |
+ // | + ... |
+ // ... |
+ // | |
+ // + C = m_ancestorScrollClippingLayer [**] |
+ // + m_ancestorClippingLayer [++] |
+ // + m_graphicsLayer |
+ // + ... |
+ // |
+ // Note that [*] and [**] exist for the same reason: to clip scrolling content. That is, |
+ // when we scroll A, in fact [+] and [++] are moved and are clipped to [*] and [**], |
+ // respectively. |
+ // |
+ // Now, it may also be the case that C is also clipped by another layer that doesn't happen |
+ // to be its scrolling ancestor. B, in this case. When this happens, we create an |
+ // ancestor clipping layer for C, [++]. Unlike the scroll clipping layer, [**], which must |
+ // stay put during a scroll to do its job, the ancestor clipping layer [++] does move with |
+ // the content it clips. |
+ OwnPtr<GraphicsLayer> m_ancestorScrollClippingLayer; // Used if and only if we have a scroll parent. |
OwnPtr<GraphicsLayer> m_ancestorClippingLayer; // Only used if we are clipped by an ancestor which is not a stacking context. |
OwnPtr<GraphicsLayer> m_graphicsLayer; |
+ OwnPtr<GraphicsLayer> m_childContainmentLayer; // Only used if we have clipping on a stacking context with compositing children. |
+ OwnPtr<GraphicsLayer> m_scrollingLayer; // Only used if the layer is using composited scrolling. |
+ OwnPtr<GraphicsLayer> m_scrollingContentsLayer; // Only used if the layer is using composited scrolling. |
+ |
+ // This layer is also added to the hierarchy by the RLB, but in a different way than |
+ // the layers above. It's added to m_graphicsLayer as its mask layer (naturally) if |
+ // we have a mask, and isn't part of the typical hierarchy (it has no children). |
+ OwnPtr<GraphicsLayer> m_maskLayer; // Only used if we have a mask. |
+ |
+ // There are two other (optional) layers whose painting is managed by the RenderLayerBacking, |
+ // but whose position in the hierarchy is maintained by the RenderLayerCompositor. These |
+ // are the foreground and background layers. The foreground layer exists if we have composited |
+ // descendants with negative z-order. We need the extra layer in this case because the layer |
+ // needs to draw both below (for the background, say) and above (for the normal flow content, say) |
+ // the negative z-order descendants and this is impossible with a single layer. The RLC handles |
+ // inserting m_foregroundLayer in the correct position in our descendant list for us (right after |
+ // the neg z-order dsecendants). |
+ // |
+ // The background layer is only created if this is the root layer and our background is entirely |
+ // fixed. In this case we want to put the background in a separate composited layer so that when |
+ // we scroll, we don't have to re-raster the background into position. This layer is also inserted |
+ // into the tree by the RLC as it gets a special home. This layer becomes a descendant of the |
+ // frame clipping layer. That is: |
+ // ... |
+ // + frame clipping layer |
+ // + m_backgroundLayer |
+ // + frame scrolling layer |
+ // + root content layer |
+ // |
+ // With the hierarchy set up like this, the root content layer is able to scroll without affecting |
+ // the background layer (or repainting). |
OwnPtr<GraphicsLayer> m_foregroundLayer; // Only used in cases where we need to draw the foreground separately. |
OwnPtr<GraphicsLayer> m_backgroundLayer; // Only used in cases where we need to draw the background separately. |
- OwnPtr<GraphicsLayer> m_childContainmentLayer; // Only used if we have clipping on a stacking context with compositing children, or if the layer has a tile cache. |
- OwnPtr<GraphicsLayer> m_maskLayer; // Only used if we have a mask. |
OwnPtr<GraphicsLayer> m_layerForHorizontalScrollbar; |
OwnPtr<GraphicsLayer> m_layerForVerticalScrollbar; |
OwnPtr<GraphicsLayer> m_layerForScrollCorner; |
- OwnPtr<GraphicsLayer> m_scrollingLayer; // Only used if the layer is using composited scrolling. |
- OwnPtr<GraphicsLayer> m_scrollingContentsLayer; // Only used if the layer is using composited scrolling. |
- |
- uint64_t m_scrollLayerID; |
- |
IntRect m_compositedBounds; |
bool m_artificiallyInflatedBounds; // bounds had to be made non-zero to make transform-origin work |