⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 160138 in webkit


Ignore:
Timestamp:
Dec 4, 2013, 4:03:00 PM (13 years ago)
Author:
Antti Koivisto
Message:

Move pseudo element construction out from Element
https://bugs.webkit.org/show_bug.cgi?id=125257

Reviewed by Anders Carlsson.

This is logically part of the style resolve/render tree construction. This will make future
refactoring easier.

  • dom/Element.cpp:
  • dom/Element.h:
  • style/StyleResolveTree.cpp:

(WebCore::Style::beforeOrAfterPseudoElement):
(WebCore::Style::setBeforeOrAfterPseudoElement):
(WebCore::Style::clearBeforeOrAfterPseudoElement):
(WebCore::Style::needsPseudeElement):
(WebCore::Style::attachBeforeOrAfterPseudoElementIfNeeded):
(WebCore::Style::attachRenderTree):
(WebCore::Style::updateBeforeOrAfterPseudoElement):
(WebCore::Style::resolveTree):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r160135 r160138  
     12013-12-04  Antti Koivisto  <antti@apple.com>
     2
     3        Move pseudo element construction out from Element
     4        https://bugs.webkit.org/show_bug.cgi?id=125257
     5
     6        Reviewed by Anders Carlsson.
     7
     8        This is logically part of the style resolve/render tree construction. This will make future
     9        refactoring easier.
     10
     11        * dom/Element.cpp:
     12        * dom/Element.h:
     13        * style/StyleResolveTree.cpp:
     14        (WebCore::Style::beforeOrAfterPseudoElement):
     15        (WebCore::Style::setBeforeOrAfterPseudoElement):
     16        (WebCore::Style::clearBeforeOrAfterPseudoElement):
     17        (WebCore::Style::needsPseudeElement):
     18        (WebCore::Style::attachBeforeOrAfterPseudoElementIfNeeded):
     19        (WebCore::Style::attachRenderTree):
     20        (WebCore::Style::updateBeforeOrAfterPseudoElement):
     21        (WebCore::Style::resolveTree):
     22
    1232013-12-04  Zoltan Horvath  <zoltan@webkit.org>
    224
  • trunk/Source/WebCore/dom/Element.cpp

    r160032 r160138  
    23352335}
    23362336
    2337 bool Element::updateExistingPseudoElement(PseudoElement* existingPseudoElement, Style::Change change)
    2338 {
    2339     // PseudoElement styles hang off their parent element's style so if we needed
    2340     // a style recalc we should Force one on the pseudo.
    2341     Style::resolveTree(*existingPseudoElement, needsStyleRecalc() ? Style::Force : change);
    2342 
    2343     // FIXME: This is silly.
    2344     // Wait until our parent is not displayed or pseudoElementRendererIsNeeded
    2345     // is false, otherwise we could continously create and destroy PseudoElements
    2346     // when RenderElement::isChildAllowed on our parent returns false for the
    2347     // PseudoElement's renderer for each style recalc.
    2348     return renderer() && pseudoElementRendererIsNeeded(existingPseudoElement->renderStyle());
    2349 }
    2350 
    2351 PassRefPtr<PseudoElement> Element::createPseudoElementIfNeeded(PseudoId pseudoId)
    2352 {
    2353     if (!document().styleSheetCollection().usesBeforeAfterRules())
    2354         return 0;
    2355     if (!renderer() || !renderer()->canHaveGeneratedChildren())
    2356         return 0;
    2357     if (isPseudoElement())
    2358         return 0;
    2359     if (!pseudoElementRendererIsNeeded(renderer()->getCachedPseudoStyle(pseudoId)))
    2360         return 0;
    2361     RefPtr<PseudoElement> pseudoElement = PseudoElement::create(*this, pseudoId);
    2362     Style::attachRenderTree(*pseudoElement);
    2363     return pseudoElement.release();
    2364 }
    2365 
    2366 void Element::updateBeforePseudoElement(Style::Change change)
    2367 {
    2368     if (PseudoElement* existingPseudoElement = beforePseudoElement()) {
    2369         if (!updateExistingPseudoElement(existingPseudoElement, change))
    2370             clearBeforePseudoElement();
    2371         return;
    2372     }
    2373     if (RefPtr<PseudoElement> pseudo = createPseudoElementIfNeeded(BEFORE))
    2374         setBeforePseudoElement(pseudo.release());
    2375 }
    2376 
    2377 void Element::updateAfterPseudoElement(Style::Change change)
    2378 {
    2379     if (PseudoElement* existingPseudoElement = afterPseudoElement()) {
    2380         if (!updateExistingPseudoElement(existingPseudoElement, change))
    2381             clearAfterPseudoElement();
    2382         return;
    2383     }
    2384     if (RefPtr<PseudoElement> pseudo = createPseudoElementIfNeeded(AFTER))
    2385         setAfterPseudoElement(pseudo.release());
    2386 }
    2387 
    23882337PseudoElement* Element::beforePseudoElement() const
    23892338{
  • trunk/Source/WebCore/dom/Element.h

    r160032 r160138  
    552552    virtual void didDetachRenderers();
    553553
    554     void updateBeforePseudoElement(Style::Change);
    555     void updateAfterPseudoElement(Style::Change);
     554    void setBeforePseudoElement(PassRefPtr<PseudoElement>);
     555    void setAfterPseudoElement(PassRefPtr<PseudoElement>);
     556    void clearBeforePseudoElement();
     557    void clearAfterPseudoElement();
    556558    void resetComputedStyle();
    557559    void clearStyleDerivedDataBeforeDetachingRenderer();
     
    591593    bool isUserActionElementHovered() const;
    592594
    593     PassRefPtr<PseudoElement> createPseudoElementIfNeeded(PseudoId);
    594     bool updateExistingPseudoElement(PseudoElement* existing, Style::Change);
    595 
    596     void setBeforePseudoElement(PassRefPtr<PseudoElement>);
    597     void setAfterPseudoElement(PassRefPtr<PseudoElement>);
    598     void clearBeforePseudoElement();
    599     void clearAfterPseudoElement();
    600595    void resetNeedsNodeRenderingTraversalSlowPath();
    601596
  • trunk/Source/WebCore/style/StyleResolveTree.cpp

    r159036 r160138  
    468468}
    469469
     470static PseudoElement* beforeOrAfterPseudoElement(Element& current, PseudoId pseudoId)
     471{
     472    ASSERT(pseudoId == BEFORE || pseudoId == AFTER);
     473    if (pseudoId == BEFORE)
     474        return current.beforePseudoElement();
     475    return current.afterPseudoElement();
     476}
     477
     478static void setBeforeOrAfterPseudoElement(Element& current, PassRefPtr<PseudoElement> pseudoElement, PseudoId pseudoId)
     479{
     480    ASSERT(pseudoId == BEFORE || pseudoId == AFTER);
     481    if (pseudoId == BEFORE) {
     482        current.setBeforePseudoElement(pseudoElement);
     483        return;
     484    }
     485    current.setAfterPseudoElement(pseudoElement);
     486}
     487
     488static void clearBeforeOrAfterPseudoElement(Element& current, PseudoId pseudoId)
     489{
     490    ASSERT(pseudoId == BEFORE || pseudoId == AFTER);
     491    if (pseudoId == BEFORE) {
     492        current.clearBeforePseudoElement();
     493        return;
     494    }
     495    current.clearAfterPseudoElement();
     496}
     497
     498static bool needsPseudeElement(Element& current, PseudoId pseudoId)
     499{
     500    if (!current.document().styleSheetCollection().usesBeforeAfterRules())
     501        return false;
     502    if (!current.renderer() || !current.renderer()->canHaveGeneratedChildren())
     503        return false;
     504    if (current.isPseudoElement())
     505        return false;
     506    if (!pseudoElementRendererIsNeeded(current.renderer()->getCachedPseudoStyle(pseudoId)))
     507        return false;
     508    return true;
     509}
     510
     511static void attachBeforeOrAfterPseudoElementIfNeeded(Element& current, PseudoId pseudoId)
     512{
     513    if (!needsPseudeElement(current, pseudoId))
     514        return;
     515    RefPtr<PseudoElement> pseudoElement = PseudoElement::create(current, pseudoId);
     516    setBeforeOrAfterPseudoElement(current, pseudoElement, pseudoId);
     517    attachRenderTree(*pseudoElement, nullptr);
     518}
     519
    470520static void attachRenderTree(Element& current, PassRefPtr<RenderStyle> resolvedStyle)
    471521{
     
    481531        current.setIsInCanvasSubtree(true);
    482532
    483     current.updateBeforePseudoElement(NoChange);
     533    attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE);
    484534
    485535    StyleResolverParentPusher parentPusher(&current);
     
    500550        cache->updateCacheAfterNodeIsAttached(&current);
    501551
    502     current.updateAfterPseudoElement(NoChange);
     552    attachBeforeOrAfterPseudoElementIfNeeded(current, AFTER);
    503553
    504554    current.updateFocusAppearanceAfterAttachIfNeeded();
     
    675725}
    676726
     727static void updateBeforeOrAfterPseudoElement(Element& current, Change change, PseudoId pseudoId)
     728{
     729    if (PseudoElement* existingPseudoElement = beforeOrAfterPseudoElement(current, pseudoId)) {
     730        if (needsPseudeElement(current, pseudoId))
     731            resolveTree(*existingPseudoElement, current.needsStyleRecalc() ? Force : change);
     732        else
     733            clearBeforeOrAfterPseudoElement(current, pseudoId);
     734        return;
     735    }
     736    attachBeforeOrAfterPseudoElementIfNeeded(current, pseudoId);
     737}
     738
    677739#if PLATFORM(IOS)
    678740static EVisibility elementImplicitVisibility(const Element* element)
     
    763825        }
    764826
    765         current.updateBeforePseudoElement(change);
     827        updateBeforeOrAfterPseudoElement(current, change, BEFORE);
    766828
    767829        // FIXME: This check is good enough for :hover + foo, but it is not good enough for :hover + foo + bar.
     
    789851        }
    790852
    791         current.updateAfterPseudoElement(change);
     853        updateBeforeOrAfterPseudoElement(current, change, AFTER);
    792854    }
    793855
Note: See TracChangeset for help on using the changeset viewer.