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

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: updating expectations. Created 7 years, 6 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
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerCompositor.h » ('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 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 #include "core/page/Settings.h" 65 #include "core/page/Settings.h"
66 #include "core/page/UseCounter.h" 66 #include "core/page/UseCounter.h"
67 #include "core/page/animation/AnimationController.h" 67 #include "core/page/animation/AnimationController.h"
68 #include "core/page/scrolling/ScrollingCoordinator.h" 68 #include "core/page/scrolling/ScrollingCoordinator.h"
69 #include "core/platform/HistogramSupport.h" 69 #include "core/platform/HistogramSupport.h"
70 #include "core/platform/PlatformGestureEvent.h" 70 #include "core/platform/PlatformGestureEvent.h"
71 #include "core/platform/PlatformMouseEvent.h" 71 #include "core/platform/PlatformMouseEvent.h"
72 #include "core/platform/ScrollAnimator.h" 72 #include "core/platform/ScrollAnimator.h"
73 #include "core/platform/Scrollbar.h" 73 #include "core/platform/Scrollbar.h"
74 #include "core/platform/ScrollbarTheme.h" 74 #include "core/platform/ScrollbarTheme.h"
75 #include "core/platform/chromium/TraceEvent.h"
75 #include "core/platform/graphics/FloatPoint3D.h" 76 #include "core/platform/graphics/FloatPoint3D.h"
76 #include "core/platform/graphics/FloatRect.h" 77 #include "core/platform/graphics/FloatRect.h"
77 #include "core/platform/graphics/GraphicsContextStateSaver.h" 78 #include "core/platform/graphics/GraphicsContextStateSaver.h"
78 #include "core/platform/graphics/filters/custom/CustomFilterGlobalContext.h" 79 #include "core/platform/graphics/filters/custom/CustomFilterGlobalContext.h"
79 #include "core/platform/graphics/filters/custom/CustomFilterOperation.h" 80 #include "core/platform/graphics/filters/custom/CustomFilterOperation.h"
80 #include "core/platform/graphics/filters/custom/CustomFilterValidatedProgram.h" 81 #include "core/platform/graphics/filters/custom/CustomFilterValidatedProgram.h"
81 #include "core/platform/graphics/filters/custom/ValidatedCustomFilterOperation.h " 82 #include "core/platform/graphics/filters/custom/ValidatedCustomFilterOperation.h "
82 #include "core/platform/graphics/transforms/ScaleTransformOperation.h" 83 #include "core/platform/graphics/transforms/ScaleTransformOperation.h"
83 #include "core/platform/graphics/transforms/TransformationMatrix.h" 84 #include "core/platform/graphics/transforms/TransformationMatrix.h"
84 #include "core/platform/graphics/transforms/TranslateTransformOperation.h" 85 #include "core/platform/graphics/transforms/TranslateTransformOperation.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
124 } 125 }
125 126
126 RenderLayer::RenderLayer(RenderLayerModelObject* renderer) 127 RenderLayer::RenderLayer(RenderLayerModelObject* renderer)
127 : m_inResizeMode(false) 128 : m_inResizeMode(false)
128 , m_scrollDimensionsDirty(true) 129 , m_scrollDimensionsDirty(true)
129 , m_normalFlowListDirty(true) 130 , m_normalFlowListDirty(true)
130 , m_hasSelfPaintingLayerDescendant(false) 131 , m_hasSelfPaintingLayerDescendant(false)
131 , m_hasSelfPaintingLayerDescendantDirty(false) 132 , m_hasSelfPaintingLayerDescendantDirty(false)
132 , m_hasOutOfFlowPositionedDescendant(false) 133 , m_hasOutOfFlowPositionedDescendant(false)
133 , m_hasOutOfFlowPositionedDescendantDirty(true) 134 , m_hasOutOfFlowPositionedDescendantDirty(true)
135 , m_hasUnclippedDescendant(false)
134 , m_needsCompositedScrolling(false) 136 , m_needsCompositedScrolling(false)
135 , m_descendantsAreContiguousInStackingOrder(false) 137 , m_descendantsAreContiguousInStackingOrder(false)
136 , m_descendantsAreContiguousInStackingOrderDirty(true) 138 , m_descendantsAreContiguousInStackingOrderDirty(true)
137 , m_isRootLayer(renderer->isRenderView()) 139 , m_isRootLayer(renderer->isRenderView())
138 , m_usedTransparency(false) 140 , m_usedTransparency(false)
139 , m_paintingInsideReflection(false) 141 , m_paintingInsideReflection(false)
140 , m_inOverflowRelayout(false) 142 , m_inOverflowRelayout(false)
141 , m_repaintStatus(NeedsNormalRepaint) 143 , m_repaintStatus(NeedsNormalRepaint)
142 , m_visibleContentStatusDirty(true) 144 , m_visibleContentStatusDirty(true)
143 , m_hasVisibleContent(false) 145 , m_hasVisibleContent(false)
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 frameView->removeResizerArea(this); 210 frameView->removeResizerArea(this);
209 } 211 }
210 } 212 }
211 213
212 if (!m_renderer->documentBeingDestroyed()) { 214 if (!m_renderer->documentBeingDestroyed()) {
213 Node* node = m_renderer->node(); 215 Node* node = m_renderer->node();
214 if (node && node->isElementNode()) 216 if (node && node->isElementNode())
215 toElement(node)->setSavedLayerScrollOffset(m_scrollOffset); 217 toElement(node)->setSavedLayerScrollOffset(m_scrollOffset);
216 } 218 }
217 219
220 if (!m_renderer->documentBeingDestroyed())
221 compositor()->removeOutOfFlowPositionedLayer(this);
222
218 destroyScrollbar(HorizontalScrollbar); 223 destroyScrollbar(HorizontalScrollbar);
219 destroyScrollbar(VerticalScrollbar); 224 destroyScrollbar(VerticalScrollbar);
220 225
221 if (renderer()->frame() && renderer()->frame()->page()) { 226 if (renderer()->frame() && renderer()->frame()->page()) {
222 if (ScrollingCoordinator* scrollingCoordinator = renderer()->frame()->pa ge()->scrollingCoordinator()) 227 if (ScrollingCoordinator* scrollingCoordinator = renderer()->frame()->pa ge()->scrollingCoordinator())
223 scrollingCoordinator->willDestroyScrollableArea(this); 228 scrollingCoordinator->willDestroyScrollableArea(this);
224 } 229 }
225 230
226 if (m_reflection) 231 if (m_reflection)
227 removeReflection(); 232 removeReflection();
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
458 layer->m_hasSelfPaintingLayerDescendantDirty = true; 463 layer->m_hasSelfPaintingLayerDescendantDirty = true;
459 // If we have reached a self-painting layer, we know our parent should h ave a self-painting descendant 464 // If we have reached a self-painting layer, we know our parent should h ave a self-painting descendant
460 // in this case, there is no need to dirty our ancestors further. 465 // in this case, there is no need to dirty our ancestors further.
461 if (layer->isSelfPaintingLayer()) { 466 if (layer->isSelfPaintingLayer()) {
462 ASSERT(!parent() || parent()->m_hasSelfPaintingLayerDescendantDirty || parent()->hasSelfPaintingLayerDescendant()); 467 ASSERT(!parent() || parent()->m_hasSelfPaintingLayerDescendantDirty || parent()->hasSelfPaintingLayerDescendant());
463 break; 468 break;
464 } 469 }
465 } 470 }
466 } 471 }
467 472
473 void RenderLayer::setAncestorChainHasOutOfFlowPositionedDescendant()
474 {
475 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
476 if (!layer->m_hasOutOfFlowPositionedDescendantDirty && layer->hasOutOfFl owPositionedDescendant())
477 break;
478
479 layer->setHasOutOfFlowPositionedDescendantDirty(false);
480 layer->setHasOutOfFlowPositionedDescendant(true);
481 }
482 }
483
484 void RenderLayer::dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus()
485 {
486 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
487 layer->setHasOutOfFlowPositionedDescendantDirty(true);
488
489 // We may or may not have an unclipped descendant. If we do, we'll reset
490 // this to true the next time composited scrolling state is updated.
491 layer->setHasUnclippedDescendant(false);
492
493 // If we have reached an out of flow positioned layer, we know our paren t should have an out-of-flow positioned descendant.
494 // In this case, there is no need to dirty our ancestors further.
495 if (layer->renderer()->isOutOfFlowPositioned()) {
496 ASSERT(!parent() || parent()->m_hasOutOfFlowPositionedDescendantDirt y || parent()->hasOutOfFlowPositionedDescendant());
497 break;
498 }
499 }
500 }
501
468 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const 502 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const
469 { 503 {
470 const Settings* settings = renderer()->document()->settings(); 504 const Settings* settings = renderer()->document()->settings();
471 return settings && settings->acceleratedCompositingForOverflowScrollEnabled( ); 505 return settings && settings->acceleratedCompositingForOverflowScrollEnabled( );
472 } 506 }
473 507
474 // If we are a stacking container, then this function will determine if our 508 // If we are a stacking container, then this function will determine if our
475 // descendants for a contiguous block in stacking order. This is required in 509 // descendants for a contiguous block in stacking order. This is required in
476 // order for an element to be safely promoted to a stacking container. It is saf e 510 // order for an element to be safely promoted to a stacking container. It is saf e
477 // to become a stacking container if this change would not alter the stacking 511 // to become a stacking container if this change would not alter the stacking
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
546 // maxStackIndex - minStackIndex == numSCDescendants 580 // maxStackIndex - minStackIndex == numSCDescendants
547 // ===> 3 - 0 == 3 581 // ===> 3 - 0 == 3
548 // ===> 3 == 3 582 // ===> 3 == 3
549 // 583 //
550 // And we would conclude that C could be promoted. 584 // And we would conclude that C could be promoted.
551 void RenderLayer::updateDescendantsAreContiguousInStackingOrder() 585 void RenderLayer::updateDescendantsAreContiguousInStackingOrder()
552 { 586 {
553 if (!m_descendantsAreContiguousInStackingOrderDirty || !isStackingContext() || !acceleratedCompositingForOverflowScrollEnabled()) 587 if (!m_descendantsAreContiguousInStackingOrderDirty || !isStackingContext() || !acceleratedCompositingForOverflowScrollEnabled())
554 return; 588 return;
555 589
556 ASSERT(!m_normalFlowListDirty);
557 ASSERT(!m_zOrderListsDirty);
558
559 OwnPtr<Vector<RenderLayer*> > posZOrderList; 590 OwnPtr<Vector<RenderLayer*> > posZOrderList;
560 OwnPtr<Vector<RenderLayer*> > negZOrderList; 591 OwnPtr<Vector<RenderLayer*> > negZOrderList;
561 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList); 592 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList);
562 593
563 // Create a reverse lookup. 594 // Create a reverse lookup.
564 HashMap<const RenderLayer*, int> lookup; 595 HashMap<const RenderLayer*, int> lookup;
565 596
566 if (negZOrderList) { 597 if (negZOrderList) {
567 int stackingOrderIndex = -1; 598 int stackingOrderIndex = -1;
568 size_t listSize = negZOrderList->size(); 599 size_t listSize = negZOrderList->size();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 int childCount = 0; 642 int childCount = 0;
612 child->updateDescendantsAreContiguousInStackingOrderRecursive(lookup, ch ildMinIndex, childMaxIndex, childCount, false); 643 child->updateDescendantsAreContiguousInStackingOrderRecursive(lookup, ch ildMinIndex, childMaxIndex, childCount, false);
613 if (childCount) { 644 if (childCount) {
614 count += childCount; 645 count += childCount;
615 minIndex = std::min(minIndex, childMinIndex); 646 minIndex = std::min(minIndex, childMinIndex);
616 maxIndex = std::max(maxIndex, childMaxIndex); 647 maxIndex = std::max(maxIndex, childMaxIndex);
617 } 648 }
618 } 649 }
619 650
620 if (!isStackingContext()) { 651 if (!isStackingContext()) {
621 bool newValue = maxIndex - minIndex == count; 652 m_descendantsAreContiguousInStackingOrder = (maxIndex - minIndex) == cou nt;
622 bool didUpdate = newValue != m_descendantsAreContiguousInStackingOrder; 653 m_descendantsAreContiguousInStackingOrderDirty = false;
623 m_descendantsAreContiguousInStackingOrder = newValue;
624 if (didUpdate)
625 updateNeedsCompositedScrolling();
626 } 654 }
627 } 655 }
628 656
629 static inline bool isPositionedContainer(const RenderLayer* layer) 657 static inline bool isPositionedContainer(const RenderLayer* layer)
630 { 658 {
631 // FIXME: This is not in sync with containingBlock. 659 // FIXME: This is not in sync with containingBlock.
632 // RenderObject::canContainFixedPositionedObject() should probably be used 660 // RenderObject::canContainFixedPositionedObject() should probably be used
633 // instead. 661 // instead.
634 RenderLayerModelObject* layerRenderer = layer->renderer(); 662 RenderLayerModelObject* layerRenderer = layer->renderer();
635 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform(); 663 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform();
(...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 if (curr == ancestorStackingContainer) 1078 if (curr == ancestorStackingContainer)
1051 return; 1079 return;
1052 } 1080 }
1053 } 1081 }
1054 1082
1055 bool RenderLayer::canBeStackingContainer() const 1083 bool RenderLayer::canBeStackingContainer() const
1056 { 1084 {
1057 if (isStackingContext() || !ancestorStackingContainer()) 1085 if (isStackingContext() || !ancestorStackingContainer())
1058 return true; 1086 return true;
1059 1087
1088 ASSERT(!m_descendantsAreContiguousInStackingOrderDirty);
1060 return m_descendantsAreContiguousInStackingOrder; 1089 return m_descendantsAreContiguousInStackingOrder;
1061 } 1090 }
1062 1091
1063 void RenderLayer::setHasVisibleContent() 1092 void RenderLayer::setHasVisibleContent()
1064 { 1093 {
1065 if (m_hasVisibleContent && !m_visibleContentStatusDirty) { 1094 if (m_hasVisibleContent && !m_visibleContentStatusDirty) {
1066 ASSERT(!parent() || parent()->hasVisibleDescendant()); 1095 ASSERT(!parent() || parent()->hasVisibleDescendant());
1067 return; 1096 return;
1068 } 1097 }
1069 1098
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
1106 { 1135 {
1107 for (RenderLayer* layer = this; layer; layer = layer->parent()) { 1136 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
1108 if (!layer->m_visibleDescendantStatusDirty && layer->hasVisibleDescendan t()) 1137 if (!layer->m_visibleDescendantStatusDirty && layer->hasVisibleDescendan t())
1109 break; 1138 break;
1110 1139
1111 layer->m_hasVisibleDescendant = true; 1140 layer->m_hasVisibleDescendant = true;
1112 layer->m_visibleDescendantStatusDirty = false; 1141 layer->m_visibleDescendantStatusDirty = false;
1113 } 1142 }
1114 } 1143 }
1115 1144
1116 void RenderLayer::updateDescendantDependentFlags(HashSet<const RenderObject*>* o utOfFlowDescendantContainingBlocks) 1145 void RenderLayer::updateHasUnclippedDescendant()
1146 {
1147 TRACE_EVENT0("blink_rendering", "RenderLayer::updateHasUnclippedDescendant") ;
1148 ASSERT(renderer()->isOutOfFlowPositioned());
1149 if (!m_hasVisibleContent && !m_hasVisibleDescendant)
1150 return;
1151
1152 const RenderObject* containingBlock = renderer()->containingBlock();
1153 for (RenderLayer* ancestor = parent(); ancestor && ancestor->renderer() != c ontainingBlock; ancestor = ancestor->parent())
1154 ancestor->setHasUnclippedDescendant(true);
1155 }
1156
1157 static bool subtreeContainsOutOfFlowPositionedLayer(const RenderLayer* subtreeRo ot)
1158 {
1159 return (subtreeRoot->renderer() && subtreeRoot->renderer()->isOutOfFlowPosit ioned()) || subtreeRoot->hasOutOfFlowPositionedDescendant();
1160 }
1161
1162 void RenderLayer::updateDescendantDependentFlags()
1117 { 1163 {
1118 if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty || m_hasOutOfFlowPositionedDescendantDirty) { 1164 if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty || m_hasOutOfFlowPositionedDescendantDirty) {
1119 const bool hadVisibleDescendant = m_hasVisibleDescendant;
1120 const bool hadOutOfFlowPositionedDescendant = m_hasOutOfFlowPositionedDe scendant;
1121
1122 m_hasVisibleDescendant = false; 1165 m_hasVisibleDescendant = false;
1123 m_hasSelfPaintingLayerDescendant = false; 1166 m_hasSelfPaintingLayerDescendant = false;
1124 m_hasOutOfFlowPositionedDescendant = false; 1167 m_hasOutOfFlowPositionedDescendant = false;
1125 1168
1126 HashSet<const RenderObject*> childOutOfFlowDescendantContainingBlocks;
1127 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 1169 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
1128 childOutOfFlowDescendantContainingBlocks.clear(); 1170 child->updateDescendantDependentFlags();
1129 child->updateDescendantDependentFlags(&childOutOfFlowDescendantConta iningBlocks);
1130
1131 bool childIsOutOfFlowPositioned = child->renderer() && child->render er()->isOutOfFlowPositioned();
1132 if (childIsOutOfFlowPositioned)
1133 childOutOfFlowDescendantContainingBlocks.add(child->renderer()-> containingBlock());
1134
1135 if (outOfFlowDescendantContainingBlocks) {
1136 HashSet<const RenderObject*>::const_iterator it = childOutOfFlow DescendantContainingBlocks.begin();
1137 for (; it != childOutOfFlowDescendantContainingBlocks.end(); ++i t)
1138 outOfFlowDescendantContainingBlocks->add(*it);
1139 }
1140 1171
1141 bool hasVisibleDescendant = child->m_hasVisibleContent || child->m_h asVisibleDescendant; 1172 bool hasVisibleDescendant = child->m_hasVisibleContent || child->m_h asVisibleDescendant;
1142 bool hasSelfPaintingLayerDescendant = child->isSelfPaintingLayer() | | child->hasSelfPaintingLayerDescendant(); 1173 bool hasSelfPaintingLayerDescendant = child->isSelfPaintingLayer() | | child->hasSelfPaintingLayerDescendant();
1143 bool hasOutOfFlowPositionedDescendant = hasVisibleDescendant && (!ch ildOutOfFlowDescendantContainingBlocks.isEmpty() || child->hasOutOfFlowPositione dDescendant()); 1174 bool hasOutOfFlowPositionedDescendant = subtreeContainsOutOfFlowPosi tionedLayer(child);
1144 1175
1145 m_hasVisibleDescendant |= hasVisibleDescendant; 1176 m_hasVisibleDescendant |= hasVisibleDescendant;
1146 m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant; 1177 m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant;
1147 m_hasOutOfFlowPositionedDescendant |= hasOutOfFlowPositionedDescenda nt; 1178 m_hasOutOfFlowPositionedDescendant |= hasOutOfFlowPositionedDescenda nt;
1148 1179
1149 if (m_hasVisibleDescendant && m_hasSelfPaintingLayerDescendant && m_ hasOutOfFlowPositionedDescendant) 1180 if (m_hasVisibleDescendant && m_hasSelfPaintingLayerDescendant && ha sOutOfFlowPositionedDescendant)
1150 break; 1181 break;
1151 } 1182 }
1152 1183
1153 if (outOfFlowDescendantContainingBlocks && renderer())
1154 outOfFlowDescendantContainingBlocks->remove(renderer());
1155
1156 m_visibleDescendantStatusDirty = false; 1184 m_visibleDescendantStatusDirty = false;
1157 m_hasSelfPaintingLayerDescendantDirty = false; 1185 m_hasSelfPaintingLayerDescendantDirty = false;
1158 m_hasOutOfFlowPositionedDescendantDirty = false; 1186 m_hasOutOfFlowPositionedDescendantDirty = false;
1159
1160 if (m_hasVisibleDescendant != hadVisibleDescendant || m_hasOutOfFlowPosi tionedDescendant != hadOutOfFlowPositionedDescendant)
1161 updateNeedsCompositedScrolling();
1162 } 1187 }
1163 1188
1164 if (m_visibleContentStatusDirty) { 1189 if (m_visibleContentStatusDirty) {
1165 const bool hadVisibleContent = m_hasVisibleContent;
1166 if (renderer()->style()->visibility() == VISIBLE) 1190 if (renderer()->style()->visibility() == VISIBLE)
1167 m_hasVisibleContent = true; 1191 m_hasVisibleContent = true;
1168 else { 1192 else {
1169 // layer may be hidden but still have some visible content, check fo r this 1193 // layer may be hidden but still have some visible content, check fo r this
1170 m_hasVisibleContent = false; 1194 m_hasVisibleContent = false;
1171 RenderObject* r = renderer()->firstChild(); 1195 RenderObject* r = renderer()->firstChild();
1172 while (r) { 1196 while (r) {
1173 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) { 1197 if (r->style()->visibility() == VISIBLE && !r->hasLayer()) {
1174 m_hasVisibleContent = true; 1198 m_hasVisibleContent = true;
1175 break; 1199 break;
1176 } 1200 }
1177 if (r->firstChild() && !r->hasLayer()) 1201 if (r->firstChild() && !r->hasLayer())
1178 r = r->firstChild(); 1202 r = r->firstChild();
1179 else if (r->nextSibling()) 1203 else if (r->nextSibling())
1180 r = r->nextSibling(); 1204 r = r->nextSibling();
1181 else { 1205 else {
1182 do { 1206 do {
1183 r = r->parent(); 1207 r = r->parent();
1184 if (r == renderer()) 1208 if (r == renderer())
1185 r = 0; 1209 r = 0;
1186 } while (r && !r->nextSibling()); 1210 } while (r && !r->nextSibling());
1187 if (r) 1211 if (r)
1188 r = r->nextSibling(); 1212 r = r->nextSibling();
1189 } 1213 }
1190 } 1214 }
1191 } 1215 }
1192 m_visibleContentStatusDirty = false; 1216 m_visibleContentStatusDirty = false;
1193 if (hadVisibleContent != m_hasVisibleContent)
1194 updateNeedsCompositedScrolling();
1195 } 1217 }
1196 } 1218 }
1197 1219
1198 void RenderLayer::dirty3DTransformedDescendantStatus() 1220 void RenderLayer::dirty3DTransformedDescendantStatus()
1199 { 1221 {
1200 RenderLayer* curr = ancestorStackingContainer(); 1222 RenderLayer* curr = ancestorStackingContainer();
1201 if (curr) 1223 if (curr)
1202 curr->m_3DTransformedDescendantStatusDirty = true; 1224 curr->m_3DTransformedDescendantStatusDirty = true;
1203 1225
1204 // This propagates up through preserve-3d hierarchies to the enclosing flatt ening layer. 1226 // This propagates up through preserve-3d hierarchies to the enclosing flatt ening layer.
(...skipping 545 matching lines...) Expand 10 before | Expand all | Expand 10 after
1750 child->setParent(this); 1772 child->setParent(this);
1751 1773
1752 if (child->isNormalFlowOnly()) 1774 if (child->isNormalFlowOnly())
1753 dirtyNormalFlowList(); 1775 dirtyNormalFlowList();
1754 1776
1755 if (!child->isNormalFlowOnly() || child->firstChild()) { 1777 if (!child->isNormalFlowOnly() || child->firstChild()) {
1756 // Dirty the z-order list in which we are contained. The ancestorStackin gContainer() can be null in the 1778 // Dirty the z-order list in which we are contained. The ancestorStackin gContainer() can be null in the
1757 // case where we're building up generated content layers. This is ok, si nce the lists will start 1779 // case where we're building up generated content layers. This is ok, si nce the lists will start
1758 // off dirty in that case anyway. 1780 // off dirty in that case anyway.
1759 child->dirtyStackingContainerZOrderLists(); 1781 child->dirtyStackingContainerZOrderLists();
1760
1761 // Adding an out of flow positioned descendant can only affect
1762 // the opt-in decision for layers beneath and including our
1763 // containing block.
1764 RenderObject* containingBlock = child->renderer()->containingBlock();
1765 for (RenderLayer* layer = child; layer; layer = layer->parent()) {
1766 layer->updateNeedsCompositedScrolling();
1767 if (layer->renderer() == containingBlock)
1768 break;
1769 }
1770 } 1782 }
1771 1783
1772 child->updateDescendantDependentFlags(); 1784 child->updateDescendantDependentFlags();
1773 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant) 1785 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant)
1774 setAncestorChainHasVisibleDescendant(); 1786 setAncestorChainHasVisibleDescendant();
1775 1787
1776 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant()) 1788 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant())
1777 setAncestorChainHasSelfPaintingLayerDescendant(); 1789 setAncestorChainHasSelfPaintingLayerDescendant();
1778 1790
1779 if (child->renderer() && (child->renderer()->isOutOfFlowPositioned() || chil d->hasOutOfFlowPositionedDescendant())) 1791 if (subtreeContainsOutOfFlowPositionedLayer(child)) {
1780 setAncestorChainHasOutOfFlowPositionedDescendant(child->renderer()->cont ainingBlock()); 1792 // Now that the out of flow positioned descendant is in the tree, we
1793 // need to tell the compositor to reevaluate the compositing
1794 // requirements since we may be able to mark more layers as having
1795 // an 'unclipped' descendant.
1796 compositor()->setNeedsUpdateCompositingRequirementsState();
1797 setAncestorChainHasOutOfFlowPositionedDescendant();
1798 }
1781 1799
1782 compositor()->layerWasAdded(this, child); 1800 compositor()->layerWasAdded(this, child);
1783 } 1801 }
1784 1802
1785 RenderLayer* RenderLayer::removeChild(RenderLayer* oldChild) 1803 RenderLayer* RenderLayer::removeChild(RenderLayer* oldChild)
1786 { 1804 {
1787 if (!renderer()->documentBeingDestroyed()) 1805 if (!renderer()->documentBeingDestroyed())
1788 compositor()->layerWillBeRemoved(this, oldChild); 1806 compositor()->layerWillBeRemoved(this, oldChild);
1789 1807
1790 // remove the child 1808 // remove the child
1791 if (oldChild->previousSibling()) 1809 if (oldChild->previousSibling())
1792 oldChild->previousSibling()->setNextSibling(oldChild->nextSibling()); 1810 oldChild->previousSibling()->setNextSibling(oldChild->nextSibling());
1793 if (oldChild->nextSibling()) 1811 if (oldChild->nextSibling())
1794 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()) ; 1812 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()) ;
1795 1813
1796 if (m_first == oldChild) 1814 if (m_first == oldChild)
1797 m_first = oldChild->nextSibling(); 1815 m_first = oldChild->nextSibling();
1798 if (m_last == oldChild) 1816 if (m_last == oldChild)
1799 m_last = oldChild->previousSibling(); 1817 m_last = oldChild->previousSibling();
1800 1818
1801 if (oldChild->isNormalFlowOnly()) 1819 if (oldChild->isNormalFlowOnly())
1802 dirtyNormalFlowList(); 1820 dirtyNormalFlowList();
1803 if (!oldChild->isNormalFlowOnly() || oldChild->firstChild()) { 1821 if (!oldChild->isNormalFlowOnly() || oldChild->firstChild()) {
1804 // Dirty the z-order list in which we are contained. When called via th e 1822 // Dirty the z-order list in which we are contained. When called via th e
1805 // reattachment process in removeOnlyThisLayer, the layer may already be disconnected 1823 // reattachment process in removeOnlyThisLayer, the layer may already be disconnected
1806 // from the main layer tree, so we need to null-check the |stackingConta iner| value. 1824 // from the main layer tree, so we need to null-check the |stackingConta iner| value.
1807 oldChild->dirtyStackingContainerZOrderLists(); 1825 oldChild->dirtyStackingContainerZOrderLists();
1808
1809 // This could affect whether or not a layer has an out of flow
1810 // positioned descendant so we need to schedule some updates.
1811 // Removing an out of flow positioned descendant can only affect
1812 // the opt-in decision for layers beneath and including the old child's
1813 // containing block.
1814 RenderObject* containingBlock = oldChild->renderer()->containingBlock();
1815 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
1816 layer->updateNeedsCompositedScrolling();
1817 if (layer->renderer() == containingBlock)
1818 break;
1819 }
1820 } 1826 }
1821 1827
1822 if ((oldChild->renderer() && oldChild->renderer()->isOutOfFlowPositioned()) || oldChild->hasOutOfFlowPositionedDescendant())
1823 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
1824
1825 oldChild->setPreviousSibling(0); 1828 oldChild->setPreviousSibling(0);
1826 oldChild->setNextSibling(0); 1829 oldChild->setNextSibling(0);
1827 oldChild->setParent(0); 1830 oldChild->setParent(0);
1828 1831
1829 oldChild->updateDescendantDependentFlags(); 1832 oldChild->updateDescendantDependentFlags();
1833 if (subtreeContainsOutOfFlowPositionedLayer(oldChild)) {
1834 // It may now be the case that a layer no longer has an unclipped
1835 // descendant. Let the compositor know that it needs to reevaluate
1836 // its compositing requirements to check this.
1837 compositor()->setNeedsUpdateCompositingRequirementsState();
1838 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
1839 }
1840
1830 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant) 1841 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant)
1831 dirtyAncestorChainVisibleDescendantStatus(); 1842 dirtyAncestorChainVisibleDescendantStatus();
1832 1843
1833 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend ant()) 1844 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend ant())
1834 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); 1845 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
1835 1846
1836 return oldChild; 1847 return oldChild;
1837 } 1848 }
1838 1849
1839 void RenderLayer::removeOnlyThisLayer() 1850 void RenderLayer::removeOnlyThisLayer()
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
2049 case CompositedScrollingAlwaysOff: 2060 case CompositedScrollingAlwaysOff:
2050 return false; 2061 return false;
2051 } 2062 }
2052 2063
2053 ASSERT_NOT_REACHED(); 2064 ASSERT_NOT_REACHED();
2054 return m_needsCompositedScrolling; 2065 return m_needsCompositedScrolling;
2055 } 2066 }
2056 2067
2057 void RenderLayer::updateNeedsCompositedScrolling() 2068 void RenderLayer::updateNeedsCompositedScrolling()
2058 { 2069 {
2070 if (RenderLayer* ancestor = ancestorStackingContext())
2071 ancestor->updateDescendantsAreContiguousInStackingOrder();
2072
2059 bool needsCompositedScrolling = false; 2073 bool needsCompositedScrolling = false;
2060 2074
2061 FrameView* frameView = renderer()->view()->frameView(); 2075 FrameView* frameView = renderer()->view()->frameView();
2062 if (frameView && frameView->containsScrollableArea(this)) { 2076 if (frameView && frameView->containsScrollableArea(this)) {
2063 updateDescendantDependentFlags(); 2077 updateDescendantDependentFlags();
2064 2078
2065 bool forceUseCompositedScrolling = acceleratedCompositingForOverflowScro llEnabled() 2079 bool forceUseCompositedScrolling = acceleratedCompositingForOverflowScro llEnabled()
2066 && canBeStackingContainer() 2080 && canBeStackingContainer()
2067 && !hasOutOfFlowPositionedDescendant(); 2081 && !hasUnclippedDescendant();
2068 2082
2069 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING) 2083 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING)
2070 needsCompositedScrolling = forceUseCompositedScrolling || renderer()->st yle()->useTouchOverflowScrolling(); 2084 needsCompositedScrolling = forceUseCompositedScrolling || renderer()->st yle()->useTouchOverflowScrolling();
2071 #else 2085 #else
2072 needsCompositedScrolling = forceUseCompositedScrolling; 2086 needsCompositedScrolling = forceUseCompositedScrolling;
2073 #endif 2087 #endif
2074 // We gather a boolean value for use with Google UMA histograms to 2088 // We gather a boolean value for use with Google UMA histograms to
2075 // quantify the actual effects of a set of patches attempting to 2089 // quantify the actual effects of a set of patches attempting to
2076 // relax composited scrolling requirements, thereby increasing the 2090 // relax composited scrolling requirements, thereby increasing the
2077 // number of composited overflow divs. 2091 // number of composited overflow divs.
2078 if (acceleratedCompositingForOverflowScrollEnabled()) 2092 if (acceleratedCompositingForOverflowScrollEnabled())
2079 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScro lling", needsCompositedScrolling, 2); 2093 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScro lling", needsCompositedScrolling, 2);
2080 } 2094 }
2081 2095
2096 setNeedsCompositedScrolling(needsCompositedScrolling);
2097 }
2098
2099 void RenderLayer::setNeedsCompositedScrolling(bool needsCompositedScrolling)
2100 {
2082 if (m_needsCompositedScrolling == needsCompositedScrolling) 2101 if (m_needsCompositedScrolling == needsCompositedScrolling)
2083 return; 2102 return;
2084 2103
2085 m_needsCompositedScrolling = needsCompositedScrolling; 2104 m_needsCompositedScrolling = needsCompositedScrolling;
2086 2105
2087 // Note, the z-order lists may need to be rebuilt, but our code guarantees 2106 // Note, the z-order lists may need to be rebuilt, but our code guarantees
2088 // that we have not affected stacking, so we will not dirty 2107 // that we have not affected stacking, so we will not dirty
2089 // m_canBePromotedToStackingContainer for either us or our stacking context 2108 // m_canBePromotedToStackingContainer for either us or our stacking context
2090 // or container. 2109 // or container.
2091 didUpdateNeedsCompositedScrolling(); 2110 didUpdateNeedsCompositedScrolling();
(...skipping 3511 matching lines...) Expand 10 before | Expand all | Expand 10 after
5603 5622
5604 if (m_posZOrderList) 5623 if (m_posZOrderList)
5605 m_posZOrderList->clear(); 5624 m_posZOrderList->clear();
5606 if (m_negZOrderList) 5625 if (m_negZOrderList)
5607 m_negZOrderList->clear(); 5626 m_negZOrderList->clear();
5608 m_zOrderListsDirty = true; 5627 m_zOrderListsDirty = true;
5609 5628
5610 m_descendantsAreContiguousInStackingOrderDirty = true; 5629 m_descendantsAreContiguousInStackingOrderDirty = true;
5611 5630
5612 if (!renderer()->documentBeingDestroyed()) { 5631 if (!renderer()->documentBeingDestroyed()) {
5632 compositor()->setNeedsUpdateCompositingRequirementsState();
5613 compositor()->setCompositingLayersNeedRebuild(); 5633 compositor()->setCompositingLayersNeedRebuild();
5614 if (acceleratedCompositingForOverflowScrollEnabled()) 5634 if (acceleratedCompositingForOverflowScrollEnabled())
5615 compositor()->setShouldReevaluateCompositingAfterLayout(); 5635 compositor()->setShouldReevaluateCompositingAfterLayout();
5616 } 5636 }
5617 } 5637 }
5618 5638
5619 void RenderLayer::dirtyStackingContainerZOrderLists() 5639 void RenderLayer::dirtyStackingContainerZOrderLists()
5620 { 5640 {
5621 RenderLayer* stackingContainer = this->ancestorStackingContainer(); 5641 RenderLayer* stackingContainer = this->ancestorStackingContainer();
5622 if (stackingContainer) 5642 if (stackingContainer)
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
5741 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 5761 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
5742 // Ignore reflections. 5762 // Ignore reflections.
5743 if (!m_reflection || reflectionLayer() != child) 5763 if (!m_reflection || reflectionLayer() != child)
5744 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContainer); 5764 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContainer);
5745 } 5765 }
5746 } 5766 }
5747 } 5767 }
5748 5768
5749 void RenderLayer::updateLayerListsIfNeeded() 5769 void RenderLayer::updateLayerListsIfNeeded()
5750 { 5770 {
5751 bool shouldUpdateDescendantsAreContiguousInStackingOrder = acceleratedCompos itingForOverflowScrollEnabled() && isStackingContext() && (m_zOrderListsDirty || m_normalFlowListDirty) && m_descendantsAreContiguousInStackingOrderDirty;
5752 updateZOrderLists(); 5771 updateZOrderLists();
5753 updateNormalFlowList(); 5772 updateNormalFlowList();
5754 5773
5755 if (RenderLayer* reflectionLayer = this->reflectionLayer()) { 5774 if (RenderLayer* reflectionLayer = this->reflectionLayer()) {
5756 reflectionLayer->updateZOrderLists(); 5775 reflectionLayer->updateZOrderLists();
5757 reflectionLayer->updateNormalFlowList(); 5776 reflectionLayer->updateNormalFlowList();
5758 } 5777 }
5759
5760 if (shouldUpdateDescendantsAreContiguousInStackingOrder) {
5761 updateDescendantsAreContiguousInStackingOrder();
5762 // The above function can cause us to update m_needsCompositedScrolling
5763 // and dirty our layer lists. Refresh them if necessary.
5764 updateZOrderLists();
5765 updateNormalFlowList();
5766 }
5767 } 5778 }
5768 5779
5769 void RenderLayer::repaintIncludingDescendants() 5780 void RenderLayer::repaintIncludingDescendants()
5770 { 5781 {
5771 renderer()->repaint(); 5782 renderer()->repaint();
5772 for (RenderLayer* curr = firstChild(); curr; curr = curr->nextSibling()) 5783 for (RenderLayer* curr = firstChild(); curr; curr = curr->nextSibling())
5773 curr->repaintIncludingDescendants(); 5784 curr->repaintIncludingDescendants();
5774 } 5785 }
5775 5786
5776 void RenderLayer::setBackingNeedsRepaint() 5787 void RenderLayer::setBackingNeedsRepaint()
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
5920 return true; 5931 return true;
5921 5932
5922 if (hasVisibleBoxDecorations()) 5933 if (hasVisibleBoxDecorations())
5923 return true; 5934 return true;
5924 5935
5925 return false; 5936 return false;
5926 } 5937 }
5927 5938
5928 void RenderLayer::updateVisibilityAfterStyleChange(const RenderStyle* oldStyle) 5939 void RenderLayer::updateVisibilityAfterStyleChange(const RenderStyle* oldStyle)
5929 { 5940 {
5930 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE; 5941 if (!oldStyle || (oldStyle->visibility() != renderer()->style()->visibility( )))
5931 if (oldVisibility == renderer()->style()->visibility() || !renderer()->isOut OfFlowPositioned()) 5942 compositor()->setNeedsUpdateCompositingRequirementsState();
5932 return;
5933
5934 if (renderer()->style()->visibility() == VISIBLE)
5935 setAncestorChainHasOutOfFlowPositionedDescendant(renderer()->containingB lock());
5936 else
5937 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
5938 } 5943 }
5939 5944
5940 void RenderLayer::updateStackingContextsAfterStyleChange(const RenderStyle* oldS tyle) 5945 void RenderLayer::updateStackingContextsAfterStyleChange(const RenderStyle* oldS tyle)
5941 { 5946 {
5942 bool wasStackingContext = oldStyle ? isStackingContext(oldStyle) : false; 5947 bool wasStackingContext = oldStyle ? isStackingContext(oldStyle) : false;
5943 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE; 5948 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE;
5944 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0; 5949 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0;
5945 5950
5946 // FIXME: RenderLayer already handles visibility changes through our visibli ty dirty bits. This logic could 5951 // FIXME: RenderLayer already handles visibility changes through our visibli ty dirty bits. This logic could
5947 // likely be folded along with the rest. 5952 // likely be folded along with the rest.
5948 bool isStackingContext = this->isStackingContext(); 5953 bool isStackingContext = this->isStackingContext();
5949 if (isStackingContext == wasStackingContext && oldVisibility == renderer()-> style()->visibility() && oldZIndex == renderer()->style()->zIndex()) 5954 if (isStackingContext == wasStackingContext && oldVisibility == renderer()-> style()->visibility() && oldZIndex == renderer()->style()->zIndex())
5950 return; 5955 return;
5951 5956
5952 dirtyStackingContainerZOrderLists(); 5957 dirtyStackingContainerZOrderLists();
5953 5958
5954 if (isStackingContainer()) 5959 if (isStackingContainer())
5955 dirtyZOrderLists(); 5960 dirtyZOrderLists();
5956 else 5961 else
5957 clearZOrderLists(); 5962 clearZOrderLists();
5958 5963
5959 updateNeedsCompositedScrolling(); 5964 compositor()->setNeedsUpdateCompositingRequirementsState();
5960 } 5965 }
5961 5966
5962 static bool overflowRequiresScrollbar(EOverflow overflow) 5967 static bool overflowRequiresScrollbar(EOverflow overflow)
5963 { 5968 {
5964 return overflow == OSCROLL; 5969 return overflow == OSCROLL;
5965 } 5970 }
5966 5971
5967 static bool overflowDefinesAutomaticScrollbar(EOverflow overflow) 5972 static bool overflowDefinesAutomaticScrollbar(EOverflow overflow)
5968 { 5973 {
5969 return overflow == OAUTO || overflow == OOVERLAY; 5974 return overflow == OAUTO || overflow == OOVERLAY;
(...skipping 28 matching lines...) Expand all
5998 6003
5999 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL & & overflowY != OSCROLL) { 6004 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL & & overflowY != OSCROLL) {
6000 ASSERT(hasVerticalScrollbar()); 6005 ASSERT(hasVerticalScrollbar());
6001 m_vBar->setEnabled(true); 6006 m_vBar->setEnabled(true);
6002 } 6007 }
6003 6008
6004 if (!m_scrollDimensionsDirty) 6009 if (!m_scrollDimensionsDirty)
6005 updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollab leVerticalOverflow()); 6010 updateScrollableAreaSet(hasScrollableHorizontalOverflow() || hasScrollab leVerticalOverflow());
6006 } 6011 }
6007 6012
6008 void RenderLayer::setAncestorChainHasOutOfFlowPositionedDescendant(RenderObject* containingBlock)
6009 {
6010 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
6011 if (!layer->m_hasOutOfFlowPositionedDescendantDirty && layer->hasOutOfFl owPositionedDescendant())
6012 break;
6013
6014 layer->m_hasOutOfFlowPositionedDescendantDirty = false;
6015 layer->m_hasOutOfFlowPositionedDescendant = true;
6016 layer->updateNeedsCompositedScrolling();
6017
6018 if (layer->renderer() && layer->renderer() == containingBlock)
6019 break;
6020 }
6021 }
6022
6023 void RenderLayer::dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus()
6024 {
6025 if (m_hasOutOfFlowPositionedDescendant) {
6026 m_hasOutOfFlowPositionedDescendantDirty = true;
6027 // FIXME It would be nice to avoid this when we clean up render layer
6028 // updating. We shouldn't have to update the composited scrolling state
6029 // nearly as frequently if all the updates happen in a single, well
6030 // defined phase.
6031 updateNeedsCompositedScrolling();
6032 }
6033
6034 if (parent())
6035 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
6036 }
6037
6038 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle) 6013 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle)
6039 { 6014 {
6015 if (oldStyle && (renderer()->style()->position() == oldStyle->position()))
6016 return;
6017
6040 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP osition || oldStyle->position() == FixedPosition); 6018 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP osition || oldStyle->position() == FixedPosition);
6041 bool isOutOfFlowPositioned = renderer()->isOutOfFlowPositioned(); 6019 bool isOutOfFlowPositioned = renderer()->isOutOfFlowPositioned();
6042 if (parent() && isOutOfFlowPositioned != wasOutOfFlowPositioned) { 6020 if (!wasOutOfFlowPositioned && !isOutOfFlowPositioned)
6043 if (isOutOfFlowPositioned) 6021 return;
6044 parent()->setAncestorChainHasOutOfFlowPositionedDescendant(renderer( )->containingBlock()); 6022
6045 else 6023 // Even if the layer remains out-of-flow, a change to this property
6046 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus() ; 6024 // will likely change its containing block. We must clear these bits
6025 // so that they can be set properly by the RenderLayerCompositor.
6026 for (RenderLayer* ancestor = parent(); ancestor; ancestor = ancestor->parent ())
6027 ancestor->setHasUnclippedDescendant(false);
6028
6029 // Ensures that we reset the above bits correctly.
6030 compositor()->setNeedsUpdateCompositingRequirementsState();
6031
6032 if (wasOutOfFlowPositioned && isOutOfFlowPositioned)
6033 return;
6034
6035 if (isOutOfFlowPositioned) {
6036 setAncestorChainHasOutOfFlowPositionedDescendant();
6037 compositor()->addOutOfFlowPositionedLayer(this);
6038 } else {
6039 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
6040 compositor()->removeOutOfFlowPositionedLayer(this);
6047 } 6041 }
6048 } 6042 }
6049 6043
6050 static bool hasOrHadFilters(const RenderStyle* oldStyle, const RenderStyle* newS tyle) 6044 static bool hasOrHadFilters(const RenderStyle* oldStyle, const RenderStyle* newS tyle)
6051 { 6045 {
6052 ASSERT(newStyle); 6046 ASSERT(newStyle);
6053 return (oldStyle && oldStyle->hasFilter()) || newStyle->hasFilter(); 6047 return (oldStyle && oldStyle->hasFilter()) || newStyle->hasFilter();
6054 } 6048 }
6055 6049
6056 inline bool RenderLayer::needsCompositingLayersRebuiltForClip(const RenderStyle* oldStyle, const RenderStyle* newStyle) const 6050 inline bool RenderLayer::needsCompositingLayersRebuiltForClip(const RenderStyle* oldStyle, const RenderStyle* newStyle) const
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
6203 6197
6204 FrameView* frameView = frame->view(); 6198 FrameView* frameView = frame->view();
6205 if (!frameView) 6199 if (!frameView)
6206 return; 6200 return;
6207 6201
6208 bool isVisibleToHitTest = renderer()->visibleToHitTesting(); 6202 bool isVisibleToHitTest = renderer()->visibleToHitTesting();
6209 if (HTMLFrameOwnerElement* owner = frame->ownerElement()) 6203 if (HTMLFrameOwnerElement* owner = frame->ownerElement())
6210 isVisibleToHitTest &= owner->renderer() && owner->renderer()->visibleToH itTesting(); 6204 isVisibleToHitTest &= owner->renderer() && owner->renderer()->visibleToH itTesting();
6211 6205
6212 bool updatedScrollableAreaSet = false; 6206 bool updatedScrollableAreaSet = false;
6213 if (hasOverflow && isVisibleToHitTest) 6207 if (hasOverflow && isVisibleToHitTest) {
6214 updatedScrollableAreaSet = frameView->addScrollableArea(this); 6208 if (frameView->addScrollableArea(this))
6215 else 6209 compositor()->setNeedsUpdateCompositingRequirementsState();
6216 updatedScrollableAreaSet = frameView->removeScrollableArea(this); 6210 } else {
6217 6211 if (frameView->removeScrollableArea(this))
6218 if (updatedScrollableAreaSet) 6212 setNeedsCompositedScrolling(false);
6219 updateNeedsCompositedScrolling(); 6213 }
6220 } 6214 }
6221 6215
6222 void RenderLayer::updateScrollCornerStyle() 6216 void RenderLayer::updateScrollCornerStyle()
6223 { 6217 {
6224 RenderObject* actualRenderer = rendererForScrollbar(renderer()); 6218 RenderObject* actualRenderer = rendererForScrollbar(renderer());
6225 RefPtr<RenderStyle> corner = renderer()->hasOverflowClip() ? actualRenderer- >getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), actualRenderer->st yle()) : PassRefPtr<RenderStyle>(0); 6219 RefPtr<RenderStyle> corner = renderer()->hasOverflowClip() ? actualRenderer- >getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), actualRenderer->st yle()) : PassRefPtr<RenderStyle>(0);
6226 if (corner) { 6220 if (corner) {
6227 if (!m_scrollCorner) { 6221 if (!m_scrollCorner) {
6228 m_scrollCorner = RenderScrollbarPart::createAnonymous(renderer()->do cument()); 6222 m_scrollCorner = RenderScrollbarPart::createAnonymous(renderer()->do cument());
6229 m_scrollCorner->setParent(renderer()); 6223 m_scrollCorner->setParent(renderer());
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
6458 } 6452 }
6459 } 6453 }
6460 6454
6461 void showLayerTree(const WebCore::RenderObject* renderer) 6455 void showLayerTree(const WebCore::RenderObject* renderer)
6462 { 6456 {
6463 if (!renderer) 6457 if (!renderer)
6464 return; 6458 return;
6465 showLayerTree(renderer->enclosingLayer()); 6459 showLayerTree(renderer->enclosingLayer());
6466 } 6460 }
6467 #endif 6461 #endif
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | Source/core/rendering/RenderLayerCompositor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698