OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) | 5 * (C) 2004 Allan Sandfeld Jensen (kde@carewolf.com) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc. All rights reserv
ed. |
7 * Copyright (C) 2009 Google Inc. All rights reserved. | 7 * Copyright (C) 2009 Google Inc. All rights reserved. |
8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 8 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
9 * | 9 * |
10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
(...skipping 3280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3291 return gModifyLayoutTreeStructureAnyState; | 3291 return gModifyLayoutTreeStructureAnyState; |
3292 } | 3292 } |
3293 | 3293 |
3294 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts() | 3294 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts() |
3295 : m_disabler(gDisablePaintInvalidationStateAsserts, true) | 3295 : m_disabler(gDisablePaintInvalidationStateAsserts, true) |
3296 { | 3296 { |
3297 } | 3297 } |
3298 | 3298 |
3299 namespace { | 3299 namespace { |
3300 | 3300 |
3301 // TODO(trchen): Use std::function<void, LayoutObject&> when available. | 3301 // TODO(trchen): Use std::function<void, LayoutObject&> and lambda when availabl
e. |
3302 template <typename LayoutObjectTraversalFunctor> | 3302 class LayoutObjectTraversalFunctor { |
| 3303 public: |
| 3304 virtual void operator()(LayoutObject&) const = 0; |
| 3305 }; |
| 3306 |
3303 void traverseNonCompositingDescendants(LayoutObject&, const LayoutObjectTraversa
lFunctor&); | 3307 void traverseNonCompositingDescendants(LayoutObject&, const LayoutObjectTraversa
lFunctor&); |
3304 | 3308 |
3305 template <typename LayoutObjectTraversalFunctor> | |
3306 void findNonCompositedDescendantLayerToTraverse(LayoutObject& object, const Layo
utObjectTraversalFunctor& functor) | 3309 void findNonCompositedDescendantLayerToTraverse(LayoutObject& object, const Layo
utObjectTraversalFunctor& functor) |
3307 { | 3310 { |
3308 LayoutObject* descendant = object.nextInPreOrder(&object); | 3311 LayoutObject* descendant = object.nextInPreOrder(&object); |
3309 while (descendant) { | 3312 while (descendant) { |
3310 // Case 1: If the descendant has no layer, keep searching until we find
a layer. | 3313 // Case 1: If the descendant has no layer, keep searching until we find
a layer. |
3311 if (!descendant->hasLayer()) { | 3314 if (!descendant->hasLayer()) { |
3312 descendant = descendant->nextInPreOrder(&object); | 3315 descendant = descendant->nextInPreOrder(&object); |
3313 continue; | 3316 continue; |
3314 } | 3317 } |
3315 // Case 2: The descendant has a layer and is not composited. | 3318 // Case 2: The descendant has a layer and is not composited. |
(...skipping 10 matching lines...) Expand all Loading... |
3326 if (descendant->styleRef().isStackingContext()) { | 3329 if (descendant->styleRef().isStackingContext()) { |
3327 descendant = descendant->nextInPreOrderAfterChildren(&object); | 3330 descendant = descendant->nextInPreOrderAfterChildren(&object); |
3328 continue; | 3331 continue; |
3329 } | 3332 } |
3330 // Case 4: The descendant is an invalidation container but not a stackin
g context. | 3333 // Case 4: The descendant is an invalidation container but not a stackin
g context. |
3331 // This is the same situation as the root, thus keep searching. | 3334 // This is the same situation as the root, thus keep searching. |
3332 descendant = descendant->nextInPreOrder(&object); | 3335 descendant = descendant->nextInPreOrder(&object); |
3333 } | 3336 } |
3334 } | 3337 } |
3335 | 3338 |
3336 template <typename LayoutObjectTraversalFunctor> | |
3337 void traverseNonCompositingDescendants(LayoutObject& object, const LayoutObjectT
raversalFunctor& functor) | 3339 void traverseNonCompositingDescendants(LayoutObject& object, const LayoutObjectT
raversalFunctor& functor) |
3338 { | 3340 { |
3339 functor(object); | 3341 functor(object); |
3340 LayoutObject* descendant = object.nextInPreOrder(&object); | 3342 LayoutObject* descendant = object.nextInPreOrder(&object); |
3341 while (descendant) { | 3343 while (descendant) { |
3342 if (!descendant->isPaintInvalidationContainer()) { | 3344 if (!descendant->isPaintInvalidationContainer()) { |
3343 functor(*descendant); | 3345 functor(*descendant); |
3344 descendant = descendant->nextInPreOrder(&object); | 3346 descendant = descendant->nextInPreOrder(&object); |
3345 continue; | 3347 continue; |
3346 } | 3348 } |
3347 if (descendant->styleRef().isStackingContext()) { | 3349 if (descendant->styleRef().isStackingContext()) { |
3348 descendant = descendant->nextInPreOrderAfterChildren(&object); | 3350 descendant = descendant->nextInPreOrderAfterChildren(&object); |
3349 continue; | 3351 continue; |
3350 } | 3352 } |
3351 | 3353 |
3352 // If a paint invalidation container is not a stacking context, | 3354 // If a paint invalidation container is not a stacking context, |
3353 // some of its descendants may belong to the parent container. | 3355 // some of its descendants may belong to the parent container. |
3354 findNonCompositedDescendantLayerToTraverse(*descendant, functor); | 3356 findNonCompositedDescendantLayerToTraverse(*descendant, functor); |
3355 descendant = descendant->nextInPreOrderAfterChildren(&object); | 3357 descendant = descendant->nextInPreOrderAfterChildren(&object); |
3356 } | 3358 } |
3357 } | 3359 } |
3358 | 3360 |
3359 } // unnamed namespace | 3361 } // unnamed namespace |
3360 | 3362 |
3361 void LayoutObject::invalidateDisplayItemClientsIncludingNonCompositingDescendant
s(const LayoutBoxModelObject* paintInvalidationContainer, PaintInvalidationReaso
n paintInvalidationReason, const LayoutRect* paintInvalidationRect) const | 3363 void LayoutObject::invalidateDisplayItemClientForNonCompositingDescendantsOf(con
st LayoutObject& object) const |
3362 { | 3364 { |
| 3365 // Not using enclosingCompositedContainer() directly because this object may
be in an orphaned subtree. |
| 3366 PaintLayer* enclosingLayer = this->enclosingLayer(); |
| 3367 if (!enclosingLayer) |
| 3368 return; |
| 3369 |
| 3370 // TODO(wangxianzhu): This is a workaround for invalidation of detached cust
om scrollbar parts which can't find |
| 3371 // their own enclosing layers. May remove this when fixing crbug.com/547119
for scrollbars. |
| 3372 enclosingLayer->setNeedsRepaint(); |
| 3373 |
3363 // This is valid because we want to invalidate the client in the display ite
m list of the current backing. | 3374 // This is valid because we want to invalidate the client in the display ite
m list of the current backing. |
3364 DisableCompositingQueryAsserts disabler; | 3375 DisableCompositingQueryAsserts disabler; |
3365 if (!paintInvalidationContainer) { | 3376 const PaintLayer* paintInvalidationLayer = enclosingLayer->enclosingLayerFor
PaintInvalidationCrossingFrameBoundaries(); |
3366 // Not using enclosingCompositedContainer() directly because this object
may be in an orphaned subtree. | 3377 if (!paintInvalidationLayer) |
3367 PaintLayer* enclosingLayer = this->enclosingLayer(); | 3378 return; |
3368 if (!enclosingLayer) | |
3369 return; | |
3370 const PaintLayer* paintInvalidationLayer = enclosingLayer->enclosingLaye
rForPaintInvalidationCrossingFrameBoundaries(); | |
3371 if (!paintInvalidationLayer) | |
3372 return; | |
3373 paintInvalidationContainer = paintInvalidationLayer->layoutObject(); | |
3374 } | |
3375 | 3379 |
3376 traverseNonCompositingDescendants(const_cast<LayoutObject&>(*this), [&paintI
nvalidationContainer, paintInvalidationReason, paintInvalidationRect](LayoutObje
ct& object) { | 3380 class Functor : public LayoutObjectTraversalFunctor { |
3377 object.invalidateDisplayItemClients(*paintInvalidationContainer, paintIn
validationReason, paintInvalidationRect); | 3381 public: |
3378 }); | 3382 explicit Functor(const LayoutBoxModelObject& paintInvalidationContainer)
: m_paintInvalidationContainer(paintInvalidationContainer) { } |
| 3383 void operator()(LayoutObject& object) const override |
| 3384 { |
| 3385 // TODO(wangxianzhu): Ensure correct bounds for the client will be o
r has been passed to PaintController. crbug.com/547119. |
| 3386 object.invalidateDisplayItemClients(m_paintInvalidationContainer, Pa
intInvalidationFull, nullptr); |
| 3387 } |
| 3388 private: |
| 3389 const LayoutBoxModelObject& m_paintInvalidationContainer; |
| 3390 }; |
| 3391 |
| 3392 const LayoutBoxModelObject& paintInvalidationContainer = *paintInvalidationL
ayer->layoutObject(); |
| 3393 traverseNonCompositingDescendants(const_cast<LayoutObject&>(object), Functor
(paintInvalidationContainer)); |
3379 } | 3394 } |
3380 | 3395 |
3381 void LayoutObject::invalidatePaintOfPreviousPaintInvalidationRect(const LayoutBo
xModelObject& paintInvalidationContainer, PaintInvalidationReason reason) | 3396 void LayoutObject::invalidatePaintOfPreviousPaintInvalidationRect(const LayoutBo
xModelObject& paintInvalidationContainer, PaintInvalidationReason reason) |
3382 { | 3397 { |
3383 // These disablers are valid because we want to use the current compositing/
invalidation status. | 3398 // These disablers are valid because we want to use the current compositing/
invalidation status. |
3384 DisablePaintInvalidationStateAsserts invalidationDisabler; | 3399 DisablePaintInvalidationStateAsserts invalidationDisabler; |
3385 DisableCompositingQueryAsserts compositingDisabler; | 3400 DisableCompositingQueryAsserts compositingDisabler; |
3386 | 3401 |
3387 LayoutRect invalidationRect = previousPaintInvalidationRect(); | 3402 LayoutRect invalidationRect = previousPaintInvalidationRect(); |
3388 adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalida
tionContainer); | 3403 adjustInvalidationRectForCompositedScrolling(invalidationRect, paintInvalida
tionContainer); |
3389 invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect,
PaintInvalidationLayer); | 3404 invalidatePaintUsingContainer(paintInvalidationContainer, invalidationRect,
PaintInvalidationLayer); |
3390 | 3405 |
3391 // The PaintController may have changed. Pass the previous paint invalidatio
n rect to the new PaintController. | 3406 // The PaintController may have changed. Pass the previous paint invalidatio
n rect to the new PaintController. |
3392 // The rect will be updated if it changes during the next paint invalidation
. | 3407 // The rect will be updated if it changes during the next paint invalidation
. |
3393 invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationLa
yer, &invalidationRect); | 3408 invalidateDisplayItemClients(paintInvalidationContainer, PaintInvalidationLa
yer, &invalidationRect); |
3394 | 3409 |
3395 // This method may be used to invalidate paint of an object changing paint i
nvalidation container. | 3410 // This method may be used to invalidate paint of an object changing paint i
nvalidation container. |
3396 // Clear previous paint invalidation rect on the original paint invalidation
container to avoid | 3411 // Clear previous paint invalidation rect on the original paint invalidation
container to avoid |
3397 // under-invalidation if the new paint invalidation rect on the new paint in
validation container | 3412 // under-invalidation if the new paint invalidation rect on the new paint in
validation container |
3398 // happens to be the same as the old one. | 3413 // happens to be the same as the old one. |
3399 setPreviousPaintInvalidationRect(LayoutRect()); | 3414 setPreviousPaintInvalidationRect(LayoutRect()); |
3400 } | 3415 } |
3401 | 3416 |
3402 void LayoutObject::invalidatePaintIncludingNonCompositingDescendants() | 3417 void LayoutObject::invalidatePaintIncludingNonCompositingDescendants() |
3403 { | 3418 { |
| 3419 class Functor : public LayoutObjectTraversalFunctor { |
| 3420 public: |
| 3421 explicit Functor(const LayoutBoxModelObject& paintInvalidationContainer)
: m_paintInvalidationContainer(paintInvalidationContainer) { } |
| 3422 void operator()(LayoutObject& object) const override |
| 3423 { |
| 3424 object.invalidatePaintOfPreviousPaintInvalidationRect(m_paintInvalid
ationContainer, PaintInvalidationLayer); |
| 3425 } |
| 3426 private: |
| 3427 const LayoutBoxModelObject& m_paintInvalidationContainer; |
| 3428 }; |
| 3429 |
3404 // Since we're only painting non-composited layers, we know that they all sh
are the same paintInvalidationContainer. | 3430 // Since we're only painting non-composited layers, we know that they all sh
are the same paintInvalidationContainer. |
3405 const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintIn
validationOnRootedTree(); | 3431 const LayoutBoxModelObject& paintInvalidationContainer = containerForPaintIn
validationOnRootedTree(); |
3406 traverseNonCompositingDescendants(*this, [&paintInvalidationContainer](Layou
tObject& object) { | 3432 traverseNonCompositingDescendants(*this, Functor(paintInvalidationContainer)
); |
3407 object.invalidatePaintOfPreviousPaintInvalidationRect(paintInvalidationC
ontainer, PaintInvalidationLayer); | |
3408 }); | |
3409 } | 3433 } |
3410 | 3434 |
3411 // FIXME: If we had a flag to force invalidations in a whole subtree, we could g
et rid of this function (crbug.com/410097). | 3435 // FIXME: If we had a flag to force invalidations in a whole subtree, we could g
et rid of this function (crbug.com/410097). |
3412 void LayoutObject::setShouldDoFullPaintInvalidationIncludingNonCompositingDescen
dants() | 3436 void LayoutObject::setShouldDoFullPaintInvalidationIncludingNonCompositingDescen
dants() |
3413 { | 3437 { |
| 3438 class Functor : public LayoutObjectTraversalFunctor { |
| 3439 public: |
| 3440 void operator()(LayoutObject& object) const override |
| 3441 { |
| 3442 object.setShouldDoFullPaintInvalidation(); |
| 3443 } |
| 3444 }; |
| 3445 |
3414 // Need to access the current compositing status. | 3446 // Need to access the current compositing status. |
3415 DisableCompositingQueryAsserts disabler; | 3447 DisableCompositingQueryAsserts disabler; |
3416 traverseNonCompositingDescendants(*this, [](LayoutObject& object) { | 3448 traverseNonCompositingDescendants(*this, Functor()); |
3417 object.setShouldDoFullPaintInvalidation(); | |
3418 }); | |
3419 } | 3449 } |
3420 | 3450 |
3421 void LayoutObject::invalidatePaintIncludingNonSelfPaintingLayerDescendants(const
LayoutBoxModelObject& paintInvalidationContainer) | 3451 void LayoutObject::invalidatePaintIncludingNonSelfPaintingLayerDescendants(const
LayoutBoxModelObject& paintInvalidationContainer) |
3422 { | 3452 { |
3423 invalidatePaintOfPreviousPaintInvalidationRect(paintInvalidationContainer, P
aintInvalidationLayer); | 3453 invalidatePaintOfPreviousPaintInvalidationRect(paintInvalidationContainer, P
aintInvalidationLayer); |
3424 for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibli
ng()) { | 3454 for (LayoutObject* child = slowFirstChild(); child; child = child->nextSibli
ng()) { |
3425 if (!child->hasLayer() || !toLayoutBoxModelObject(child)->layer()->isSel
fPaintingLayer()) | 3455 if (!child->hasLayer() || !toLayoutBoxModelObject(child)->layer()->isSel
fPaintingLayer()) |
3426 child->invalidatePaintIncludingNonSelfPaintingLayerDescendants(paint
InvalidationContainer); | 3456 child->invalidatePaintIncludingNonSelfPaintingLayerDescendants(paint
InvalidationContainer); |
3427 } | 3457 } |
3428 } | 3458 } |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3488 const blink::LayoutObject* root = object1; | 3518 const blink::LayoutObject* root = object1; |
3489 while (root->parent()) | 3519 while (root->parent()) |
3490 root = root->parent(); | 3520 root = root->parent(); |
3491 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); | 3521 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); |
3492 } else { | 3522 } else { |
3493 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); | 3523 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); |
3494 } | 3524 } |
3495 } | 3525 } |
3496 | 3526 |
3497 #endif | 3527 #endif |
OLD | NEW |