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

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

Issue 14863002: Only update composited-scrolling state once after layout. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: subtreeHasOutOfFlowPositionedDescendant -> subtreeContainsOutOfFlowPositionedLayer Created 7 years, 7 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 | Annotate | Revision Log
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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 #include "core/page/UseCounter.h" 69 #include "core/page/UseCounter.h"
70 #include "core/page/animation/AnimationController.h" 70 #include "core/page/animation/AnimationController.h"
71 #include "core/page/scrolling/ScrollingCoordinator.h" 71 #include "core/page/scrolling/ScrollingCoordinator.h"
72 #include "core/platform/FloatConversion.h" 72 #include "core/platform/FloatConversion.h"
73 #include "core/platform/HistogramSupport.h" 73 #include "core/platform/HistogramSupport.h"
74 #include "core/platform/PlatformGestureEvent.h" 74 #include "core/platform/PlatformGestureEvent.h"
75 #include "core/platform/PlatformMouseEvent.h" 75 #include "core/platform/PlatformMouseEvent.h"
76 #include "core/platform/ScrollAnimator.h" 76 #include "core/platform/ScrollAnimator.h"
77 #include "core/platform/Scrollbar.h" 77 #include "core/platform/Scrollbar.h"
78 #include "core/platform/ScrollbarTheme.h" 78 #include "core/platform/ScrollbarTheme.h"
79 #include "core/platform/chromium/TraceEvent.h"
79 #include "core/platform/graphics/FloatPoint3D.h" 80 #include "core/platform/graphics/FloatPoint3D.h"
80 #include "core/platform/graphics/FloatRect.h" 81 #include "core/platform/graphics/FloatRect.h"
81 #include "core/platform/graphics/Gradient.h" 82 #include "core/platform/graphics/Gradient.h"
82 #include "core/platform/graphics/GraphicsContextStateSaver.h" 83 #include "core/platform/graphics/GraphicsContextStateSaver.h"
83 #include "core/platform/graphics/filters/custom/CustomFilterGlobalContext.h" 84 #include "core/platform/graphics/filters/custom/CustomFilterGlobalContext.h"
84 #include "core/platform/graphics/filters/custom/CustomFilterOperation.h" 85 #include "core/platform/graphics/filters/custom/CustomFilterOperation.h"
85 #include "core/platform/graphics/filters/custom/CustomFilterValidatedProgram.h" 86 #include "core/platform/graphics/filters/custom/CustomFilterValidatedProgram.h"
86 #include "core/platform/graphics/filters/custom/ValidatedCustomFilterOperation.h " 87 #include "core/platform/graphics/filters/custom/ValidatedCustomFilterOperation.h "
87 #include "core/platform/graphics/filters/FEColorMatrix.h" 88 #include "core/platform/graphics/filters/FEColorMatrix.h"
88 #include "core/platform/graphics/filters/FEMerge.h" 89 #include "core/platform/graphics/filters/FEMerge.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 } 140 }
140 141
141 RenderLayer::RenderLayer(RenderLayerModelObject* renderer) 142 RenderLayer::RenderLayer(RenderLayerModelObject* renderer)
142 : m_inResizeMode(false) 143 : m_inResizeMode(false)
143 , m_scrollDimensionsDirty(true) 144 , m_scrollDimensionsDirty(true)
144 , m_normalFlowListDirty(true) 145 , m_normalFlowListDirty(true)
145 , m_hasSelfPaintingLayerDescendant(false) 146 , m_hasSelfPaintingLayerDescendant(false)
146 , m_hasSelfPaintingLayerDescendantDirty(false) 147 , m_hasSelfPaintingLayerDescendantDirty(false)
147 , m_hasOutOfFlowPositionedDescendant(false) 148 , m_hasOutOfFlowPositionedDescendant(false)
148 , m_hasOutOfFlowPositionedDescendantDirty(true) 149 , m_hasOutOfFlowPositionedDescendantDirty(true)
150 , m_hasUnclippedDescendant(false)
149 , m_needsCompositedScrolling(false) 151 , m_needsCompositedScrolling(false)
150 , m_descendantsAreContiguousInStackingOrder(false) 152 , m_descendantsAreContiguousInStackingOrder(false)
151 , m_descendantsAreContiguousInStackingOrderDirty(true) 153 , m_descendantsAreContiguousInStackingOrderDirty(true)
152 , m_isRootLayer(renderer->isRenderView()) 154 , m_isRootLayer(renderer->isRenderView())
153 , m_usedTransparency(false) 155 , m_usedTransparency(false)
154 , m_paintingInsideReflection(false) 156 , m_paintingInsideReflection(false)
155 , m_inOverflowRelayout(false) 157 , m_inOverflowRelayout(false)
156 , m_repaintStatus(NeedsNormalRepaint) 158 , m_repaintStatus(NeedsNormalRepaint)
157 , m_visibleContentStatusDirty(true) 159 , m_visibleContentStatusDirty(true)
158 , m_hasVisibleContent(false) 160 , m_hasVisibleContent(false)
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 frameView->removeResizerArea(this); 227 frameView->removeResizerArea(this);
226 } 228 }
227 } 229 }
228 230
229 if (!m_renderer->documentBeingDestroyed()) { 231 if (!m_renderer->documentBeingDestroyed()) {
230 Node* node = m_renderer->node(); 232 Node* node = m_renderer->node();
231 if (node && node->isElementNode()) 233 if (node && node->isElementNode())
232 toElement(node)->setSavedLayerScrollOffset(m_scrollOffset); 234 toElement(node)->setSavedLayerScrollOffset(m_scrollOffset);
233 } 235 }
234 236
237 if (!m_renderer->documentBeingDestroyed())
238 compositor()->removeOutOfFlowPositionedLayer(this);
Julien - ping for review 2013/05/09 23:26:41 This is called even if a RenderLayer is not out-of
239
235 destroyScrollbar(HorizontalScrollbar); 240 destroyScrollbar(HorizontalScrollbar);
236 destroyScrollbar(VerticalScrollbar); 241 destroyScrollbar(VerticalScrollbar);
237 242
238 if (renderer()->frame() && renderer()->frame()->page()) { 243 if (renderer()->frame() && renderer()->frame()->page()) {
239 if (ScrollingCoordinator* scrollingCoordinator = renderer()->frame()->pa ge()->scrollingCoordinator()) 244 if (ScrollingCoordinator* scrollingCoordinator = renderer()->frame()->pa ge()->scrollingCoordinator())
240 scrollingCoordinator->willDestroyScrollableArea(this); 245 scrollingCoordinator->willDestroyScrollableArea(this);
241 } 246 }
242 247
243 if (m_reflection) 248 if (m_reflection)
244 removeReflection(); 249 removeReflection();
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 layer->m_hasSelfPaintingLayerDescendantDirty = true; 480 layer->m_hasSelfPaintingLayerDescendantDirty = true;
476 // If we have reached a self-painting layer, we know our parent should h ave a self-painting descendant 481 // If we have reached a self-painting layer, we know our parent should h ave a self-painting descendant
477 // in this case, there is no need to dirty our ancestors further. 482 // in this case, there is no need to dirty our ancestors further.
478 if (layer->isSelfPaintingLayer()) { 483 if (layer->isSelfPaintingLayer()) {
479 ASSERT(!parent() || parent()->m_hasSelfPaintingLayerDescendantDirty || parent()->hasSelfPaintingLayerDescendant()); 484 ASSERT(!parent() || parent()->m_hasSelfPaintingLayerDescendantDirty || parent()->hasSelfPaintingLayerDescendant());
480 break; 485 break;
481 } 486 }
482 } 487 }
483 } 488 }
484 489
490 void RenderLayer::setAncestorChainHasOutOfFlowPositionedDescendant()
491 {
492 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
493 if (!layer->m_hasOutOfFlowPositionedDescendantDirty && layer->hasOutOfFl owPositionedDescendant())
494 break;
495
496 layer->setHasOutOfFlowPositionedDescendantDirty(false);
497 layer->setHasOutOfFlowPositionedDescendant(true);
498 }
499 }
500
501 void RenderLayer::dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus()
502 {
503 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
504 layer->setHasOutOfFlowPositionedDescendantDirty(true);
505
506 // We may or may not have an unclipped descendant. If we do, we'll reset
507 // this to true the next time composited scrolling state is updated.
508 layer->setHasUnclippedDescendant(false);
Julien - ping for review 2013/05/09 23:26:41 This is an optimistic reset (not repeated for the
509
510 // If we have reached an out of flow positioned layer, we know our paren t should have an out-of-flow positioned descendant.
511 // In this case, there is no need to dirty our ancestors further.
512 if (layer->renderer()->isOutOfFlowPositioned()) {
513 ASSERT(!parent() || parent()->m_hasOutOfFlowPositionedDescendantDirt y || parent()->hasOutOfFlowPositionedDescendant());
514 break;
515 }
516 }
517 }
518
485 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const 519 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const
486 { 520 {
487 return renderer()->frame() 521 return renderer()->frame()
488 && renderer()->frame()->page() 522 && renderer()->frame()->page()
489 && renderer()->frame()->page()->settings()->acceleratedCompositingForOve rflowScrollEnabled(); 523 && renderer()->frame()->page()->settings()->acceleratedCompositingForOve rflowScrollEnabled();
490 } 524 }
491 525
492 // If we are a stacking container, then this function will determine if our 526 // If we are a stacking container, then this function will determine if our
493 // descendants for a contiguous block in stacking order. This is required in 527 // descendants for a contiguous block in stacking order. This is required in
494 // order for an element to be safely promoted to a stacking container. It is saf e 528 // order for an element to be safely promoted to a stacking container. It is saf e
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 // maxStackIndex - minStackIndex == numSCDescendants 598 // maxStackIndex - minStackIndex == numSCDescendants
565 // ===> 3 - 0 == 3 599 // ===> 3 - 0 == 3
566 // ===> 3 == 3 600 // ===> 3 == 3
567 // 601 //
568 // And we would conclude that C could be promoted. 602 // And we would conclude that C could be promoted.
569 void RenderLayer::updateDescendantsAreContiguousInStackingOrder() 603 void RenderLayer::updateDescendantsAreContiguousInStackingOrder()
570 { 604 {
571 if (!m_descendantsAreContiguousInStackingOrderDirty || !isStackingContext() || !acceleratedCompositingForOverflowScrollEnabled()) 605 if (!m_descendantsAreContiguousInStackingOrderDirty || !isStackingContext() || !acceleratedCompositingForOverflowScrollEnabled())
572 return; 606 return;
573 607
574 ASSERT(!m_normalFlowListDirty);
575 ASSERT(!m_zOrderListsDirty);
576
577 OwnPtr<Vector<RenderLayer*> > posZOrderList; 608 OwnPtr<Vector<RenderLayer*> > posZOrderList;
578 OwnPtr<Vector<RenderLayer*> > negZOrderList; 609 OwnPtr<Vector<RenderLayer*> > negZOrderList;
579 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList); 610 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList);
580 611
581 // Create a reverse lookup. 612 // Create a reverse lookup.
582 HashMap<const RenderLayer*, int> lookup; 613 HashMap<const RenderLayer*, int> lookup;
583 614
584 if (negZOrderList) { 615 if (negZOrderList) {
585 int stackingOrderIndex = -1; 616 int stackingOrderIndex = -1;
586 size_t listSize = negZOrderList->size(); 617 size_t listSize = negZOrderList->size();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
629 int childCount = 0; 660 int childCount = 0;
630 child->updateDescendantsAreContiguousInStackingOrderRecursive(lookup, ch ildMinIndex, childMaxIndex, childCount, false); 661 child->updateDescendantsAreContiguousInStackingOrderRecursive(lookup, ch ildMinIndex, childMaxIndex, childCount, false);
631 if (childCount) { 662 if (childCount) {
632 count += childCount; 663 count += childCount;
633 minIndex = std::min(minIndex, childMinIndex); 664 minIndex = std::min(minIndex, childMinIndex);
634 maxIndex = std::max(maxIndex, childMaxIndex); 665 maxIndex = std::max(maxIndex, childMaxIndex);
635 } 666 }
636 } 667 }
637 668
638 if (!isStackingContext()) { 669 if (!isStackingContext()) {
639 bool newValue = maxIndex - minIndex == count; 670 m_descendantsAreContiguousInStackingOrder = (maxIndex - minIndex) == cou nt;
640 bool didUpdate = newValue != m_descendantsAreContiguousInStackingOrder; 671 m_descendantsAreContiguousInStackingOrderDirty = false;
641 m_descendantsAreContiguousInStackingOrder = newValue;
642 if (didUpdate)
643 updateNeedsCompositedScrolling();
644 } 672 }
645 } 673 }
646 674
647 static inline bool isPositionedContainer(const RenderLayer* layer) 675 static inline bool isPositionedContainer(const RenderLayer* layer)
648 { 676 {
649 // FIXME: This is not in sync with containingBlock. 677 // FIXME: This is not in sync with containingBlock.
650 // RenderObject::canContainFixedPositionedObject() should probably be used 678 // RenderObject::canContainFixedPositionedObject() should probably be used
651 // instead. 679 // instead.
652 RenderLayerModelObject* layerRenderer = layer->renderer(); 680 RenderLayerModelObject* layerRenderer = layer->renderer();
653 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform(); 681 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform();
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 if (curr == ancestorStackingContainer) 1090 if (curr == ancestorStackingContainer)
1063 return; 1091 return;
1064 } 1092 }
1065 } 1093 }
1066 1094
1067 bool RenderLayer::canBeStackingContainer() const 1095 bool RenderLayer::canBeStackingContainer() const
1068 { 1096 {
1069 if (isStackingContext() || !ancestorStackingContainer()) 1097 if (isStackingContext() || !ancestorStackingContainer())
1070 return true; 1098 return true;
1071 1099
1100 ASSERT(!m_descendantsAreContiguousInStackingOrderDirty);
1072 return m_descendantsAreContiguousInStackingOrder; 1101 return m_descendantsAreContiguousInStackingOrder;
1073 } 1102 }
1074 1103
1075 void RenderLayer::setHasVisibleContent() 1104 void RenderLayer::setHasVisibleContent()
1076 { 1105 {
1077 if (m_hasVisibleContent && !m_visibleContentStatusDirty) { 1106 if (m_hasVisibleContent && !m_visibleContentStatusDirty) {
1078 ASSERT(!parent() || parent()->hasVisibleDescendant()); 1107 ASSERT(!parent() || parent()->hasVisibleDescendant());
1079 return; 1108 return;
1080 } 1109 }
1081 1110
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 { 1147 {
1119 for (RenderLayer* layer = this; layer; layer = layer->parent()) { 1148 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
1120 if (!layer->m_visibleDescendantStatusDirty && layer->hasVisibleDescendan t()) 1149 if (!layer->m_visibleDescendantStatusDirty && layer->hasVisibleDescendan t())
1121 break; 1150 break;
1122 1151
1123 layer->m_hasVisibleDescendant = true; 1152 layer->m_hasVisibleDescendant = true;
1124 layer->m_visibleDescendantStatusDirty = false; 1153 layer->m_visibleDescendantStatusDirty = false;
1125 } 1154 }
1126 } 1155 }
1127 1156
1128 void RenderLayer::updateDescendantDependentFlags(HashSet<const RenderObject*>* o utOfFlowDescendantContainingBlocks) 1157 void RenderLayer::updateHasUnclippedDescendant()
1158 {
1159 TRACE_EVENT0("blink_rendering", "RenderLayer::updateHasUnclippedDescendant") ;
1160 ASSERT(renderer()->isOutOfFlowPositioned());
1161 if (!m_hasVisibleContent && !m_hasVisibleDescendant)
1162 return;
1163
1164 const RenderObject* containingBlock = renderer()->containingBlock();
1165 for (RenderLayer* ancestor = parent(); ancestor && ancestor->renderer() != c ontainingBlock; ancestor = ancestor->parent())
1166 ancestor->setHasUnclippedDescendant(true);
1167 }
1168
1169 static bool subtreeContainsOutOfFlowPositionedLayer(const RenderLayer* subtreeRo ot)
1170 {
1171 return (subtreeRoot->renderer() && subtreeRoot->renderer()->isOutOfFlowPosit ioned()) || subtreeRoot->hasOutOfFlowPositionedDescendant();
1172 }
1173
1174 void RenderLayer::updateDescendantDependentFlags()
1129 { 1175 {
1130 if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty || m_hasOutOfFlowPositionedDescendantDirty) { 1176 if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty || m_hasOutOfFlowPositionedDescendantDirty) {
1131 const bool hadVisibleDescendant = m_hasVisibleDescendant;
1132 const bool hadOutOfFlowPositionedDescendant = m_hasOutOfFlowPositionedDe scendant;
1133
1134 m_hasVisibleDescendant = false; 1177 m_hasVisibleDescendant = false;
1135 m_hasSelfPaintingLayerDescendant = false; 1178 m_hasSelfPaintingLayerDescendant = false;
1136 m_hasOutOfFlowPositionedDescendant = false; 1179 m_hasOutOfFlowPositionedDescendant = false;
1137 1180
1138 HashSet<const RenderObject*> childOutOfFlowDescendantContainingBlocks;
1139 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 1181 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
1140 childOutOfFlowDescendantContainingBlocks.clear(); 1182 child->updateDescendantDependentFlags();
1141 child->updateDescendantDependentFlags(&childOutOfFlowDescendantConta iningBlocks);
1142
1143 bool childIsOutOfFlowPositioned = child->renderer() && child->render er()->isOutOfFlowPositioned();
1144 if (childIsOutOfFlowPositioned)
1145 childOutOfFlowDescendantContainingBlocks.add(child->renderer()-> containingBlock());
1146
1147 if (outOfFlowDescendantContainingBlocks) {
1148 HashSet<const RenderObject*>::const_iterator it = childOutOfFlow DescendantContainingBlocks.begin();
1149 for (; it != childOutOfFlowDescendantContainingBlocks.end(); ++i t)
1150 outOfFlowDescendantContainingBlocks->add(*it);
1151 }
1152 1183
1153 bool hasVisibleDescendant = child->m_hasVisibleContent || child->m_h asVisibleDescendant; 1184 bool hasVisibleDescendant = child->m_hasVisibleContent || child->m_h asVisibleDescendant;
1154 bool hasSelfPaintingLayerDescendant = child->isSelfPaintingLayer() | | child->hasSelfPaintingLayerDescendant(); 1185 bool hasSelfPaintingLayerDescendant = child->isSelfPaintingLayer() | | child->hasSelfPaintingLayerDescendant();
1155 bool hasOutOfFlowPositionedDescendant = hasVisibleDescendant && (!ch ildOutOfFlowDescendantContainingBlocks.isEmpty() || child->hasOutOfFlowPositione dDescendant()); 1186 bool hasOutOfFlowPositionedDescendant = subtreeContainsOutOfFlowPosi tionedLayer(child);
1156 1187
1157 m_hasVisibleDescendant |= hasVisibleDescendant; 1188 m_hasVisibleDescendant |= hasVisibleDescendant;
1158 m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant; 1189 m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant;
1159 m_hasOutOfFlowPositionedDescendant |= hasOutOfFlowPositionedDescenda nt; 1190 m_hasOutOfFlowPositionedDescendant |= hasOutOfFlowPositionedDescenda nt;
1160 1191
1161 if (m_hasVisibleDescendant && m_hasSelfPaintingLayerDescendant && m_ hasOutOfFlowPositionedDescendant) 1192 if (m_hasVisibleDescendant && m_hasSelfPaintingLayerDescendant && ha sOutOfFlowPositionedDescendant)
1162 break; 1193 break;
1163 } 1194 }
1164 1195
1165 if (outOfFlowDescendantContainingBlocks && renderer())
1166 outOfFlowDescendantContainingBlocks->remove(renderer());
1167
1168 m_visibleDescendantStatusDirty = false; 1196 m_visibleDescendantStatusDirty = false;
1169 m_hasSelfPaintingLayerDescendantDirty = false; 1197 m_hasSelfPaintingLayerDescendantDirty = false;
1170 m_hasOutOfFlowPositionedDescendantDirty = false; 1198 m_hasOutOfFlowPositionedDescendantDirty = false;
1171
1172 if (m_hasVisibleDescendant != hadVisibleDescendant || m_hasOutOfFlowPosi tionedDescendant != hadOutOfFlowPositionedDescendant)
1173 updateNeedsCompositedScrolling();
1174 } 1199 }
1175 1200
1176 if (m_visibleContentStatusDirty) { 1201 if (m_visibleContentStatusDirty) {
1177 const bool hadVisibleContent = m_hasVisibleContent;
1178 if (renderer()->style()->visibility() == VISIBLE) 1202 if (renderer()->style()->visibility() == VISIBLE)
1179 m_hasVisibleContent = true; 1203 m_hasVisibleContent = true;
1180 else { 1204 else {
1181 // layer may be hidden but still have some visible content, check fo r this 1205 // layer may be hidden but still have some visible content, check fo r this
1182 m_hasVisibleContent = false; 1206 m_hasVisibleContent = false;
1183 RenderObject* r = renderer()->firstChild(); 1207 RenderObject* r = renderer()->firstChild();
1184 while (r) { 1208 while (r) {
1185 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) { 1209 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) {
1186 m_hasVisibleContent = true; 1210 m_hasVisibleContent = true;
1187 break; 1211 break;
1188 } 1212 }
1189 if (r->firstChild() && !r->hasLayer()) 1213 if (r->firstChild() && !r->hasLayer())
1190 r = r->firstChild(); 1214 r = r->firstChild();
1191 else if (r->nextSibling()) 1215 else if (r->nextSibling())
1192 r = r->nextSibling(); 1216 r = r->nextSibling();
1193 else { 1217 else {
1194 do { 1218 do {
1195 r = r->parent(); 1219 r = r->parent();
1196 if (r == renderer()) 1220 if (r == renderer())
1197 r = 0; 1221 r = 0;
1198 } while (r && !r->nextSibling()); 1222 } while (r && !r->nextSibling());
1199 if (r) 1223 if (r)
1200 r = r->nextSibling(); 1224 r = r->nextSibling();
1201 } 1225 }
1202 } 1226 }
1203 } 1227 }
1204 m_visibleContentStatusDirty = false; 1228 m_visibleContentStatusDirty = false;
1205 if (hadVisibleContent != m_hasVisibleContent)
1206 updateNeedsCompositedScrolling();
1207 } 1229 }
1208 } 1230 }
1209 1231
1210 void RenderLayer::dirty3DTransformedDescendantStatus() 1232 void RenderLayer::dirty3DTransformedDescendantStatus()
1211 { 1233 {
1212 RenderLayer* curr = ancestorStackingContainer(); 1234 RenderLayer* curr = ancestorStackingContainer();
1213 if (curr) 1235 if (curr)
1214 curr->m_3DTransformedDescendantStatusDirty = true; 1236 curr->m_3DTransformedDescendantStatusDirty = true;
1215 1237
1216 // This propagates up through preserve-3d hierarchies to the enclosing flatt ening layer. 1238 // This propagates up through preserve-3d hierarchies to the enclosing flatt ening layer.
(...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after
1767 child->setParent(this); 1789 child->setParent(this);
1768 1790
1769 if (child->isNormalFlowOnly()) 1791 if (child->isNormalFlowOnly())
1770 dirtyNormalFlowList(); 1792 dirtyNormalFlowList();
1771 1793
1772 if (!child->isNormalFlowOnly() || child->firstChild()) { 1794 if (!child->isNormalFlowOnly() || child->firstChild()) {
1773 // Dirty the z-order list in which we are contained. The ancestorStackin gContainer() can be null in the 1795 // Dirty the z-order list in which we are contained. The ancestorStackin gContainer() can be null in the
1774 // case where we're building up generated content layers. This is ok, si nce the lists will start 1796 // case where we're building up generated content layers. This is ok, si nce the lists will start
1775 // off dirty in that case anyway. 1797 // off dirty in that case anyway.
1776 child->dirtyStackingContainerZOrderLists(); 1798 child->dirtyStackingContainerZOrderLists();
1777
1778 // Adding an out of flow positioned descendant can only affect
1779 // the opt-in decision for layers beneath and including our
1780 // containing block.
1781 RenderObject* containingBlock = child->renderer()->containingBlock();
1782 for (RenderLayer* layer = child; layer; layer = layer->parent()) {
1783 layer->updateNeedsCompositedScrolling();
1784 if (layer->renderer() == containingBlock)
1785 break;
1786 }
1787 } 1799 }
1788 1800
1789 child->updateDescendantDependentFlags(); 1801 child->updateDescendantDependentFlags();
1790 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant) 1802 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant)
1791 setAncestorChainHasVisibleDescendant(); 1803 setAncestorChainHasVisibleDescendant();
1792 1804
1793 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant()) 1805 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant())
1794 setAncestorChainHasSelfPaintingLayerDescendant(); 1806 setAncestorChainHasSelfPaintingLayerDescendant();
1795 1807
1796 if (child->renderer() && (child->renderer()->isOutOfFlowPositioned() || chil d->hasOutOfFlowPositionedDescendant())) 1808 if (subtreeContainsOutOfFlowPositionedLayer(child)) {
1797 setAncestorChainHasOutOfFlowPositionedDescendant(child->renderer()->cont ainingBlock()); 1809 // Now that the out of flow positioned descendant is in the tree, we
1810 // need to tell the compositor to reevaluate the compositing
1811 // requirements since we may be able to mark more layers as having
1812 // an 'unclipped' descendant.
1813 compositor()->setNeedsUpdateCompositingRequirementsState();
1814 setAncestorChainHasOutOfFlowPositionedDescendant();
1815 }
1798 1816
1799 compositor()->layerWasAdded(this, child); 1817 compositor()->layerWasAdded(this, child);
1800 } 1818 }
1801 1819
1802 RenderLayer* RenderLayer::removeChild(RenderLayer* oldChild) 1820 RenderLayer* RenderLayer::removeChild(RenderLayer* oldChild)
1803 { 1821 {
1804 if (!renderer()->documentBeingDestroyed()) 1822 if (!renderer()->documentBeingDestroyed())
1805 compositor()->layerWillBeRemoved(this, oldChild); 1823 compositor()->layerWillBeRemoved(this, oldChild);
1806 1824
1807 // remove the child 1825 // remove the child
1808 if (oldChild->previousSibling()) 1826 if (oldChild->previousSibling())
1809 oldChild->previousSibling()->setNextSibling(oldChild->nextSibling()); 1827 oldChild->previousSibling()->setNextSibling(oldChild->nextSibling());
1810 if (oldChild->nextSibling()) 1828 if (oldChild->nextSibling())
1811 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()) ; 1829 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()) ;
1812 1830
1813 if (m_first == oldChild) 1831 if (m_first == oldChild)
1814 m_first = oldChild->nextSibling(); 1832 m_first = oldChild->nextSibling();
1815 if (m_last == oldChild) 1833 if (m_last == oldChild)
1816 m_last = oldChild->previousSibling(); 1834 m_last = oldChild->previousSibling();
1817 1835
1818 if (oldChild->isNormalFlowOnly()) 1836 if (oldChild->isNormalFlowOnly())
1819 dirtyNormalFlowList(); 1837 dirtyNormalFlowList();
1820 if (!oldChild->isNormalFlowOnly() || oldChild->firstChild()) { 1838 if (!oldChild->isNormalFlowOnly() || oldChild->firstChild()) {
1821 // Dirty the z-order list in which we are contained. When called via th e 1839 // Dirty the z-order list in which we are contained. When called via th e
1822 // reattachment process in removeOnlyThisLayer, the layer may already be disconnected 1840 // reattachment process in removeOnlyThisLayer, the layer may already be disconnected
1823 // from the main layer tree, so we need to null-check the |stackingConta iner| value. 1841 // from the main layer tree, so we need to null-check the |stackingConta iner| value.
1824 oldChild->dirtyStackingContainerZOrderLists(); 1842 oldChild->dirtyStackingContainerZOrderLists();
1825
1826 // This could affect whether or not a layer has an out of flow
1827 // positioned descendant so we need to schedule some updates.
1828 // Removing an out of flow positioned descendant can only affect
1829 // the opt-in decision for layers beneath and including the old child's
1830 // containing block.
1831 RenderObject* containingBlock = oldChild->renderer()->containingBlock();
1832 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
1833 layer->updateNeedsCompositedScrolling();
1834 if (layer->renderer() == containingBlock)
1835 break;
1836 }
1837 } 1843 }
1838 1844
1839 if ((oldChild->renderer() && oldChild->renderer()->isOutOfFlowPositioned()) || oldChild->hasOutOfFlowPositionedDescendant())
1840 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
1841
1842 oldChild->setPreviousSibling(0); 1845 oldChild->setPreviousSibling(0);
1843 oldChild->setNextSibling(0); 1846 oldChild->setNextSibling(0);
1844 oldChild->setParent(0); 1847 oldChild->setParent(0);
1845 1848
1846 oldChild->updateDescendantDependentFlags(); 1849 oldChild->updateDescendantDependentFlags();
1850 if (subtreeContainsOutOfFlowPositionedLayer(oldChild)) {
1851 // It may now be the case that a layer no longer has an unclipped
1852 // descendant. Let the compositor know that it needs to reevaluate
1853 // its compositing requirements to check this.
1854 compositor()->setNeedsUpdateCompositingRequirementsState();
1855 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
1856 }
1857
1847 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant) 1858 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant)
1848 dirtyAncestorChainVisibleDescendantStatus(); 1859 dirtyAncestorChainVisibleDescendantStatus();
1849 1860
1850 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend ant()) 1861 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend ant())
1851 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); 1862 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
1852 1863
1853 return oldChild; 1864 return oldChild;
1854 } 1865 }
1855 1866
1856 void RenderLayer::removeOnlyThisLayer() 1867 void RenderLayer::removeOnlyThisLayer()
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
2066 case ForceCompositedScrollingOff: 2077 case ForceCompositedScrollingOff:
2067 return false; 2078 return false;
2068 } 2079 }
2069 2080
2070 ASSERT_NOT_REACHED(); 2081 ASSERT_NOT_REACHED();
2071 return m_needsCompositedScrolling; 2082 return m_needsCompositedScrolling;
2072 } 2083 }
2073 2084
2074 void RenderLayer::updateNeedsCompositedScrolling() 2085 void RenderLayer::updateNeedsCompositedScrolling()
2075 { 2086 {
2087 if (RenderLayer* ancestor = ancestorStackingContext())
2088 ancestor->updateDescendantsAreContiguousInStackingOrder();
2089
2076 bool needsCompositedScrolling = false; 2090 bool needsCompositedScrolling = false;
2077 2091
2078 FrameView* frameView = renderer()->view()->frameView(); 2092 FrameView* frameView = renderer()->view()->frameView();
2079 if (frameView && frameView->containsScrollableArea(this)) { 2093 if (frameView && frameView->containsScrollableArea(this)) {
2080 updateDescendantDependentFlags(); 2094 updateDescendantDependentFlags();
2081 2095
2082 bool forceUseCompositedScrolling = acceleratedCompositingForOverflowScro llEnabled() 2096 bool forceUseCompositedScrolling = acceleratedCompositingForOverflowScro llEnabled()
2083 && canBeStackingContainer() 2097 && canBeStackingContainer()
2084 && !hasOutOfFlowPositionedDescendant(); 2098 && !hasUnclippedDescendant();
2085 2099
2086 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING) 2100 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING)
2087 needsCompositedScrolling = forceUseCompositedScrolling || renderer()->st yle()->useTouchOverflowScrolling(); 2101 needsCompositedScrolling = forceUseCompositedScrolling || renderer()->st yle()->useTouchOverflowScrolling();
2088 #else 2102 #else
2089 needsCompositedScrolling = forceUseCompositedScrolling; 2103 needsCompositedScrolling = forceUseCompositedScrolling;
2090 #endif 2104 #endif
2091 // We gather a boolean value for use with Google UMA histograms to 2105 // We gather a boolean value for use with Google UMA histograms to
2092 // quantify the actual effects of a set of patches attempting to 2106 // quantify the actual effects of a set of patches attempting to
2093 // relax composited scrolling requirements, thereby increasing the 2107 // relax composited scrolling requirements, thereby increasing the
2094 // number of composited overflow divs. 2108 // number of composited overflow divs.
2095 if (acceleratedCompositingForOverflowScrollEnabled()) 2109 if (acceleratedCompositingForOverflowScrollEnabled())
2096 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScro lling", needsCompositedScrolling, 2); 2110 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScro lling", needsCompositedScrolling, 2);
2097 } 2111 }
2098 2112
2113 setNeedsCompositedScrolling(needsCompositedScrolling);
2114 }
2115
2116 void RenderLayer::setNeedsCompositedScrolling(bool needsCompositedScrolling)
2117 {
2099 if (m_needsCompositedScrolling == needsCompositedScrolling) 2118 if (m_needsCompositedScrolling == needsCompositedScrolling)
2100 return; 2119 return;
2101 2120
2102 m_needsCompositedScrolling = needsCompositedScrolling; 2121 m_needsCompositedScrolling = needsCompositedScrolling;
2103 2122
2104 // Note, the z-order lists may need to be rebuilt, but our code guarantees 2123 // Note, the z-order lists may need to be rebuilt, but our code guarantees
2105 // that we have not affected stacking, so we will not dirty 2124 // that we have not affected stacking, so we will not dirty
2106 // m_canBePromotedToStackingContainer for either us or our stacking context 2125 // m_canBePromotedToStackingContainer for either us or our stacking context
2107 // or container. 2126 // or container.
2108 didUpdateNeedsCompositedScrolling(); 2127 didUpdateNeedsCompositedScrolling();
(...skipping 3537 matching lines...) Expand 10 before | Expand all | Expand 10 after
5646 5665
5647 if (m_posZOrderList) 5666 if (m_posZOrderList)
5648 m_posZOrderList->clear(); 5667 m_posZOrderList->clear();
5649 if (m_negZOrderList) 5668 if (m_negZOrderList)
5650 m_negZOrderList->clear(); 5669 m_negZOrderList->clear();
5651 m_zOrderListsDirty = true; 5670 m_zOrderListsDirty = true;
5652 5671
5653 m_descendantsAreContiguousInStackingOrderDirty = true; 5672 m_descendantsAreContiguousInStackingOrderDirty = true;
5654 5673
5655 if (!renderer()->documentBeingDestroyed()) { 5674 if (!renderer()->documentBeingDestroyed()) {
5675 compositor()->setNeedsUpdateCompositingRequirementsState();
5656 compositor()->setCompositingLayersNeedRebuild(); 5676 compositor()->setCompositingLayersNeedRebuild();
5657 if (acceleratedCompositingForOverflowScrollEnabled()) 5677 if (acceleratedCompositingForOverflowScrollEnabled())
5658 compositor()->setShouldReevaluateCompositingAfterLayout(); 5678 compositor()->setShouldReevaluateCompositingAfterLayout();
5659 } 5679 }
5660 } 5680 }
5661 5681
5662 void RenderLayer::dirtyStackingContainerZOrderLists() 5682 void RenderLayer::dirtyStackingContainerZOrderLists()
5663 { 5683 {
5664 RenderLayer* stackingContainer = this->ancestorStackingContainer(); 5684 RenderLayer* stackingContainer = this->ancestorStackingContainer();
5665 if (stackingContainer) 5685 if (stackingContainer)
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
5784 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 5804 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
5785 // Ignore reflections. 5805 // Ignore reflections.
5786 if (!m_reflection || reflectionLayer() != child) 5806 if (!m_reflection || reflectionLayer() != child)
5787 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContainer); 5807 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContainer);
5788 } 5808 }
5789 } 5809 }
5790 } 5810 }
5791 5811
5792 void RenderLayer::updateLayerListsIfNeeded() 5812 void RenderLayer::updateLayerListsIfNeeded()
5793 { 5813 {
5794 bool shouldUpdateDescendantsAreContiguousInStackingOrder = acceleratedCompos itingForOverflowScrollEnabled() && isStackingContext() && (m_zOrderListsDirty || m_normalFlowListDirty) && m_descendantsAreContiguousInStackingOrderDirty;
5795 updateZOrderLists(); 5814 updateZOrderLists();
5796 updateNormalFlowList(); 5815 updateNormalFlowList();
5797 5816
5798 if (RenderLayer* reflectionLayer = this->reflectionLayer()) { 5817 if (RenderLayer* reflectionLayer = this->reflectionLayer()) {
5799 reflectionLayer->updateZOrderLists(); 5818 reflectionLayer->updateZOrderLists();
5800 reflectionLayer->updateNormalFlowList(); 5819 reflectionLayer->updateNormalFlowList();
5801 } 5820 }
5802
5803 if (shouldUpdateDescendantsAreContiguousInStackingOrder) {
5804 updateDescendantsAreContiguousInStackingOrder();
5805 // The above function can cause us to update m_needsCompositedScrolling
5806 // and dirty our layer lists. Refresh them if necessary.
5807 updateZOrderLists();
5808 updateNormalFlowList();
5809 }
5810 } 5821 }
5811 5822
5812 void RenderLayer::repaintIncludingDescendants() 5823 void RenderLayer::repaintIncludingDescendants()
5813 { 5824 {
5814 renderer()->repaint(); 5825 renderer()->repaint();
5815 for (RenderLayer* curr = firstChild(); curr; curr = curr->nextSibling()) 5826 for (RenderLayer* curr = firstChild(); curr; curr = curr->nextSibling())
5816 curr->repaintIncludingDescendants(); 5827 curr->repaintIncludingDescendants();
5817 } 5828 }
5818 5829
5819 void RenderLayer::setBackingNeedsRepaint() 5830 void RenderLayer::setBackingNeedsRepaint()
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
5972 return true; 5983 return true;
5973 5984
5974 if (hasVisibleBoxDecorations()) 5985 if (hasVisibleBoxDecorations())
5975 return true; 5986 return true;
5976 5987
5977 return false; 5988 return false;
5978 } 5989 }
5979 5990
5980 void RenderLayer::updateVisibilityAfterStyleChange(const RenderStyle* oldStyle) 5991 void RenderLayer::updateVisibilityAfterStyleChange(const RenderStyle* oldStyle)
5981 { 5992 {
5982 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE; 5993 if (!oldStyle || (oldStyle->visibility() != renderer()->style()->visibility( )))
Julien - ping for review 2013/05/09 23:26:41 /me still prefers early returns, especially since
5983 if (oldVisibility == renderer()->style()->visibility() || !renderer()->isOut OfFlowPositioned()) 5994 compositor()->setNeedsUpdateCompositingRequirementsState();
5984 return;
5985
5986 if (renderer()->style()->visibility() == VISIBLE)
5987 setAncestorChainHasOutOfFlowPositionedDescendant(renderer()->containingB lock());
5988 else
5989 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
5990 } 5995 }
5991 5996
5992 void RenderLayer::updateStackingContextsAfterStyleChange(const RenderStyle* oldS tyle) 5997 void RenderLayer::updateStackingContextsAfterStyleChange(const RenderStyle* oldS tyle)
5993 { 5998 {
5994 bool wasStackingContext = oldStyle ? isStackingContext(oldStyle) : false; 5999 bool wasStackingContext = oldStyle ? isStackingContext(oldStyle) : false;
5995 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE; 6000 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE;
5996 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0; 6001 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0;
5997 6002
5998 // FIXME: RenderLayer already handles visibility changes through our visibli ty dirty bits. This logic could 6003 // FIXME: RenderLayer already handles visibility changes through our visibli ty dirty bits. This logic could
5999 // likely be folded along with the rest. 6004 // likely be folded along with the rest.
6000 bool isStackingContext = this->isStackingContext(); 6005 bool isStackingContext = this->isStackingContext();
6001 if (isStackingContext == wasStackingContext && oldVisibility == renderer()-> style()->visibility() && oldZIndex == renderer()->style()->zIndex()) 6006 if (isStackingContext == wasStackingContext && oldVisibility == renderer()-> style()->visibility() && oldZIndex == renderer()->style()->zIndex())
6002 return; 6007 return;
6003 6008
6004 dirtyStackingContainerZOrderLists(); 6009 dirtyStackingContainerZOrderLists();
6005 6010
6006 if (isStackingContainer()) 6011 if (isStackingContainer())
6007 dirtyZOrderLists(); 6012 dirtyZOrderLists();
6008 else 6013 else
6009 clearZOrderLists(); 6014 clearZOrderLists();
6010 6015
6011 updateNeedsCompositedScrolling(); 6016 compositor()->setNeedsUpdateCompositingRequirementsState();
6012 } 6017 }
6013 6018
6014 static bool overflowRequiresScrollbar(EOverflow overflow) 6019 static bool overflowRequiresScrollbar(EOverflow overflow)
6015 { 6020 {
6016 return overflow == OSCROLL; 6021 return overflow == OSCROLL;
6017 } 6022 }
6018 6023
6019 static bool overflowDefinesAutomaticScrollbar(EOverflow overflow) 6024 static bool overflowDefinesAutomaticScrollbar(EOverflow overflow)
6020 { 6025 {
6021 return overflow == OAUTO || overflow == OOVERLAY; 6026 return overflow == OAUTO || overflow == OOVERLAY;
(...skipping 28 matching lines...) Expand all
6050 6055
6051 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL & & overflowY != OSCROLL) { 6056 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL & & overflowY != OSCROLL) {
6052 ASSERT(hasVerticalScrollbar()); 6057 ASSERT(hasVerticalScrollbar());
6053 m_vBar->setEnabled(true); 6058 m_vBar->setEnabled(true);
6054 } 6059 }
6055 6060
6056 if (!m_scrollDimensionsDirty) 6061 if (!m_scrollDimensionsDirty)
6057 updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollab leVerticalOverflow()); 6062 updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollab leVerticalOverflow());
6058 } 6063 }
6059 6064
6060 void RenderLayer::setAncestorChainHasOutOfFlowPositionedDescendant(RenderObject* containingBlock)
6061 {
6062 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
6063 if (!layer->m_hasOutOfFlowPositionedDescendantDirty && layer->hasOutOfFl owPositionedDescendant())
6064 break;
6065
6066 layer->m_hasOutOfFlowPositionedDescendantDirty = false;
6067 layer->m_hasOutOfFlowPositionedDescendant = true;
6068 layer->updateNeedsCompositedScrolling();
6069
6070 if (layer->renderer() && layer->renderer() == containingBlock)
6071 break;
6072 }
6073 }
6074
6075 void RenderLayer::dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus()
6076 {
6077 if (m_hasOutOfFlowPositionedDescendant) {
6078 m_hasOutOfFlowPositionedDescendantDirty = true;
6079 // FIXME It would be nice to avoid this when we clean up render layer
6080 // updating. We shouldn't have to update the composited scrolling state
6081 // nearly as frequently if all the updates happen in a single, well
6082 // defined phase.
6083 updateNeedsCompositedScrolling();
6084 }
6085
6086 if (parent())
6087 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
6088 }
6089
6090 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle) 6065 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle)
6091 { 6066 {
6067 if (oldStyle && (renderer()->style()->position() == oldStyle->position()))
6068 return;
6069
6092 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP osition || oldStyle->position() == FixedPosition); 6070 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP osition || oldStyle->position() == FixedPosition);
6093 bool isOutOfFlowPositioned = renderer()->isOutOfFlowPositioned(); 6071 bool isOutOfFlowPositioned = renderer()->isOutOfFlowPositioned();
6094 if (parent() && isOutOfFlowPositioned != wasOutOfFlowPositioned) { 6072 if (!wasOutOfFlowPositioned && !isOutOfFlowPositioned)
6095 if (isOutOfFlowPositioned) 6073 return;
6096 parent()->setAncestorChainHasOutOfFlowPositionedDescendant(renderer( )->containingBlock()); 6074
6097 else 6075 // Even if the layer remains out-of-flow, a change to this property
6098 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus() ; 6076 // will likely change its containing block. We must clear these bits
6077 // so that they can be set properly by the RenderLayerCompositor.
6078 for (RenderLayer* ancestor = parent(); ancestor; ancestor = ancestor->parent ())
6079 ancestor->setHasUnclippedDescendant(false);
6080
6081 // Ensures that we reset the above bits correctly.
6082 compositor()->setNeedsUpdateCompositingRequirementsState();
6083
6084 if (wasOutOfFlowPositioned && isOutOfFlowPositioned)
6085 return;
6086
6087 if (isOutOfFlowPositioned) {
6088 setAncestorChainHasOutOfFlowPositionedDescendant();
6089 compositor()->addOutOfFlowPositionedLayer(this);
6090 } else {
6091 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
6092 compositor()->removeOutOfFlowPositionedLayer(this);
6099 } 6093 }
6100 } 6094 }
6101 6095
6102 static bool hasOrHadFilters(const RenderStyle* oldStyle, const RenderStyle* newS tyle) 6096 static bool hasOrHadFilters(const RenderStyle* oldStyle, const RenderStyle* newS tyle)
6103 { 6097 {
6104 ASSERT(newStyle); 6098 ASSERT(newStyle);
6105 return (oldStyle && oldStyle->hasFilter()) || newStyle->hasFilter(); 6099 return (oldStyle && oldStyle->hasFilter()) || newStyle->hasFilter();
6106 } 6100 }
6107 6101
6108 inline bool RenderLayer::needsCompositingLayersRebuiltForClip(const RenderStyle* oldStyle, const RenderStyle* newStyle) const 6102 inline bool RenderLayer::needsCompositingLayersRebuiltForClip(const RenderStyle* oldStyle, const RenderStyle* newStyle) const
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
6255 6249
6256 FrameView* frameView = frame->view(); 6250 FrameView* frameView = frame->view();
6257 if (!frameView) 6251 if (!frameView)
6258 return; 6252 return;
6259 6253
6260 bool isVisibleToHitTest = renderer()->visibleToHitTesting(); 6254 bool isVisibleToHitTest = renderer()->visibleToHitTesting();
6261 if (HTMLFrameOwnerElement* owner = frame->ownerElement()) 6255 if (HTMLFrameOwnerElement* owner = frame->ownerElement())
6262 isVisibleToHitTest &= owner->renderer() && owner->renderer()->visibleToH itTesting(); 6256 isVisibleToHitTest &= owner->renderer() && owner->renderer()->visibleToH itTesting();
6263 6257
6264 bool updatedScrollableAreaSet = false; 6258 bool updatedScrollableAreaSet = false;
6265 if (hasOverflow && isVisibleToHitTest) 6259 if (hasOverflow && isVisibleToHitTest) {
6266 updatedScrollableAreaSet = frameView->addScrollableArea(this); 6260 if (frameView->addScrollableArea(this))
6267 else 6261 compositor()->setNeedsUpdateCompositingRequirementsState();
6268 updatedScrollableAreaSet = frameView->removeScrollableArea(this); 6262 } else {
6269 6263 if (frameView->removeScrollableArea(this))
6270 if (updatedScrollableAreaSet) 6264 setNeedsCompositedScrolling(false);
6271 updateNeedsCompositedScrolling(); 6265 }
6272 } 6266 }
6273 6267
6274 void RenderLayer::updateScrollCornerStyle() 6268 void RenderLayer::updateScrollCornerStyle()
6275 { 6269 {
6276 RenderObject* actualRenderer = rendererForScrollbar(renderer()); 6270 RenderObject* actualRenderer = rendererForScrollbar(renderer());
6277 RefPtr<RenderStyle> corner = renderer()->hasOverflowClip() ? actualRenderer- >getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), actualRenderer->st yle()) : PassRefPtr<RenderStyle>(0); 6271 RefPtr<RenderStyle> corner = renderer()->hasOverflowClip() ? actualRenderer- >getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), actualRenderer->st yle()) : PassRefPtr<RenderStyle>(0);
6278 if (corner) { 6272 if (corner) {
6279 if (!m_scrollCorner) { 6273 if (!m_scrollCorner) {
6280 m_scrollCorner = RenderScrollbarPart::createAnonymous(renderer()->do cument()); 6274 m_scrollCorner = RenderScrollbarPart::createAnonymous(renderer()->do cument());
6281 m_scrollCorner->setParent(renderer()); 6275 m_scrollCorner->setParent(renderer());
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
6512 } 6506 }
6513 } 6507 }
6514 6508
6515 void showLayerTree(const WebCore::RenderObject* renderer) 6509 void showLayerTree(const WebCore::RenderObject* renderer)
6516 { 6510 {
6517 if (!renderer) 6511 if (!renderer)
6518 return; 6512 return;
6519 showLayerTree(renderer->enclosingLayer()); 6513 showLayerTree(renderer->enclosingLayer());
6520 } 6514 }
6521 #endif 6515 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698