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(¤t);
@@ -499,7 +549,7 @@
if (AXObjectCache* cache = current.document().axObjectCache())
cache->updateCacheAfterNodeIsAttached(¤t);
- 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();