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

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

Issue 1473363003: Invalidate first line display item clients when first line style changes (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address mstensho's comments Created 5 years 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. 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 707 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 if (hasNonCompositedScrollbars()) 718 if (hasNonCompositedScrollbars())
719 return false; 719 return false;
720 720
721 // We can't detect whether a plugin has box effects, so disable this optimiz ation for that case. 721 // We can't detect whether a plugin has box effects, so disable this optimiz ation for that case.
722 if (isEmbeddedObject()) 722 if (isEmbeddedObject())
723 return false; 723 return false;
724 724
725 return !hasBoxEffect(); 725 return !hasBoxEffect();
726 } 726 }
727 727
728 LayoutBlock* LayoutObject::firstLineBlock() const
729 {
730 return nullptr;
731 }
732
733 static inline bool objectIsRelayoutBoundary(const LayoutObject* object) 728 static inline bool objectIsRelayoutBoundary(const LayoutObject* object)
734 { 729 {
735 // FIXME: In future it may be possible to broaden these conditions in order to improve performance. 730 // FIXME: In future it may be possible to broaden these conditions in order to improve performance.
736 if (object->isTextControl()) 731 if (object->isTextControl())
737 return true; 732 return true;
738 733
739 if (object->isSVGRoot()) 734 if (object->isSVGRoot())
740 return true; 735 return true;
741 736
742 if (!object->hasOverflowClip()) 737 if (!object->hasOverflowClip())
(...skipping 1087 matching lines...) Expand 10 before | Expand all | Expand 10 after
1830 setStyle(style.release()); 1825 setStyle(style.release());
1831 return; 1826 return;
1832 } 1827 }
1833 1828
1834 setStyle(pseudoStyle); 1829 setStyle(pseudoStyle);
1835 } 1830 }
1836 1831
1837 void LayoutObject::firstLineStyleDidChange(const ComputedStyle& oldStyle, const ComputedStyle& newStyle) 1832 void LayoutObject::firstLineStyleDidChange(const ComputedStyle& oldStyle, const ComputedStyle& newStyle)
1838 { 1833 {
1839 StyleDifference diff = oldStyle.visualInvalidationDiff(newStyle); 1834 StyleDifference diff = oldStyle.visualInvalidationDiff(newStyle);
1840 if (diff.hasDifference()) { 1835
1841 // TODO(rune@opera.com): We should use the diff to determine whether a r epaint vs. layout 1836 if (diff.needsPaintInvalidation() || diff.textDecorationOrColorChanged()) {
1842 // is needed, but for now just assume a layout will be required. The dif f code 1837 LayoutBlockFlow* firstLineContainer = nullptr;
1843 // in LayoutObject::setStyle would need to be factored out so that it co uld be reused. 1838 if (canHaveFirstLineOrFirstLetterStyle()) {
chrishtr 2015/12/03 18:41:56 It seems it would be cleaner to make firstLineStyl
Xianzhu 2015/12/03 19:10:40 That would need to duplicate more than half of thi
Xianzhu 2015/12/03 19:45:13 I think it might be be better to separate FIRST_LI
mstensho (USE GERRIT) 2015/12/03 19:58:02 FWIW, I think what we already have here is good.
1844 setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalida tionReason::StyleChange); 1839 firstLineContainer = toLayoutBlock(this)->nearestInnerBlockWithFirst Line();
1840 } else if (isLayoutInline()) {
1841 if (InlineBox* firstLineBox = toLayoutInline(this)->firstLineBoxIncl udingCulling()) {
1842 if (firstLineBox->isFirstLineStyle())
1843 firstLineContainer = toLayoutBlockFlow(containingBlock());
1844 }
1845 }
1846 if (firstLineContainer) {
1847 firstLineContainer->invalidateDisplayItemClientsOfFirstLine();
1848 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled())
1849 firstLineContainer->setShouldDoFullPaintInvalidation();
1850 }
1845 } 1851 }
1852 if (diff.needsLayout())
1853 setNeedsLayoutAndPrefWidthsRecalc(LayoutInvalidationReason::StyleChange) ;
1846 } 1854 }
1847 1855
1848 void LayoutObject::markContainingBlocksForOverflowRecalc() 1856 void LayoutObject::markContainingBlocksForOverflowRecalc()
1849 { 1857 {
1850 for (LayoutBlock* container = containingBlock(); container && !container->ch ildNeedsOverflowRecalcAfterStyleChange(); container = container->containingBlock ()) 1858 for (LayoutBlock* container = containingBlock(); container && !container->ch ildNeedsOverflowRecalcAfterStyleChange(); container = container->containingBlock ())
1851 container->setChildNeedsOverflowRecalcAfterStyleChange(); 1859 container->setChildNeedsOverflowRecalcAfterStyleChange();
1852 } 1860 }
1853 1861
1854 void LayoutObject::setNeedsOverflowRecalcAfterStyleChange() 1862 void LayoutObject::setNeedsOverflowRecalcAfterStyleChange()
1855 { 1863 {
(...skipping 939 matching lines...) Expand 10 before | Expand all | Expand 10 after
2795 Cached, 2803 Cached,
2796 Uncached 2804 Uncached
2797 }; 2805 };
2798 2806
2799 static PassRefPtr<ComputedStyle> firstLineStyleForCachedUncachedType(StyleCacheS tate type, const LayoutObject* layoutObject, ComputedStyle* style) 2807 static PassRefPtr<ComputedStyle> firstLineStyleForCachedUncachedType(StyleCacheS tate type, const LayoutObject* layoutObject, ComputedStyle* style)
2800 { 2808 {
2801 const LayoutObject* layoutObjectForFirstLineStyle = layoutObject; 2809 const LayoutObject* layoutObjectForFirstLineStyle = layoutObject;
2802 if (layoutObject->isBeforeOrAfterContent()) 2810 if (layoutObject->isBeforeOrAfterContent())
2803 layoutObjectForFirstLineStyle = layoutObject->parent(); 2811 layoutObjectForFirstLineStyle = layoutObject->parent();
2804 2812
2805 if (layoutObjectForFirstLineStyle->isLayoutBlockFlow() || layoutObjectForFir stLineStyle->isLayoutButton()) { 2813 if (layoutObjectForFirstLineStyle->canHaveFirstLineOrFirstLetterStyle()) {
2806 if (LayoutBlock* firstLineBlock = layoutObjectForFirstLineStyle->firstLi neBlock()) { 2814 if (LayoutBlock* firstLineBlock = toLayoutBlock(layoutObjectForFirstLine Style)->enclosingFirstLineStyleBlock()) {
2807 if (type == Cached) 2815 if (type == Cached)
2808 return firstLineBlock->getCachedPseudoStyle(FIRST_LINE, style); 2816 return firstLineBlock->getCachedPseudoStyle(FIRST_LINE, style);
2809 return firstLineBlock->getUncachedPseudoStyle(PseudoStyleRequest(FIR ST_LINE), style, firstLineBlock == layoutObject ? style : 0); 2817 return firstLineBlock->getUncachedPseudoStyle(PseudoStyleRequest(FIR ST_LINE), style, firstLineBlock == layoutObject ? style : 0);
2810 } 2818 }
2811 } else if (!layoutObjectForFirstLineStyle->isAnonymous() && layoutObjectForF irstLineStyle->isLayoutInline() 2819 } else if (!layoutObjectForFirstLineStyle->isAnonymous() && layoutObjectForF irstLineStyle->isLayoutInline()
2812 && !layoutObjectForFirstLineStyle->node()->isFirstLetterPseudoElement()) { 2820 && !layoutObjectForFirstLineStyle->node()->isFirstLetterPseudoElement()) {
2813 const ComputedStyle* parentStyle = layoutObjectForFirstLineStyle->parent ()->firstLineStyle(); 2821 const ComputedStyle* parentStyle = layoutObjectForFirstLineStyle->parent ()->firstLineStyle();
2814 if (parentStyle != layoutObjectForFirstLineStyle->parent()->style()) { 2822 if (parentStyle != layoutObjectForFirstLineStyle->parent()->style()) {
2815 if (type == Cached) { 2823 if (type == Cached) {
2816 // A first-line style is in effect. Cache a first-line style for ourselves. 2824 // A first-line style is in effect. Cache a first-line style for ourselves.
(...skipping 682 matching lines...) Expand 10 before | Expand all | Expand 10 after
3499 const blink::LayoutObject* root = object1; 3507 const blink::LayoutObject* root = object1;
3500 while (root->parent()) 3508 while (root->parent())
3501 root = root->parent(); 3509 root = root->parent();
3502 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0); 3510 root->showLayoutTreeAndMark(object1, "*", object2, "-", 0);
3503 } else { 3511 } else {
3504 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n"); 3512 fprintf(stderr, "Cannot showLayoutTree. Root is (nil)\n");
3505 } 3513 }
3506 } 3514 }
3507 3515
3508 #endif 3516 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698