Changeset 45612 in webkit


Ignore:
Timestamp:
Jul 7, 2009, 4:45:45 PM (16 years ago)
Author:
mitz@apple.com
Message:

WebCore:

Reviewed by Dave Hyatt and Darin Adler.

Test: fast/css/pseudo-cache-stale.html

  • dom/Element.cpp: (WebCore::Element::pseudoStyleCacheIsInvalid): Added. Given the old style and the new style, goes over cached pseudo-styles in the old style and re-resolves the same style types off the new style. If any of the new pseudo-styles is different from the currently cached corresponding style, returns true. Otherwise, returns false. (WebCore::Element::recalcStyle): Validate the pseudo-style cache before deciding to keep the existing style.
  • dom/Element.h:
  • rendering/RenderObject.cpp: (WebCore::RenderObject::uncachedFirstLineStyle): Added this version that returns an uncached first-line style based off the given style. (WebCore::RenderObject::getUncachedPseudoStyle): Added the 'ownStyle' parameter.
  • rendering/RenderObject.h:
  • rendering/style/RenderStyle.cpp: (WebCore::RenderStyle::getPseudoStyleCache): Added. Returns the cached pseudo-styles in the passed-in vector.
  • rendering/style/RenderStyle.h:

LayoutTests:

Reviewed by Dave Hyatt and Darin Adler.

  • fast/css/pseudo-cache-stale.html: Added.
  • platform/mac/fast/css/pseudo-cache-stale-expected.checksum: Added.
  • platform/mac/fast/css/pseudo-cache-stale-expected.png: Added.
  • platform/mac/fast/css/pseudo-cache-stale-expected.txt: Added.
