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

Unified Diff: Source/core/dom/Element.cpp

Issue 102273004: Defer pushing the parent stack in recalcStyle until StyleResolver::styleForElement() (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase Created 6 years, 9 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/css/resolver/StyleResolverParentScope.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/dom/Element.cpp
diff --git a/Source/core/dom/Element.cpp b/Source/core/dom/Element.cpp
index 68c87a18275342fe1464c92f6f428ecc478f7b12..6603f42fd0700ea5c6fe48be28e9464b15a89ea1 100644
--- a/Source/core/dom/Element.cpp
+++ b/Source/core/dom/Element.cpp
@@ -43,6 +43,7 @@
#include "core/css/StylePropertySet.h"
#include "core/css/parser/BisonCSSParser.h"
#include "core/css/resolver/StyleResolver.h"
+#include "core/css/resolver/StyleResolverParentScope.h"
#include "core/dom/Attr.h"
#include "core/dom/CSSSelectorWatch.h"
#include "core/dom/ClientRect.h"
@@ -110,41 +111,6 @@ namespace WebCore {
using namespace HTMLNames;
using namespace XMLNames;
-class StyleResolverParentPusher {
- STACK_ALLOCATED();
-public:
- explicit StyleResolverParentPusher(Element& parent)
- : m_parent(parent)
- , m_pushedStyleResolver(nullptr)
- {
- }
- void push()
- {
- if (m_pushedStyleResolver)
- return;
- m_pushedStyleResolver = &m_parent.document().ensureStyleResolver();
- m_pushedStyleResolver->pushParentElement(m_parent);
- }
- ~StyleResolverParentPusher()
- {
-
- if (!m_pushedStyleResolver)
- return;
-
- // This tells us that our pushed style selector is in a bad state,
- // so we should just bail out in that scenario.
- ASSERT(m_pushedStyleResolver == m_parent.document().styleResolver());
- if (m_pushedStyleResolver != m_parent.document().styleResolver())
- return;
-
- m_pushedStyleResolver->popParentElement(m_parent);
- }
-
-private:
- Element& m_parent;
- RawPtrWillBeMember<StyleResolver> m_pushedStyleResolver;
-};
-
typedef Vector<RefPtr<Attr> > AttrNodeList;
typedef HashMap<Element*, OwnPtr<AttrNodeList> > AttrNodeListMap;
@@ -1414,8 +1380,6 @@ void Element::attach(const AttachContext& context)
{
ASSERT(document().inStyleRecalc());
- StyleResolverParentPusher parentPusher(*this);
-
// We've already been through detach when doing an attach, but we might
// need to clear any state that's been added since then.
if (hasRareData() && styleChangeType() == NeedsReattachStyleChange) {
@@ -1431,15 +1395,13 @@ void Element::attach(const AttachContext& context)
addCallbackSelectors();
+ StyleResolverParentScope parentScope(*this);
+
createPseudoElementIfNeeded(BEFORE);
// When a shadow root exists, it does the work of attaching the children.
- if (ElementShadow* shadow = this->shadow()) {
- parentPusher.push();
+ if (ElementShadow* shadow = this->shadow())
shadow->attach(context);
- } else if (firstChild()) {
- parentPusher.push();
- }
ContainerNode::attach(context);
@@ -1667,19 +1629,17 @@ void Element::recalcChildStyle(StyleRecalcChange change)
ASSERT(change >= UpdatePseudoElements || childNeedsStyleRecalc());
ASSERT(!needsStyleRecalc());
- StyleResolverParentPusher parentPusher(*this);
+ StyleResolverParentScope parentScope(*this);
+
+ updatePseudoElement(BEFORE, change);
if (change > UpdatePseudoElements || childNeedsStyleRecalc()) {
for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadowRoot()) {
- if (root->shouldCallRecalcStyle(change)) {
- parentPusher.push();
+ if (root->shouldCallRecalcStyle(change))
root->recalcStyle(change);
- }
}
}
- updatePseudoElement(BEFORE, change);
-
if (change < Force && hasRareData() && childNeedsStyleRecalc())
checkForChildrenAdjacentRuleChanges();
@@ -1696,12 +1656,10 @@ void Element::recalcChildStyle(StyleRecalcChange change)
lastTextNode = toText(child);
} else if (child->isElementNode()) {
Element* element = toElement(child);
- if (element->shouldCallRecalcStyle(change)) {
- parentPusher.push();
+ if (element->shouldCallRecalcStyle(change))
element->recalcStyle(change, lastTextNode);
- } else if (element->supportsStyleSharing()) {
+ else if (element->supportsStyleSharing())
styleResolver.addToStyleSharingList(*element);
- }
if (element->renderer())
lastTextNode = 0;
}
« no previous file with comments | « Source/core/css/resolver/StyleResolverParentScope.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698