Title: [160138] trunk/Source/WebCore
Revision
160138
Author
[email protected]
Date
2013-12-04 16:03:00 -0800 (Wed, 04 Dec 2013)

Log 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):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (160137 => 160138)


--- trunk/Source/WebCore/ChangeLog	2013-12-04 23:43:37 UTC (rev 160137)
+++ trunk/Source/WebCore/ChangeLog	2013-12-05 00:03:00 UTC (rev 160138)
@@ -1,3 +1,25 @@
+2013-12-04  Antti Koivisto  <[email protected]>
+
+        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):
+
 2013-12-04  Zoltan Horvath  <[email protected]>
 
         Move TrailingObjects class into its own h/cpp

Modified: trunk/Source/WebCore/dom/Element.cpp (160137 => 160138)


--- trunk/Source/WebCore/dom/Element.cpp	2013-12-04 23:43:37 UTC (rev 160137)
+++ trunk/Source/WebCore/dom/Element.cpp	2013-12-05 00:03:00 UTC (rev 160138)
@@ -2334,57 +2334,6 @@
     }
 }
 
-bool Element::updateExistingPseudoElement(PseudoElement* existingPseudoElement, Style::Change change)
-{
-    // PseudoElement styles hang off their parent element's style so if we needed
-    // a style recalc we should Force one on the pseudo.
-    Style::resolveTree(*existingPseudoElement, needsStyleRecalc() ? Style::Force : change);
-
-    // FIXME: This is silly.
-    // Wait until our parent is not displayed or pseudoElementRendererIsNeeded
-    // is false, otherwise we could continously create and destroy PseudoElements
-    // when RenderElement::isChildAllowed on our parent returns false for the
-    // PseudoElement's renderer for each style recalc.
-    return renderer() && pseudoElementRendererIsNeeded(existingPseudoElement->renderStyle());
-}
-
-PassRefPtr<PseudoElement> Element::createPseudoElementIfNeeded(PseudoId pseudoId)
-{
-    if (!document().styleSheetCollection().usesBeforeAfterRules())
-        return 0;
-    if (!renderer() || !renderer()->canHaveGeneratedChildren())
-        return 0;
-    if (isPseudoElement())
-        return 0;
-    if (!pseudoElementRendererIsNeeded(renderer()->getCachedPseudoStyle(pseudoId)))
-        return 0;
-    RefPtr<PseudoElement> pseudoElement = PseudoElement::create(*this, pseudoId);
-    Style::attachRenderTree(*pseudoElement);
-    return pseudoElement.release();
-}
-
-void Element::updateBeforePseudoElement(Style::Change change)
-{
-    if (PseudoElement* existingPseudoElement = beforePseudoElement()) {
-        if (!updateExistingPseudoElement(existingPseudoElement, change))
-            clearBeforePseudoElement();
-        return;
-    }
-    if (RefPtr<PseudoElement> pseudo = createPseudoElementIfNeeded(BEFORE))
-        setBeforePseudoElement(pseudo.release());
-}
-
-void Element::updateAfterPseudoElement(Style::Change change)
-{
-    if (PseudoElement* existingPseudoElement = afterPseudoElement()) {
-        if (!updateExistingPseudoElement(existingPseudoElement, change))
-            clearAfterPseudoElement();
-        return;
-    }
-    if (RefPtr<PseudoElement> pseudo = createPseudoElementIfNeeded(AFTER))
-        setAfterPseudoElement(pseudo.release());
-}
-
 PseudoElement* Element::beforePseudoElement() const
 {
     return hasRareData() ? elementRareData()->beforePseudoElement() : 0;

Modified: trunk/Source/WebCore/dom/Element.h (160137 => 160138)


--- trunk/Source/WebCore/dom/Element.h	2013-12-04 23:43:37 UTC (rev 160137)
+++ trunk/Source/WebCore/dom/Element.h	2013-12-05 00:03:00 UTC (rev 160138)
@@ -551,8 +551,10 @@
     virtual void willDetachRenderers();
     virtual void didDetachRenderers();
 
-    void updateBeforePseudoElement(Style::Change);
-    void updateAfterPseudoElement(Style::Change);
+    void setBeforePseudoElement(PassRefPtr<PseudoElement>);
+    void setAfterPseudoElement(PassRefPtr<PseudoElement>);
+    void clearBeforePseudoElement();
+    void clearAfterPseudoElement();
     void resetComputedStyle();
     void clearStyleDerivedDataBeforeDetachingRenderer();
     void clearHoverAndActiveStatusBeforeDetachingRenderer();
@@ -590,13 +592,6 @@
     bool isUserActionElementFocused() const;
     bool isUserActionElementHovered() const;
 
-    PassRefPtr<PseudoElement> createPseudoElementIfNeeded(PseudoId);
-    bool updateExistingPseudoElement(PseudoElement* existing, Style::Change);
-
-    void setBeforePseudoElement(PassRefPtr<PseudoElement>);
-    void setAfterPseudoElement(PassRefPtr<PseudoElement>);
-    void clearBeforePseudoElement();
-    void clearAfterPseudoElement();
     void resetNeedsNodeRenderingTraversalSlowPath();
 
     virtual bool areAuthorShadowsAllowed() const { return true; }

Modified: trunk/Source/WebCore/style/StyleResolveTree.cpp (160137 => 160138)


--- trunk/Source/WebCore/style/StyleResolveTree.cpp	2013-12-04 23:43:37 UTC (rev 160137)
+++ trunk/Source/WebCore/style/StyleResolveTree.cpp	2013-12-05 00:03:00 UTC (rev 160138)
@@ -467,6 +467,56 @@
     shadowRoot.setAttached(true);
 }
 