Location:
trunk
Files:
4 added
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r45611 r45612  
     12009-07-07  Dan Bernstein  <mitz@apple.com>
     2
     3        Reviewed by Dave Hyatt and Darin Adler.
     4
     5        - test for https://bugs.webkit.org/show_bug.cgi?id=26963
     6          <rdar://problem/7030998> Reproducible crash at
     7          FontCache::getFontData() when a custom font is used in a pseudo-style
     8
     9        * fast/css/pseudo-cache-stale.html: Added.
     10        * platform/mac/fast/css/pseudo-cache-stale-expected.checksum: Added.
     11        * platform/mac/fast/css/pseudo-cache-stale-expected.png: Added.
     12        * platform/mac/fast/css/pseudo-cache-stale-expected.txt: Added.
     13
    1142009-07-07  Dirk Pranke  <dpranke@chromium.org>
    215
  • trunk/WebCore/ChangeLog

    r45608 r45612  
     12009-07-07  Dan Bernstein  <mitz@apple.com>
     2
     3        Reviewed by Dave Hyatt and Darin Adler.
     4
     5        - fix https://bugs.webkit.org/show_bug.cgi?id=26963
     6          <rdar://problem/7030998> Reproducible crash at
     7          FontCache::getFontData() when a custom font is used in a pseudo-style
     8
     9        Test: fast/css/pseudo-cache-stale.html
     10
     11        * dom/Element.cpp:
     12        (WebCore::Element::pseudoStyleCacheIsInvalid): Added. Given the old
     13        style and the new style, goes over cached pseudo-styles in the old
     14        style and re-resolves the same style types off the new style. If any of
     15        the new pseudo-styles is different from the currently cached
     16        corresponding style, returns true. Otherwise, returns false.
     17        (WebCore::Element::recalcStyle): Validate the pseudo-style cache before
     18        deciding to keep the existing style.
     19        * dom/Element.h:
     20        * rendering/RenderObject.cpp:
     21        (WebCore::RenderObject::uncachedFirstLineStyle): Added this version that
     22        returns an uncached first-line style based off the given style.
     23        (WebCore::RenderObject::getUncachedPseudoStyle): Added the 'ownStyle'
     24        parameter.
     25        * rendering/RenderObject.h:
     26        * rendering/style/RenderStyle.cpp:
     27        (WebCore::RenderStyle::getPseudoStyleCache): Added. Returns the cached
     28        pseudo-styles in the passed-in vector.
     29        * rendering/style/RenderStyle.h:
     30
    1312009-07-07  Dan Bernstein  <mitz@apple.com>
    232
  • trunk/WebCore/dom/Element.cpp

    r44966 r45612  
    762762}
    763763
     764bool Element::pseudoStyleCacheIsInvalid(const RenderStyle* currentStyle, RenderStyle* newStyle)
     765{
     766    ASSERT(currentStyle = renderStyle());
     767
     768    if (!renderer() || !currentStyle)
     769        return false;
     770
     771    RenderStyle::PseudoStyleCache pseudoStyleCache;
     772    currentStyle->getPseudoStyleCache(pseudoStyleCache);
     773    size_t cacheSize = pseudoStyleCache.size();
     774    for (size_t i = 0; i < cacheSize; ++i) {
     775        RefPtr<RenderStyle> newPseudoStyle;
     776        PseudoId pseudoId = pseudoStyleCache[i]->styleType();
     777        if (pseudoId == FIRST_LINE || pseudoId == FIRST_LINE_INHERITED)
     778            newPseudoStyle = renderer()->uncachedFirstLineStyle(newStyle);
     779        else
     780            newPseudoStyle = renderer()->getUncachedPseudoStyle(pseudoId, newStyle, newStyle);
     781
     782        if (*newPseudoStyle != *pseudoStyleCache[i]) {
     783            if (pseudoId < FIRST_INTERNAL_PSEUDOID)
     784                newStyle->setHasPseudoStyle(pseudoId);
     785            newStyle->addCachedPseudoStyle(newPseudoStyle);
     786            return true;
     787        }
     788    }
     789    return false;
     790}
     791
    764792void Element::recalcStyle(StyleChange change)
    765793{
     
    812840        }
    813841
    814         if (ch != NoChange) {
     842        if (ch != NoChange || pseudoStyleCacheIsInvalid(currentStyle, newStyle.get())) {
    815843            setRenderStyle(newStyle);
    816844        } else if (needsStyleRecalc() && (styleChangeType() != AnimationStyleChange) && (document()->usesSiblingRules() || document()->usesDescendantRules())) {
  • trunk/WebCore/dom/Element.h

    r44966 r45612  
    171171#endif
    172172
     173    bool pseudoStyleCacheIsInvalid(const RenderStyle* currentStyle, RenderStyle* newStyle);
     174
    173175    String innerText() const;
    174176    String outerText() const;
  • trunk/WebCore/rendering/RenderObject.cpp

    r45245 r45612  
    19811981}
    19821982
     1983PassRefPtr<RenderStyle> RenderObject::uncachedFirstLineStyle(RenderStyle* style) const
     1984{
     1985    if (!document()->usesFirstLineRules())
     1986        return 0;
     1987
     1988    ASSERT(!isText());
     1989
     1990    RefPtr<RenderStyle> result;
     1991
     1992    if (isBlockFlow()) {
     1993        if (RenderBlock* firstLineBlock = this->firstLineBlock())
     1994            result = firstLineBlock->getUncachedPseudoStyle(FIRST_LINE, style, firstLineBlock == this ? style : 0);
     1995    } else if (!isAnonymous() && isRenderInline()) {
     1996        RenderStyle* parentStyle = parent()->firstLineStyle();
     1997        if (parentStyle != parent()->style())
     1998            result = getUncachedPseudoStyle(FIRST_LINE_INHERITED, parentStyle, style);
     1999    }
     2000
     2001    return result.release();
     2002}
     2003
    19832004RenderStyle* RenderObject::firstLineStyleSlowCase() const
    19842005{
     
    20172038}
    20182039
    2019 PassRefPtr<RenderStyle> RenderObject::getUncachedPseudoStyle(PseudoId pseudo, RenderStyle* parentStyle) const
    2020 {
    2021     if (pseudo < FIRST_INTERNAL_PSEUDOID && !style()->hasPseudoStyle(pseudo))
     2040PassRefPtr<RenderStyle> RenderObject::getUncachedPseudoStyle(PseudoId pseudo, RenderStyle* parentStyle, RenderStyle* ownStyle) const
     2041{
     2042    if (pseudo < FIRST_INTERNAL_PSEUDOID && !ownStyle && !style()->hasPseudoStyle(pseudo))
    20222043        return 0;
    20232044   
    2024     if (!parentStyle)
     2045    if (!parentStyle) {
     2046        ASSERT(!ownStyle);
    20252047        parentStyle = style();
     2048    }
    20262049
    20272050    Node* n = node();
  • trunk/WebCore/rendering/RenderObject.h

    r45199 r45612  
    383383    // any pseudo classes (and therefore has no concept of changing state).
    384384    RenderStyle* getCachedPseudoStyle(PseudoId, RenderStyle* parentStyle = 0) const;
    385     PassRefPtr<RenderStyle> getUncachedPseudoStyle(PseudoId, RenderStyle* parentStyle = 0) const;
     385    PassRefPtr<RenderStyle> getUncachedPseudoStyle(PseudoId, RenderStyle* parentStyle = 0, RenderStyle* ownStyle = 0) const;
    386386   
    387387    virtual void updateDragState(bool dragOn);
     
    554554    RenderStyle* firstLineStyle() const { return document()->usesFirstLineRules() ? firstLineStyleSlowCase() : style(); }
    555555    RenderStyle* style(bool firstLine) const { return firstLine ? firstLineStyle() : style(); }
    556    
     556
     557    // Used only by Element::pseudoStyleCacheIsInvalid to get a first line style based off of a
     558    // given new style, without accessing the cache.
     559    PassRefPtr<RenderStyle> uncachedFirstLineStyle(RenderStyle*) const;
     560
    557561    // Anonymous blocks that are part of of a continuation chain will return their inline continuation's outline style instead.
    558562    // This is typically only relevant when repainting.
  • trunk/WebCore/rendering/style/RenderStyle.cpp

    r44671 r45612  
    224224    m_cachedPseudoStyle = pseudo;
    225225    return m_cachedPseudoStyle.get();
     226}
     227
     228void RenderStyle::getPseudoStyleCache(PseudoStyleCache& cache) const
     229{
     230    ASSERT(cache.isEmpty());
     231    for (RenderStyle* pseudoStyle = m_cachedPseudoStyle.get(); pseudoStyle; pseudoStyle = pseudoStyle->m_cachedPseudoStyle.get())
     232        cache.append(pseudoStyle);
    226233}
    227234
  • trunk/WebCore/rendering/style/RenderStyle.h

    r44673 r45612  
    307307    RenderStyle* getCachedPseudoStyle(PseudoId) const;
    308308    RenderStyle* addCachedPseudoStyle(PassRefPtr<RenderStyle>);
     309
     310    typedef Vector<RenderStyle*, 10> PseudoStyleCache;
     311    void getPseudoStyleCache(PseudoStyleCache&) const;
    309312
    310313    bool affectedByHoverRules() const { return noninherited_flags._affectedByHover; }
Note: See TracChangeset for help on using the changeset viewer.