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

Side by Side Diff: Source/core/rendering/RenderLayer.cpp

Issue 103213002: position:sticky should stick for the enclosing overflow ancestor (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add back changes in RenderBoxModelObject.cpp eaten by rebase. Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerCompositor.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 602
603 if (paintBehavior & PaintBehaviorFlattenCompositingLayers) { 603 if (paintBehavior & PaintBehaviorFlattenCompositingLayers) {
604 TransformationMatrix matrix = *m_transform; 604 TransformationMatrix matrix = *m_transform;
605 makeMatrixRenderable(matrix, false /* flatten 3d */); 605 makeMatrixRenderable(matrix, false /* flatten 3d */);
606 return matrix; 606 return matrix;
607 } 607 }
608 608
609 return *m_transform; 609 return *m_transform;
610 } 610 }
611 611
612 RenderLayer* RenderLayer::enclosingOverflowClipLayer(IncludeSelfOrNot includeSel f) const
613 {
614 const RenderLayer* layer = (includeSelf == IncludeSelf) ? this : parent();
615 while (layer) {
616 if (layer->renderer()->hasOverflowClip())
617 return const_cast<RenderLayer*>(layer);
618
619 layer = layer->parent();
620 }
621 return 0;
622 }
623
612 static bool checkContainingBlockChainForPagination(RenderLayerModelObject* rende rer, RenderBox* ancestorColumnsRenderer) 624 static bool checkContainingBlockChainForPagination(RenderLayerModelObject* rende rer, RenderBox* ancestorColumnsRenderer)
613 { 625 {
614 RenderView* view = renderer->view(); 626 RenderView* view = renderer->view();
615 RenderLayerModelObject* prevBlock = renderer; 627 RenderLayerModelObject* prevBlock = renderer;
616 RenderBlock* containingBlock; 628 RenderBlock* containingBlock;
617 for (containingBlock = renderer->containingBlock(); 629 for (containingBlock = renderer->containingBlock();
618 containingBlock && containingBlock != view && containingBlock != ancest orColumnsRenderer; 630 containingBlock && containingBlock != view && containingBlock != ancest orColumnsRenderer;
619 containingBlock = containingBlock->containingBlock()) 631 containingBlock = containingBlock->containingBlock())
620 prevBlock = containingBlock; 632 prevBlock = containingBlock;
621 633
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after
1098 static inline const RenderLayer* compositingContainer(const RenderLayer* layer) 1110 static inline const RenderLayer* compositingContainer(const RenderLayer* layer)
1099 { 1111 {
1100 return layer->stackingNode()->isNormalFlowOnly() ? layer->parent() : (layer- >stackingNode()->ancestorStackingContainerNode() ? layer->stackingNode()->ancest orStackingContainerNode()->layer() : 0); 1112 return layer->stackingNode()->isNormalFlowOnly() ? layer->parent() : (layer- >stackingNode()->ancestorStackingContainerNode() ? layer->stackingNode()->ancest orStackingContainerNode()->layer() : 0);
1101 } 1113 }
1102 1114
1103 // FIXME: having two different functions named enclosingCompositingLayer and enc losingCompositingLayerForRepaint 1115 // FIXME: having two different functions named enclosingCompositingLayer and enc losingCompositingLayerForRepaint
1104 // is error-prone and misleading for reading code that uses these functions - es pecially compounded with 1116 // is error-prone and misleading for reading code that uses these functions - es pecially compounded with
1105 // the includeSelf option. It is very likely that we don't even want either of t hese functions; A layer 1117 // the includeSelf option. It is very likely that we don't even want either of t hese functions; A layer
1106 // should be told explicitly which GraphicsLayer is the repaintContainer for a R enderLayer, and 1118 // should be told explicitly which GraphicsLayer is the repaintContainer for a R enderLayer, and
1107 // any other use cases should probably have an API between the non-compositing a nd compositing sides of code. 1119 // any other use cases should probably have an API between the non-compositing a nd compositing sides of code.
1108 RenderLayer* RenderLayer::enclosingCompositingLayer(bool includeSelf) const 1120 RenderLayer* RenderLayer::enclosingCompositingLayer(IncludeSelfOrNot includeSelf ) const
1109 { 1121 {
1110 if (includeSelf && compositingState() != NotComposited && compositingState() != PaintsIntoGroupedBacking) 1122 if ((includeSelf == IncludeSelf) && compositingState() != NotComposited && c ompositingState() != PaintsIntoGroupedBacking)
1111 return const_cast<RenderLayer*>(this); 1123 return const_cast<RenderLayer*>(this);
1112 1124
1113 for (const RenderLayer* curr = compositingContainer(this); curr; curr = comp ositingContainer(curr)) { 1125 for (const RenderLayer* curr = compositingContainer(this); curr; curr = comp ositingContainer(curr)) {
1114 if (curr->compositingState() != NotComposited && curr->compositingState( ) != PaintsIntoGroupedBacking) 1126 if (curr->compositingState() != NotComposited && curr->compositingState( ) != PaintsIntoGroupedBacking)
1115 return const_cast<RenderLayer*>(curr); 1127 return const_cast<RenderLayer*>(curr);
1116 } 1128 }
1117 1129
1118 return 0; 1130 return 0;
1119 } 1131 }
1120 1132
1121 RenderLayer* RenderLayer::enclosingCompositingLayerForRepaint(bool includeSelf) const 1133 RenderLayer* RenderLayer::enclosingCompositingLayerForRepaint(IncludeSelfOrNot i ncludeSelf) const
1122 { 1134 {
1123 if (includeSelf && (compositingState() == PaintsIntoOwnBacking || compositin gState() == PaintsIntoGroupedBacking)) 1135 if ((includeSelf == IncludeSelf) && (compositingState() == PaintsIntoOwnBack ing || compositingState() == PaintsIntoGroupedBacking))
1124 return const_cast<RenderLayer*>(this); 1136 return const_cast<RenderLayer*>(this);
1125 1137
1126 for (const RenderLayer* curr = compositingContainer(this); curr; curr = comp ositingContainer(curr)) { 1138 for (const RenderLayer* curr = compositingContainer(this); curr; curr = comp ositingContainer(curr)) {
1127 if (curr->compositingState() == PaintsIntoOwnBacking || curr->compositin gState() == PaintsIntoGroupedBacking) 1139 if (curr->compositingState() == PaintsIntoOwnBacking || curr->compositin gState() == PaintsIntoGroupedBacking)
1128 return const_cast<RenderLayer*>(curr); 1140 return const_cast<RenderLayer*>(curr);
1129 } 1141 }
1130 1142
1131 return 0; 1143 return 0;
1132 } 1144 }
1133 1145
(...skipping 21 matching lines...) Expand all
1155 return 0; 1167 return 0;
1156 1168
1157 for (RenderLayer* ancestorLayer = containingBlock->enclosingLayer(); ancesto rLayer; ancestorLayer = ancestorLayer->parent()) { 1169 for (RenderLayer* ancestorLayer = containingBlock->enclosingLayer(); ancesto rLayer; ancestorLayer = ancestorLayer->parent()) {
1158 if (ancestorLayer->scrollsOverflow()) 1170 if (ancestorLayer->scrollsOverflow())
1159 return ancestorLayer; 1171 return ancestorLayer;
1160 } 1172 }
1161 1173
1162 return 0; 1174 return 0;
1163 } 1175 }
1164 1176
1165 RenderLayer* RenderLayer::enclosingFilterLayer(bool includeSelf) const 1177 RenderLayer* RenderLayer::enclosingFilterLayer(IncludeSelfOrNot includeSelf) con st
1166 { 1178 {
1167 const RenderLayer* curr = includeSelf ? this : parent(); 1179 const RenderLayer* curr = (includeSelf == IncludeSelf) ? this : parent();
1168 for (; curr; curr = curr->parent()) { 1180 for (; curr; curr = curr->parent()) {
1169 if (curr->requiresFullLayerImageForFilters()) 1181 if (curr->requiresFullLayerImageForFilters())
1170 return const_cast<RenderLayer*>(curr); 1182 return const_cast<RenderLayer*>(curr);
1171 } 1183 }
1172 1184
1173 return 0; 1185 return 0;
1174 } 1186 }
1175 1187
1176 bool RenderLayer::hasAncestorWithFilterOutsets() const 1188 bool RenderLayer::hasAncestorWithFilterOutsets() const
1177 { 1189 {
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after
1704 return scrollParent; 1716 return scrollParent;
1705 } 1717 }
1706 1718
1707 RenderLayer* RenderLayer::clipParent() const 1719 RenderLayer* RenderLayer::clipParent() const
1708 { 1720 {
1709 const bool needsAncestorClip = compositor()->clippedByAncestor(this); 1721 const bool needsAncestorClip = compositor()->clippedByAncestor(this);
1710 1722
1711 RenderLayer* clipParent = 0; 1723 RenderLayer* clipParent = 0;
1712 if ((compositingReasons() & CompositingReasonOutOfFlowClipping) && !needsAnc estorClip) { 1724 if ((compositingReasons() & CompositingReasonOutOfFlowClipping) && !needsAnc estorClip) {
1713 if (RenderObject* containingBlock = renderer()->containingBlock()) 1725 if (RenderObject* containingBlock = renderer()->containingBlock())
1714 clipParent = containingBlock->enclosingLayer()->enclosingCompositing Layer(true); 1726 clipParent = containingBlock->enclosingLayer()->enclosingCompositing Layer();
1715 } 1727 }
1716 1728
1717 return clipParent; 1729 return clipParent;
1718 } 1730 }
1719 1731
1720 void RenderLayer::didUpdateNeedsCompositedScrolling() 1732 void RenderLayer::didUpdateNeedsCompositedScrolling()
1721 { 1733 {
1722 m_stackingNode->updateIsNormalFlowOnly(); 1734 m_stackingNode->updateIsNormalFlowOnly();
1723 updateSelfPaintingLayer(); 1735 updateSelfPaintingLayer();
1724 1736
(...skipping 1771 matching lines...) Expand 10 before | Expand all | Expand 10 after
3496 3508
3497 // FIXME: Descendants that are composited should not necessarily be skipped, if they don't paint into their own 3509 // FIXME: Descendants that are composited should not necessarily be skipped, if they don't paint into their own
3498 // separate backing. Instead, they ought to contribute to the bounds of the layer we're trying to compute. 3510 // separate backing. Instead, they ought to contribute to the bounds of the layer we're trying to compute.
3499 // This applies to all z-order lists below. 3511 // This applies to all z-order lists below.
3500 RenderLayerStackingNodeIterator iterator(*m_stackingNode.get(), AllChildren) ; 3512 RenderLayerStackingNodeIterator iterator(*m_stackingNode.get(), AllChildren) ;
3501 while (RenderLayerStackingNode* node = iterator.next()) { 3513 while (RenderLayerStackingNode* node = iterator.next()) {
3502 // Node's compositing ancestor may have changed its draw content status 3514 // Node's compositing ancestor may have changed its draw content status
3503 // prior to updating its bounds. The requires-own-backing-store-for-ance stor-reasons 3515 // prior to updating its bounds. The requires-own-backing-store-for-ance stor-reasons
3504 // could be stale. Refresh them now. 3516 // could be stale. Refresh them now.
3505 if (node->layer()->hasCompositedLayerMapping()) { 3517 if (node->layer()->hasCompositedLayerMapping()) {
3506 RenderLayer* enclosingCompositingLayer = node->layer()->enclosingCom positingLayer(false); 3518 RenderLayer* enclosingCompositingLayer = node->layer()->enclosingCom positingLayer(ExcludeSelf);
3507 node->layer()->compositedLayerMapping()->updateRequiresOwnBackingSto reForAncestorReasons(enclosingCompositingLayer); 3519 node->layer()->compositedLayerMapping()->updateRequiresOwnBackingSto reForAncestorReasons(enclosingCompositingLayer);
3508 } 3520 }
3509 3521
3510 if (flags & IncludeCompositedDescendants || !node->layer()->hasComposite dLayerMapping()) { 3522 if (flags & IncludeCompositedDescendants || !node->layer()->hasComposite dLayerMapping()) {
3511 LayoutRect childUnionBounds = node->layer()->calculateLayerBounds(th is, 0, descendantFlags); 3523 LayoutRect childUnionBounds = node->layer()->calculateLayerBounds(th is, 0, descendantFlags);
3512 unionBounds.unite(childUnionBounds); 3524 unionBounds.unite(childUnionBounds);
3513 } 3525 }
3514 } 3526 }
3515 3527
3516 // FIXME: We can optimize the size of the composited layers, by not enlargin g 3528 // FIXME: We can optimize the size of the composited layers, by not enlargin g
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after
4086 } 4098 }
4087 } 4099 }
4088 4100
4089 void showLayerTree(const WebCore::RenderObject* renderer) 4101 void showLayerTree(const WebCore::RenderObject* renderer)
4090 { 4102 {
4091 if (!renderer) 4103 if (!renderer)
4092 return; 4104 return;
4093 showLayerTree(renderer->enclosingLayer()); 4105 showLayerTree(renderer->enclosingLayer());
4094 } 4106 }
4095 #endif 4107 #endif
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerCompositor.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698