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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutObject.cpp

Issue 2732573003: Skip paint property update and visual rect update if no geometry change (Closed)
Patch Set: - Created 3 years, 9 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
OLDNEW
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. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2011 Apple Inc.
7 * All rights reserved. 7 * All rights reserved.
8 * Copyright (C) 2009 Google Inc. All rights reserved. 8 * Copyright (C) 2009 Google Inc. All rights reserved.
9 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. 9 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved.
10 * (http://www.torchmobile.com/) 10 * (http://www.torchmobile.com/)
(...skipping 1611 matching lines...) Expand 10 before | Expand all | Expand 10 after
1622 ? object->parent() 1622 ? object->parent()
1623 : object->containingBlock(); 1623 : object->containingBlock();
1624 if (object) 1624 if (object)
1625 object->setChildNeedsOverflowRecalcAfterStyleChange(); 1625 object->setChildNeedsOverflowRecalcAfterStyleChange();
1626 } while (object); 1626 } while (object);
1627 } 1627 }
1628 1628
1629 void LayoutObject::setNeedsOverflowRecalcAfterStyleChange() { 1629 void LayoutObject::setNeedsOverflowRecalcAfterStyleChange() {
1630 bool neededRecalc = needsOverflowRecalcAfterStyleChange(); 1630 bool neededRecalc = needsOverflowRecalcAfterStyleChange();
1631 setSelfNeedsOverflowRecalcAfterStyleChange(); 1631 setSelfNeedsOverflowRecalcAfterStyleChange();
1632 setNeedsPaintOffsetAndVisualRectUpdate();
1632 if (!neededRecalc) 1633 if (!neededRecalc)
1633 markAncestorsForOverflowRecalcIfNeeded(); 1634 markAncestorsForOverflowRecalcIfNeeded();
1634 } 1635 }
1635 1636
1636 DISABLE_CFI_PERF 1637 DISABLE_CFI_PERF
1637 void LayoutObject::setStyle(PassRefPtr<ComputedStyle> style) { 1638 void LayoutObject::setStyle(PassRefPtr<ComputedStyle> style) {
1638 ASSERT(style); 1639 ASSERT(style);
1639 1640
1640 if (m_style == style) { 1641 if (m_style == style) {
1641 // We need to run through adjustStyleDifference() for iframes, plugins, and 1642 // We need to run through adjustStyleDifference() for iframes, plugins, and
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
1721 1722
1722 if (diff.needsRecomputeOverflow() && !needsLayout()) { 1723 if (diff.needsRecomputeOverflow() && !needsLayout()) {
1723 // TODO(rhogan): Make inlines capable of recomputing overflow too. 1724 // TODO(rhogan): Make inlines capable of recomputing overflow too.
1724 if (isLayoutBlock()) 1725 if (isLayoutBlock())
1725 setNeedsOverflowRecalcAfterStyleChange(); 1726 setNeedsOverflowRecalcAfterStyleChange();
1726 else 1727 else
1727 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange); 1728 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange);
1728 } 1729 }
1729 1730
1730 if (diff.needsPaintInvalidationSubtree() || 1731 if (diff.needsPaintInvalidationSubtree() ||
1731 updatedDiff.needsPaintInvalidationSubtree()) 1732 updatedDiff.needsPaintInvalidationSubtree()) {
1732 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants(); 1733 setShouldDoFullPaintInvalidationIncludingNonCompositingDescendants();
1733 else if (diff.needsPaintInvalidationObject() || 1734 } else if (diff.needsPaintInvalidationObject() ||
1734 updatedDiff.needsPaintInvalidationObject()) 1735 updatedDiff.needsPaintInvalidationObject()) {
1735 setShouldDoFullPaintInvalidation(); 1736 // TODO(wangxianzhu): For now LayoutSVGRoot::localVisualRect() depends on
1737 // several styles. Refactor to avoid this special case.
1738 if (isSVGRoot())
1739 setShouldDoFullPaintInvalidation();
1740 else
1741 setShouldDoFullPaintInvalidationWithoutGeometryChange();
1742 }
1743
1744 // Visibility affects visual rect.
1745 if (oldStyle && oldStyle->visibility() != m_style->visibility())
1746 setNeedsPaintOffsetAndVisualRectUpdate();
1736 1747
1737 // Text nodes share style with their parents but the paint properties don't 1748 // Text nodes share style with their parents but the paint properties don't
1738 // apply to them, hence the !isText() check. 1749 // apply to them, hence the !isText() check.
1739 if (RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() && !isText() && 1750 if (RuntimeEnabledFeatures::slimmingPaintInvalidationEnabled() && !isText() &&
1740 (diff.transformChanged() || diff.opacityChanged() || 1751 (diff.transformChanged() || diff.opacityChanged() ||
1741 diff.zIndexChanged() || diff.filterChanged() || 1752 diff.zIndexChanged() || diff.filterChanged() ||
1742 diff.backdropFilterChanged() || diff.cssClipChanged())) { 1753 diff.backdropFilterChanged() || diff.cssClipChanged())) {
1743 setNeedsPaintPropertyUpdate(); 1754 setNeedsPaintPropertyUpdate();
1744 1755
1745 // We don't need to invalidate paint of objects on SPv2 when only paint 1756 // We don't need to invalidate paint of objects on SPv2 when only paint
(...skipping 1660 matching lines...) Expand 10 before | Expand all | Expand 10 after
3406 } 3417 }
3407 } 3418 }
3408 3419
3409 inline void LayoutObject::markAncestorsForPaintInvalidation() { 3420 inline void LayoutObject::markAncestorsForPaintInvalidation() {
3410 for ( 3421 for (
3411 LayoutObject* parent = this->paintInvalidationParent(); 3422 LayoutObject* parent = this->paintInvalidationParent();
3412 parent && 3423 parent &&
3413 !parent 3424 !parent
3414 ->shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState() ; 3425 ->shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState() ;
3415 parent = parent->paintInvalidationParent()) 3426 parent = parent->paintInvalidationParent())
3416 parent->m_bitfields.setChildShouldCheckForPaintInvalidation(true); 3427 parent->m_bitfields.setMayNeedPaintInvalidation(true);
3428 }
3429
3430 inline void LayoutObject::setNeedsPaintOffsetAndVisualRectUpdate() {
3431 if (needsPaintOffsetAndVisualRectUpdate())
3432 return;
3433 m_bitfields.setNeedsPaintOffsetAndVisualRectUpdate(true);
3434 for (LayoutObject* parent = paintInvalidationParent();
3435 parent && !parent->needsPaintOffsetAndVisualRectUpdate();
3436 parent = parent->paintInvalidationParent())
3437 parent->m_bitfields.setNeedsPaintOffsetAndVisualRectUpdate(true);
3417 } 3438 }
3418 3439
3419 void LayoutObject::setShouldInvalidateSelection() { 3440 void LayoutObject::setShouldInvalidateSelection() {
3420 if (!canUpdateSelectionOnRootLineBoxes()) 3441 if (!canUpdateSelectionOnRootLineBoxes())
3421 return; 3442 return;
3422 m_bitfields.setShouldInvalidateSelection(true); 3443 m_bitfields.setShouldInvalidateSelection(true);
3423 markAncestorsForPaintInvalidation(); 3444 setMayNeedPaintInvalidation();
3424 frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded(); 3445 frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded();
3425 } 3446 }
3426 3447
3427 void LayoutObject::setShouldDoFullPaintInvalidation( 3448 void LayoutObject::setShouldDoFullPaintInvalidation(
3428 PaintInvalidationReason reason) { 3449 PaintInvalidationReason reason) {
3450 setNeedsPaintOffsetAndVisualRectUpdate();
pdr. 2017/03/10 06:21:39 Can this be called during paint invalidation? I th
Xianzhu 2017/03/10 17:43:05 This can be called during paint invalidation (e.g.
3451 setShouldDoFullPaintInvalidationWithoutGeometryChange(reason);
3452 }
3453
3454 void LayoutObject::setShouldDoFullPaintInvalidationWithoutGeometryChange(
3455 PaintInvalidationReason reason) {
3429 // Only full invalidation reasons are allowed. 3456 // Only full invalidation reasons are allowed.
3430 ASSERT(isFullPaintInvalidationReason(reason)); 3457 DCHECK(isFullPaintInvalidationReason(reason));
3431 3458
3432 bool isUpgradingDelayedFullToFull = 3459 bool isUpgradingDelayedFullToFull =
3433 m_bitfields.fullPaintInvalidationReason() == 3460 m_bitfields.fullPaintInvalidationReason() ==
3434 PaintInvalidationDelayedFull && 3461 PaintInvalidationDelayedFull &&
3435 reason != PaintInvalidationDelayedFull; 3462 reason != PaintInvalidationDelayedFull;
3436 3463
3437 if (m_bitfields.fullPaintInvalidationReason() == PaintInvalidationNone || 3464 if (m_bitfields.fullPaintInvalidationReason() == PaintInvalidationNone ||
3438 isUpgradingDelayedFullToFull) { 3465 isUpgradingDelayedFullToFull) {
3439 if (reason == PaintInvalidationFull) 3466 if (reason == PaintInvalidationFull)
3440 reason = 3467 reason =
3441 documentLifecycleBasedPaintInvalidationReason(document().lifecycle()); 3468 documentLifecycleBasedPaintInvalidationReason(document().lifecycle());
3442 m_bitfields.setFullPaintInvalidationReason(reason); 3469 m_bitfields.setFullPaintInvalidationReason(reason);
3443 if (!isUpgradingDelayedFullToFull) 3470 if (!isUpgradingDelayedFullToFull)
3444 markAncestorsForPaintInvalidation(); 3471 markAncestorsForPaintInvalidation();
3445 } 3472 }
3446 3473
3447 frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded(); 3474 frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded();
3448 } 3475 }
3449 3476
3450 void LayoutObject::setMayNeedPaintInvalidation() { 3477 void LayoutObject::setMayNeedPaintInvalidation() {
3478 setNeedsPaintOffsetAndVisualRectUpdate();
3479 setMayNeedPaintInvalidationWithoutGeometryChange();
3480 }
3481
3482 void LayoutObject::setMayNeedPaintInvalidationWithoutGeometryChange() {
3451 if (mayNeedPaintInvalidation()) 3483 if (mayNeedPaintInvalidation())
3452 return; 3484 return;
3453 m_bitfields.setMayNeedPaintInvalidation(true); 3485 m_bitfields.setMayNeedPaintInvalidation(true);
3454 markAncestorsForPaintInvalidation(); 3486 markAncestorsForPaintInvalidation();
3455 frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded(); 3487 frameView()->scheduleVisualUpdateForPaintInvalidationIfNeeded();
3456 } 3488 }
3457 3489
3458 void LayoutObject::setMayNeedPaintInvalidationSubtree() { 3490 void LayoutObject::setMayNeedPaintInvalidationSubtree() {
3459 if (mayNeedPaintInvalidationSubtree()) 3491 if (mayNeedPaintInvalidationSubtree())
3460 return; 3492 return;
3461 m_bitfields.setMayNeedPaintInvalidationSubtree(true); 3493 m_bitfields.setMayNeedPaintInvalidationSubtree(true);
3462 setMayNeedPaintInvalidation(); 3494 setMayNeedPaintInvalidation();
3463 } 3495 }
3464 3496
3465 void LayoutObject::setMayNeedPaintInvalidationAnimatedBackgroundImage() { 3497 void LayoutObject::setMayNeedPaintInvalidationAnimatedBackgroundImage() {
3466 if (mayNeedPaintInvalidationAnimatedBackgroundImage()) 3498 if (mayNeedPaintInvalidationAnimatedBackgroundImage())
3467 return; 3499 return;
3468 m_bitfields.setMayNeedPaintInvalidationAnimatedBackgroundImage(true); 3500 m_bitfields.setMayNeedPaintInvalidationAnimatedBackgroundImage(true);
3469 setMayNeedPaintInvalidation(); 3501 setMayNeedPaintInvalidationWithoutGeometryChange();
3470 } 3502 }
3471 3503
3472 void LayoutObject::clearPaintInvalidationFlags() { 3504 void LayoutObject::clearPaintInvalidationFlags() {
3473 // paintInvalidationStateIsDirty should be kept in sync with the 3505 // paintInvalidationStateIsDirty should be kept in sync with the
3474 // booleans that are cleared below. 3506 // booleans that are cleared below.
3475 #if DCHECK_IS_ON() 3507 #if DCHECK_IS_ON()
3476 DCHECK(!shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState() || 3508 DCHECK(!shouldCheckForPaintInvalidationRegardlessOfPaintInvalidationState() ||
3477 paintInvalidationStateIsDirty()); 3509 paintInvalidationStateIsDirty());
3478 #endif 3510 #endif
3479 clearShouldDoFullPaintInvalidation(); 3511 clearShouldDoFullPaintInvalidation();
3480 m_bitfields.setChildShouldCheckForPaintInvalidation(false);
3481 m_bitfields.setMayNeedPaintInvalidation(false); 3512 m_bitfields.setMayNeedPaintInvalidation(false);
3482 m_bitfields.setMayNeedPaintInvalidationSubtree(false); 3513 m_bitfields.setMayNeedPaintInvalidationSubtree(false);
3483 m_bitfields.setMayNeedPaintInvalidationAnimatedBackgroundImage(false); 3514 m_bitfields.setMayNeedPaintInvalidationAnimatedBackgroundImage(false);
3515 m_bitfields.setNeedsPaintOffsetAndVisualRectUpdate(false);
3484 m_bitfields.setShouldInvalidateSelection(false); 3516 m_bitfields.setShouldInvalidateSelection(false);
3485 m_bitfields.setBackgroundChangedSinceLastPaintInvalidation(false); 3517 m_bitfields.setBackgroundChangedSinceLastPaintInvalidation(false);
3486 } 3518 }
3487 3519
3488 bool LayoutObject::isAllowedToModifyLayoutTreeStructure(Document& document) { 3520 bool LayoutObject::isAllowedToModifyLayoutTreeStructure(Document& document) {
3489 return DeprecatedDisableModifyLayoutTreeStructureAsserts:: 3521 return DeprecatedDisableModifyLayoutTreeStructureAsserts::
3490 canModifyLayoutTreeStateInAnyState() || 3522 canModifyLayoutTreeStateInAnyState() ||
3491 document.lifecycle().stateAllowsLayoutTreeMutations(); 3523 document.lifecycle().stateAllowsLayoutTreeMutations();
3492 } 3524 }
3493 3525
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
3596 const blink::LayoutObject* root = object1; 3628 const blink::LayoutObject* root = object1;
3597 while (root->parent()) 3629 while (root->parent())
3598 root = root->parent(); 3630 root = root->parent();
3599 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); 3631 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0);
3600 } else { 3632 } else {
3601 WTFLogAlways("%s", "Cannot showLayoutTree. Root is (nil)"); 3633 WTFLogAlways("%s", "Cannot showLayoutTree. Root is (nil)");
3602 } 3634 }
3603 } 3635 }
3604 3636
3605 #endif 3637 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698