+static PseudoElement* beforeOrAfterPseudoElement(Element& current, PseudoId pseudoId)
+{
+    ASSERT(pseudoId == BEFORE || pseudoId == AFTER);
+    if (pseudoId == BEFORE)
+        return current.beforePseudoElement();
+    return current.afterPseudoElement();
+}
+
+static void setBeforeOrAfterPseudoElement(Element& current, PassRefPtr<PseudoElement> pseudoElement, PseudoId pseudoId)
+{
+    ASSERT(pseudoId == BEFORE || pseudoId == AFTER);
+    if (pseudoId == BEFORE) {
+        current.setBeforePseudoElement(pseudoElement);
+        return;
+    }
+    current.setAfterPseudoElement(pseudoElement);
+}
+
+static void clearBeforeOrAfterPseudoElement(Element& current, PseudoId pseudoId)
+{
+    ASSERT(pseudoId == BEFORE || pseudoId == AFTER);
+    if (pseudoId == BEFORE) {
+        current.clearBeforePseudoElement();
+        return;
+    }
+    current.clearAfterPseudoElement();
+}
+
+static bool needsPseudeElement(Element& current, PseudoId pseudoId)
+{
+    if (!current.document().styleSheetCollection().usesBeforeAfterRules())
+        return false;
+    if (!current.renderer() || !current.renderer()->canHaveGeneratedChildren())
+        return false;
+    if (current.isPseudoElement())
+        return false;
+    if (!pseudoElementRendererIsNeeded(current.renderer()->getCachedPseudoStyle(pseudoId)))
+        return false;
+    return true;
+}
+
+static void attachBeforeOrAfterPseudoElementIfNeeded(Element& current, PseudoId pseudoId)
+{
+    if (!needsPseudeElement(current, pseudoId))
+        return;
+    RefPtr<PseudoElement> pseudoElement = PseudoElement::create(current, pseudoId);
+    setBeforeOrAfterPseudoElement(current, pseudoElement, pseudoId);
+    attachRenderTree(*pseudoElement, nullptr);
+}
+
 static void attachRenderTree(Element& current, PassRefPtr<RenderStyle> resolvedStyle)
 {
     PostAttachCallbackDisabler callbackDisabler(current);
@@ -480,7 +530,7 @@
     if (current.parentElement() && current.parentElement()->isInCanvasSubtree())
         current.setIsInCanvasSubtree(true);
 
-    current.updateBeforePseudoElement(NoChange);
+    attachBeforeOrAfterPseudoElementIfNeeded(current, BEFORE);
 
     StyleResolverParentPusher parentPusher(&current);
 
@@ -499,7 +549,7 @@
     if (AXObjectCache* cache = current.document().axObjectCache())
         cache->updateCacheAfterNodeIsAttached(&current);
 
-    current.updateAfterPseudoElement(NoChange);
+    attachBeforeOrAfterPseudoElementIfNeeded(current, AFTER);
 
     current.updateFocusAppearanceAfterAttachIfNeeded();
     
@@ -674,6 +724,18 @@
     shadowRoot->clearChildNeedsStyleRecalc();
 }
 
+static void updateBeforeOrAfterPseudoElement(Element& current, Change change, PseudoId pseudoId)
+{
+    if (PseudoElement* existingPseudoElement = beforeOrAfterPseudoElement(current, pseudoId)) {
+        if (needsPseudeElement(current, pseudoId))
+            resolveTree(*existingPseudoElement, current.needsStyleRecalc() ? Force : change);
+        else
+            clearBeforeOrAfterPseudoElement(current, pseudoId);
+        return;
+    }
+    attachBeforeOrAfterPseudoElementIfNeeded(current, pseudoId);
+}
+
 #if PLATFORM(IOS)
 static EVisibility elementImplicitVisibility(const Element* element)
 {
@@ -762,7 +824,7 @@
             }
         }
 
-        current.updateBeforePseudoElement(change);
+        updateBeforeOrAfterPseudoElement(current, change, BEFORE);
 
         // FIXME: This check is good enough for :hover + foo, but it is not good enough for :hover + foo + bar.
         // For now we will just worry about the common case, since it's a lot trickier to get the second case right
@@ -788,7 +850,7 @@
             forceCheckOfAnyElementSibling = forceCheckOfAnyElementSibling || (childRulesChanged && hasIndirectAdjacentRules);
         }
 
-        current.updateAfterPseudoElement(change);
+        updateBeforeOrAfterPseudoElement(current, change, AFTER);
     }
 
     current.clearNeedsStyleRecalc();
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to