| 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 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 | 268 |
| 269 // FIXME: We should be able to remove this call because we don't care about | 269 // FIXME: We should be able to remove this call because we don't care about |
| 270 // any descendant-dependent flags, but code somewhere else is reading these | 270 // any descendant-dependent flags, but code somewhere else is reading these |
| 271 // flags and depending on us to update them. | 271 // flags and depending on us to update them. |
| 272 updateDescendantDependentFlags(); | 272 updateDescendantDependentFlags(); |
| 273 | 273 |
| 274 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) | 274 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) |
| 275 child->updateLayerPositionRecursive(); | 275 child->updateLayerPositionRecursive(); |
| 276 } | 276 } |
| 277 | 277 |
| 278 void RenderLayer::setAncestorChainHasSelfPaintingLayerDescendant() | 278 void RenderLayer::updateHasSelfPaintingLayerDescendant() const |
| 279 { | 279 { |
| 280 for (RenderLayer* layer = this; layer; layer = layer->parent()) { | 280 ASSERT(m_hasSelfPaintingLayerDescendantDirty); |
| 281 if (!layer->m_hasSelfPaintingLayerDescendantDirty && layer->hasSelfPaint
ingLayerDescendant()) | 281 |
| 282 m_hasSelfPaintingLayerDescendant = false; |
| 283 |
| 284 for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
{ |
| 285 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendan
t()) { |
| 286 m_hasSelfPaintingLayerDescendant = true; |
| 282 break; | 287 break; |
| 288 } |
| 289 } |
| 283 | 290 |
| 284 layer->m_hasSelfPaintingLayerDescendantDirty = false; | 291 m_hasSelfPaintingLayerDescendantDirty = false; |
| 285 layer->m_hasSelfPaintingLayerDescendant = true; | |
| 286 } | |
| 287 } | 292 } |
| 288 | 293 |
| 289 void RenderLayer::dirtyAncestorChainHasSelfPaintingLayerDescendantStatus() | 294 void RenderLayer::dirtyAncestorChainHasSelfPaintingLayerDescendantStatus() |
| 290 { | 295 { |
| 291 for (RenderLayer* layer = this; layer; layer = layer->parent()) { | 296 for (RenderLayer* layer = this; layer; layer = layer->parent()) { |
| 292 layer->m_hasSelfPaintingLayerDescendantDirty = true; | 297 layer->m_hasSelfPaintingLayerDescendantDirty = true; |
| 293 // If we have reached a self-painting layer, we know our parent should h
ave a self-painting descendant | 298 // If we have reached a self-painting layer, we know our parent should h
ave a self-painting descendant |
| 294 // in this case, there is no need to dirty our ancestors further. | 299 // in this case, there is no need to dirty our ancestors further. |
| 295 if (layer->isSelfPaintingLayer()) { | 300 if (layer->isSelfPaintingLayer()) { |
| 296 ASSERT(!parent() || parent()->m_hasSelfPaintingLayerDescendantDirty
|| parent()->hasSelfPaintingLayerDescendant()); | 301 ASSERT(!parent() || parent()->m_hasSelfPaintingLayerDescendantDirty
|| parent()->m_hasSelfPaintingLayerDescendant); |
| 297 break; | 302 break; |
| 298 } | 303 } |
| 299 } | 304 } |
| 300 } | 305 } |
| 301 | 306 |
| 302 bool RenderLayer::scrollsWithViewport() const | 307 bool RenderLayer::scrollsWithViewport() const |
| 303 { | 308 { |
| 304 return renderer()->style()->position() == FixedPosition && renderer()->conta
iningBlock()->enclosingLayer()->isRootLayer(); | 309 return renderer()->style()->position() == FixedPosition && renderer()->conta
iningBlock()->enclosingLayer()->isRootLayer(); |
| 305 } | 310 } |
| 306 | 311 |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 void RenderLayer::updateDescendantDependentFlagsForEntireSubtree() | 648 void RenderLayer::updateDescendantDependentFlagsForEntireSubtree() |
| 644 { | 649 { |
| 645 updateDescendantDependentFlags(); | 650 updateDescendantDependentFlags(); |
| 646 | 651 |
| 647 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) | 652 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) |
| 648 child->updateDescendantDependentFlagsForEntireSubtree(); | 653 child->updateDescendantDependentFlagsForEntireSubtree(); |
| 649 } | 654 } |
| 650 | 655 |
| 651 void RenderLayer::updateDescendantDependentFlags() | 656 void RenderLayer::updateDescendantDependentFlags() |
| 652 { | 657 { |
| 653 if (m_visibleDescendantStatusDirty || m_hasSelfPaintingLayerDescendantDirty)
{ | 658 if (m_visibleDescendantStatusDirty) { |
| 654 m_hasVisibleDescendant = false; | 659 m_hasVisibleDescendant = false; |
| 655 m_hasSelfPaintingLayerDescendant = false; | |
| 656 | 660 |
| 657 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin
g()) { | 661 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin
g()) { |
| 658 child->updateDescendantDependentFlags(); | 662 child->updateDescendantDependentFlags(); |
| 659 | 663 |
| 660 bool hasVisibleDescendant = child->m_hasVisibleContent || child->m_h
asVisibleDescendant; | 664 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant) { |
| 661 bool hasSelfPaintingLayerDescendant = child->isSelfPaintingLayer() |
| child->hasSelfPaintingLayerDescendant(); | 665 m_hasVisibleDescendant = true; |
| 662 | |
| 663 m_hasVisibleDescendant |= hasVisibleDescendant; | |
| 664 m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant; | |
| 665 | |
| 666 if (m_hasVisibleDescendant && m_hasSelfPaintingLayerDescendant) | |
| 667 break; | 666 break; |
| 667 } |
| 668 } | 668 } |
| 669 | 669 |
| 670 m_visibleDescendantStatusDirty = false; | 670 m_visibleDescendantStatusDirty = false; |
| 671 m_hasSelfPaintingLayerDescendantDirty = false; | |
| 672 } | 671 } |
| 673 | 672 |
| 674 if (m_blendInfo.childLayerHasBlendModeStatusDirty()) { | 673 if (m_blendInfo.childLayerHasBlendModeStatusDirty()) { |
| 675 m_blendInfo.setChildLayerHasBlendMode(false); | 674 m_blendInfo.setChildLayerHasBlendMode(false); |
| 676 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin
g()) { | 675 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin
g()) { |
| 677 if (!child->stackingNode()->isStackingContext()) | 676 if (!child->stackingNode()->isStackingContext()) |
| 678 child->updateDescendantDependentFlags(); | 677 child->updateDescendantDependentFlags(); |
| 679 | 678 |
| 680 bool childLayerHadBlendMode = child->blendInfo().childLayerHasBlendM
odeWhileDirty(); | 679 bool childLayerHadBlendMode = child->blendInfo().childLayerHasBlendM
odeWhileDirty(); |
| 681 bool childLayerHasBlendMode = childLayerHadBlendMode || child->blend
Info().hasBlendMode(); | 680 bool childLayerHasBlendMode = childLayerHadBlendMode || child->blend
Info().hasBlendMode(); |
| (...skipping 574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1256 m_stackingNode->dirtyNormalFlowList(); | 1255 m_stackingNode->dirtyNormalFlowList(); |
| 1257 | 1256 |
| 1258 if (!child->stackingNode()->isNormalFlowOnly() || child->firstChild()) { | 1257 if (!child->stackingNode()->isNormalFlowOnly() || child->firstChild()) { |
| 1259 // Dirty the z-order list in which we are contained. The ancestorStackin
gContextNode() can be null in the | 1258 // Dirty the z-order list in which we are contained. The ancestorStackin
gContextNode() can be null in the |
| 1260 // case where we're building up generated content layers. This is ok, si
nce the lists will start | 1259 // case where we're building up generated content layers. This is ok, si
nce the lists will start |
| 1261 // off dirty in that case anyway. | 1260 // off dirty in that case anyway. |
| 1262 child->stackingNode()->dirtyStackingContextZOrderLists(); | 1261 child->stackingNode()->dirtyStackingContextZOrderLists(); |
| 1263 } | 1262 } |
| 1264 | 1263 |
| 1265 dirtyAncestorChainVisibleDescendantStatus(); | 1264 dirtyAncestorChainVisibleDescendantStatus(); |
| 1265 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); |
| 1266 | 1266 |
| 1267 child->updateDescendantDependentFlags(); | 1267 child->updateDescendantDependentFlags(); |
| 1268 | 1268 |
| 1269 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant()) | |
| 1270 setAncestorChainHasSelfPaintingLayerDescendant(); | |
| 1271 | |
| 1272 if (child->blendInfo().hasBlendMode() || child->blendInfo().childLayerHasBle
ndMode()) | 1269 if (child->blendInfo().hasBlendMode() || child->blendInfo().childLayerHasBle
ndMode()) |
| 1273 m_blendInfo.setAncestorChainBlendedDescendant(); | 1270 m_blendInfo.setAncestorChainBlendedDescendant(); |
| 1274 } | 1271 } |
| 1275 | 1272 |
| 1276 RenderLayer* RenderLayer::removeChild(RenderLayer* oldChild) | 1273 RenderLayer* RenderLayer::removeChild(RenderLayer* oldChild) |
| 1277 { | 1274 { |
| 1278 if (oldChild->previousSibling()) | 1275 if (oldChild->previousSibling()) |
| 1279 oldChild->previousSibling()->setNextSibling(oldChild->nextSibling()); | 1276 oldChild->previousSibling()->setNextSibling(oldChild->nextSibling()); |
| 1280 if (oldChild->nextSibling()) | 1277 if (oldChild->nextSibling()) |
| 1281 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling())
; | 1278 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling())
; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 1295 oldChild->stackingNode()->dirtyStackingContextZOrderLists(); | 1292 oldChild->stackingNode()->dirtyStackingContextZOrderLists(); |
| 1296 } | 1293 } |
| 1297 | 1294 |
| 1298 if (renderer()->style()->visibility() != VISIBLE) | 1295 if (renderer()->style()->visibility() != VISIBLE) |
| 1299 dirtyVisibleContentStatus(); | 1296 dirtyVisibleContentStatus(); |
| 1300 | 1297 |
| 1301 oldChild->setPreviousSibling(0); | 1298 oldChild->setPreviousSibling(0); |
| 1302 oldChild->setNextSibling(0); | 1299 oldChild->setNextSibling(0); |
| 1303 oldChild->m_parent = 0; | 1300 oldChild->m_parent = 0; |
| 1304 | 1301 |
| 1302 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); |
| 1303 |
| 1305 oldChild->updateDescendantDependentFlags(); | 1304 oldChild->updateDescendantDependentFlags(); |
| 1306 | 1305 |
| 1307 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant) | 1306 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant) |
| 1308 dirtyAncestorChainVisibleDescendantStatus(); | 1307 dirtyAncestorChainVisibleDescendantStatus(); |
| 1309 | 1308 |
| 1310 if (oldChild->m_blendInfo.hasBlendMode() || oldChild->blendInfo().childLayer
HasBlendMode()) | 1309 if (oldChild->m_blendInfo.hasBlendMode() || oldChild->blendInfo().childLayer
HasBlendMode()) |
| 1311 m_blendInfo.dirtyAncestorChainBlendedDescendantStatus(); | 1310 m_blendInfo.dirtyAncestorChainBlendedDescendantStatus(); |
| 1312 | 1311 |
| 1313 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend
ant()) | |
| 1314 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); | |
| 1315 | |
| 1316 return oldChild; | 1312 return oldChild; |
| 1317 } | 1313 } |
| 1318 | 1314 |
| 1319 void RenderLayer::removeOnlyThisLayer() | 1315 void RenderLayer::removeOnlyThisLayer() |
| 1320 { | 1316 { |
| 1321 if (!m_parent) | 1317 if (!m_parent) |
| 1322 return; | 1318 return; |
| 1323 | 1319 |
| 1324 m_clipper.clearClipRectsIncludingDescendants(); | 1320 m_clipper.clearClipRectsIncludingDescendants(); |
| 1325 repainter().repaintIncludingNonCompositingDescendants(); | 1321 repainter().repaintIncludingNonCompositingDescendants(); |
| (...skipping 2078 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3404 { | 3400 { |
| 3405 if (renderer()->isRenderPart() && toRenderPart(renderer())->requiresAccelera
tedCompositing()) | 3401 if (renderer()->isRenderPart() && toRenderPart(renderer())->requiresAccelera
tedCompositing()) |
| 3406 return true; | 3402 return true; |
| 3407 return m_layerType == NormalLayer | 3403 return m_layerType == NormalLayer |
| 3408 || (m_scrollableArea && m_scrollableArea->hasOverlayScrollbars()) | 3404 || (m_scrollableArea && m_scrollableArea->hasOverlayScrollbars()) |
| 3409 || needsCompositedScrolling(); | 3405 || needsCompositedScrolling(); |
| 3410 } | 3406 } |
| 3411 | 3407 |
| 3412 void RenderLayer::updateSelfPaintingLayer() | 3408 void RenderLayer::updateSelfPaintingLayer() |
| 3413 { | 3409 { |
| 3414 bool isSelfPaintingLayer = this->shouldBeSelfPaintingLayer(); | 3410 bool isSelfPaintingLayer = shouldBeSelfPaintingLayer(); |
| 3415 if (this->isSelfPaintingLayer() == isSelfPaintingLayer) | 3411 if (this->isSelfPaintingLayer() == isSelfPaintingLayer) |
| 3416 return; | 3412 return; |
| 3417 | 3413 |
| 3418 m_isSelfPaintingLayer = isSelfPaintingLayer; | 3414 m_isSelfPaintingLayer = isSelfPaintingLayer; |
| 3419 if (!parent()) | 3415 |
| 3420 return; | 3416 if (parent()) |
| 3421 if (isSelfPaintingLayer) | |
| 3422 parent()->setAncestorChainHasSelfPaintingLayerDescendant(); | |
| 3423 else | |
| 3424 parent()->dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); | 3417 parent()->dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); |
| 3425 } | 3418 } |
| 3426 | 3419 |
| 3427 bool RenderLayer::hasNonEmptyChildRenderers() const | 3420 bool RenderLayer::hasNonEmptyChildRenderers() const |
| 3428 { | 3421 { |
| 3429 // Some HTML can cause whitespace text nodes to have renderers, like: | 3422 // Some HTML can cause whitespace text nodes to have renderers, like: |
| 3430 // <div> | 3423 // <div> |
| 3431 // <img src=...> | 3424 // <img src=...> |
| 3432 // </div> | 3425 // </div> |
| 3433 // so test for 0x0 RenderTexts here | 3426 // so test for 0x0 RenderTexts here |
| (...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3729 } | 3722 } |
| 3730 } | 3723 } |
| 3731 | 3724 |
| 3732 void showLayerTree(const blink::RenderObject* renderer) | 3725 void showLayerTree(const blink::RenderObject* renderer) |
| 3733 { | 3726 { |
| 3734 if (!renderer) | 3727 if (!renderer) |
| 3735 return; | 3728 return; |
| 3736 showLayerTree(renderer->enclosingLayer()); | 3729 showLayerTree(renderer->enclosingLayer()); |
| 3737 } | 3730 } |
| 3738 #endif | 3731 #endif |
| OLD | NEW |