| OLD | NEW |
| 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 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 } | 83 } |
| 84 | 84 |
| 85 // Helper for the sorting of layers by z-index. | 85 // Helper for the sorting of layers by z-index. |
| 86 static inline bool compareZIndex(RenderLayerStackingNode* first, RenderLayerStac
kingNode* second) | 86 static inline bool compareZIndex(RenderLayerStackingNode* first, RenderLayerStac
kingNode* second) |
| 87 { | 87 { |
| 88 return first->zIndex() < second->zIndex(); | 88 return first->zIndex() < second->zIndex(); |
| 89 } | 89 } |
| 90 | 90 |
| 91 RenderLayerCompositor* RenderLayerStackingNode::compositor() const | 91 RenderLayerCompositor* RenderLayerStackingNode::compositor() const |
| 92 { | 92 { |
| 93 if (!renderer()->view()) | 93 ASSERT(renderer()->view()); |
| 94 return 0; | |
| 95 return renderer()->view()->compositor(); | 94 return renderer()->view()->compositor(); |
| 96 } | 95 } |
| 97 | 96 |
| 98 void RenderLayerStackingNode::dirtyZOrderLists() | 97 void RenderLayerStackingNode::dirtyZOrderLists() |
| 99 { | 98 { |
| 100 ASSERT(m_layerListMutationAllowed); | 99 ASSERT(m_layerListMutationAllowed); |
| 101 ASSERT(isStackingContext()); | 100 ASSERT(isStackingContext()); |
| 102 | 101 |
| 103 #if !ASSERT_DISABLED | 102 #if !ASSERT_DISABLED |
| 104 updateStackingParentForZOrderLists(0); | 103 updateStackingParentForZOrderLists(0); |
| 105 #endif | 104 #endif |
| 106 | 105 |
| 107 if (m_posZOrderList) | 106 if (m_posZOrderList) |
| 108 m_posZOrderList->clear(); | 107 m_posZOrderList->clear(); |
| 109 if (m_negZOrderList) | 108 if (m_negZOrderList) |
| 110 m_negZOrderList->clear(); | 109 m_negZOrderList->clear(); |
| 111 m_zOrderListsDirty = true; | 110 m_zOrderListsDirty = true; |
| 112 | 111 |
| 113 if (!renderer()->documentBeingDestroyed()) | 112 if (!renderer()->documentBeingDestroyed()) |
| 114 compositor()->setCompositingLayersNeedRebuild(); | 113 compositor()->setCompositingLayersNeedRebuild(); |
| 115 } | 114 } |
| 116 | 115 |
| 117 void RenderLayerStackingNode::dirtyStackingContextZOrderLists() | 116 void RenderLayerStackingNode::dirtyStackingContextZOrderLists() |
| 118 { | 117 { |
| 119 RenderLayerStackingNode* stackingContextNode = ancestorStackingContextNode()
; | 118 if (RenderLayerStackingNode* stackingNode = ancestorStackingContextNode()) |
| 120 if (stackingContextNode) | |
| 121 stackingContextNode->dirtyZOrderLists(); | |
| 122 | |
| 123 RenderLayerStackingNode* stackingNode = ancestorStackingNode(); | |
| 124 if (stackingNode && stackingNode != stackingContextNode) | |
| 125 stackingNode->dirtyZOrderLists(); | 119 stackingNode->dirtyZOrderLists(); |
| 126 } | 120 } |
| 127 | 121 |
| 128 void RenderLayerStackingNode::dirtyNormalFlowList() | 122 void RenderLayerStackingNode::dirtyNormalFlowList() |
| 129 { | 123 { |
| 130 ASSERT(m_layerListMutationAllowed); | 124 ASSERT(m_layerListMutationAllowed); |
| 131 | 125 |
| 132 #if !ASSERT_DISABLED | 126 #if !ASSERT_DISABLED |
| 133 updateStackingParentForNormalFlowList(0); | 127 updateStackingParentForNormalFlowList(0); |
| 134 #endif | 128 #endif |
| 135 | 129 |
| 136 if (m_normalFlowList) | 130 if (m_normalFlowList) |
| 137 m_normalFlowList->clear(); | 131 m_normalFlowList->clear(); |
| 138 m_normalFlowListDirty = true; | 132 m_normalFlowListDirty = true; |
| 139 | 133 |
| 140 if (!renderer()->documentBeingDestroyed()) { | 134 if (!renderer()->documentBeingDestroyed()) |
| 141 compositor()->setCompositingLayersNeedRebuild(); | 135 compositor()->setCompositingLayersNeedRebuild(); |
| 142 } | |
| 143 } | 136 } |
| 144 | 137 |
| 145 void RenderLayerStackingNode::rebuildZOrderLists() | 138 void RenderLayerStackingNode::rebuildZOrderLists() |
| 146 { | 139 { |
| 147 ASSERT(m_layerListMutationAllowed); | 140 ASSERT(m_layerListMutationAllowed); |
| 148 ASSERT(isDirtyStackingContext()); | 141 ASSERT(isDirtyStackingContext()); |
| 149 | 142 |
| 150 for (RenderLayer* child = layer()->firstChild(); child; child = child->nextS
ibling()) { | 143 for (RenderLayer* child = layer()->firstChild(); child; child = child->nextS
ibling()) { |
| 151 if (!layer()->reflectionInfo() || layer()->reflectionInfo()->reflectionL
ayer() != child) | 144 if (!layer()->reflectionInfo() || layer()->reflectionInfo()->reflectionL
ayer() != child) |
| 152 child->stackingNode()->collectLayers(m_posZOrderList, m_negZOrderLis
t); | 145 child->stackingNode()->collectLayers(m_posZOrderList, m_negZOrderLis
t); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 reflectionLayer->stackingNode()->updateZOrderLists(); | 285 reflectionLayer->stackingNode()->updateZOrderLists(); |
| 293 reflectionLayer->stackingNode()->updateNormalFlowList(); | 286 reflectionLayer->stackingNode()->updateNormalFlowList(); |
| 294 } | 287 } |
| 295 | 288 |
| 296 void RenderLayerStackingNode::updateStackingNodesAfterStyleChange(const RenderSt
yle* oldStyle) | 289 void RenderLayerStackingNode::updateStackingNodesAfterStyleChange(const RenderSt
yle* oldStyle) |
| 297 { | 290 { |
| 298 bool wasStackingContext = oldStyle ? !oldStyle->hasAutoZIndex() : false; | 291 bool wasStackingContext = oldStyle ? !oldStyle->hasAutoZIndex() : false; |
| 299 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE; | 292 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE; |
| 300 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0; | 293 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0; |
| 301 | 294 |
| 302 // FIXME: RenderLayer already handles visibility changes through our visibli
ty dirty bits. This logic could | 295 // FIXME: RenderLayer already handles visibility changes through our visibil
ity dirty bits. This logic could |
| 303 // likely be folded along with the rest. | 296 // likely be folded along with the rest. |
| 304 bool isStackingContext = this->isStackingContext(); | 297 bool isStackingContext = this->isStackingContext(); |
| 305 if (isStackingContext == wasStackingContext && oldVisibility == renderer()->
style()->visibility() && oldZIndex == zIndex()) | 298 if (isStackingContext == wasStackingContext && oldVisibility == renderer()->
style()->visibility() && oldZIndex == zIndex()) |
| 306 return; | 299 return; |
| 307 | 300 |
| 308 dirtyStackingContextZOrderLists(); | 301 dirtyStackingContextZOrderLists(); |
| 309 | 302 |
| 310 if (isStackingContext) | 303 if (isStackingContext) |
| 311 dirtyZOrderLists(); | 304 dirtyZOrderLists(); |
| 312 else | 305 else |
| 313 clearZOrderLists(); | 306 clearZOrderLists(); |
| 314 } | 307 } |
| 315 | 308 |
| 316 bool RenderLayerStackingNode::shouldBeNormalFlowOnly() const | 309 bool RenderLayerStackingNode::shouldBeNormalFlowOnly() const |
| 317 { | 310 { |
| 318 const bool couldBeNormalFlow = renderer()->hasOverflowClip() | 311 RenderLayerModelObject* renderer = this->renderer(); |
| 319 || renderer()->hasReflection() | 312 |
| 320 || renderer()->hasMask() | 313 const bool couldBeNormalFlow = renderer->hasOverflowClip() |
| 321 || renderer()->isCanvas() | 314 || renderer->hasReflection() |
| 322 || renderer()->isVideo() | 315 || renderer->hasMask() |
| 323 || renderer()->isEmbeddedObject() | 316 || renderer->isCanvas() |
| 324 || renderer()->isRenderIFrame() | 317 || renderer->isVideo() |
| 325 || (renderer()->style()->specifiesColumns() && !layer()->isRootLayer()); | 318 || renderer->isEmbeddedObject() |
| 326 const bool preventsElementFromBeingNormalFlow = renderer()->isPositioned() | 319 || renderer->isRenderIFrame() |
| 327 || renderer()->hasTransform() | 320 || (renderer->style()->specifiesColumns() && !layer()->isRootLayer()); |
| 328 || renderer()->hasClipPath() | 321 |
| 329 || renderer()->hasFilter() | 322 const bool preventsElementFromBeingNormalFlow = renderer->isPositioned() |
| 330 || renderer()->hasBlendMode() | 323 || renderer->hasTransform() |
| 324 || renderer->hasClipPath() |
| 325 || renderer->hasFilter() |
| 326 || renderer->hasBlendMode() |
| 331 || layer()->isTransparent(); | 327 || layer()->isTransparent(); |
| 332 | 328 |
| 333 return couldBeNormalFlow && !preventsElementFromBeingNormalFlow; | 329 return couldBeNormalFlow && !preventsElementFromBeingNormalFlow; |
| 334 } | 330 } |
| 335 | 331 |
| 336 void RenderLayerStackingNode::updateIsNormalFlowOnly() | 332 void RenderLayerStackingNode::updateIsNormalFlowOnly() |
| 337 { | 333 { |
| 338 bool isNormalFlowOnly = shouldBeNormalFlowOnly(); | 334 bool isNormalFlowOnly = shouldBeNormalFlowOnly(); |
| 339 if (isNormalFlowOnly == this->isNormalFlowOnly()) | 335 if (isNormalFlowOnly == this->isNormalFlowOnly()) |
| 340 return; | 336 return; |
| 341 | 337 |
| 342 m_isNormalFlowOnly = isNormalFlowOnly; | 338 m_isNormalFlowOnly = isNormalFlowOnly; |
| 343 if (RenderLayer* p = layer()->parent()) | 339 if (RenderLayer* p = layer()->parent()) |
| 344 p->stackingNode()->dirtyNormalFlowList(); | 340 p->stackingNode()->dirtyNormalFlowList(); |
| 345 dirtyStackingContextZOrderLists(); | 341 dirtyStackingContextZOrderLists(); |
| 346 } | 342 } |
| 347 | 343 |
| 348 RenderLayerStackingNode* RenderLayerStackingNode::ancestorStackingContextNode()
const | 344 RenderLayerStackingNode* RenderLayerStackingNode::ancestorStackingContextNode()
const |
| 349 { | 345 { |
| 350 RenderLayer* ancestor = layer()->parent(); | 346 for (RenderLayer* ancestor = layer()->parent(); ancestor; ancestor = ancesto
r->parent()) { |
| 351 while (ancestor && !ancestor->stackingNode()->isStackingContext()) | 347 RenderLayerStackingNode* stackingNode = ancestor->stackingNode(); |
| 352 ancestor = ancestor->parent(); | 348 if (stackingNode->isStackingContext()) |
| 353 if (ancestor) | 349 return stackingNode; |
| 354 return ancestor->stackingNode(); | 350 } |
| 355 return 0; | 351 return 0; |
| 356 } | 352 } |
| 357 | 353 |
| 358 RenderLayerStackingNode* RenderLayerStackingNode::ancestorStackingNode() const | |
| 359 { | |
| 360 RenderLayer* ancestor = layer()->parent(); | |
| 361 while (ancestor && !ancestor->stackingNode()->isStackingContext()) | |
| 362 ancestor = ancestor->parent(); | |
| 363 if (ancestor) | |
| 364 return ancestor->stackingNode(); | |
| 365 return 0; | |
| 366 } | |
| 367 | |
| 368 RenderLayerModelObject* RenderLayerStackingNode::renderer() const | 354 RenderLayerModelObject* RenderLayerStackingNode::renderer() const |
| 369 { | 355 { |
| 370 return m_layer->renderer(); | 356 return m_layer->renderer(); |
| 371 } | 357 } |
| 372 | 358 |
| 373 } // namespace WebCore | 359 } // namespace WebCore |
| OLD | NEW |