Index: Source/core/css/resolver/StyleResolver.cpp |
diff --git a/Source/core/css/resolver/StyleResolver.cpp b/Source/core/css/resolver/StyleResolver.cpp |
index 0119889f3c3ee12d64e40c84c0fa137036cc9228..cefc546cb48593a42fe93f8aa995a561749047f2 100644 |
--- a/Source/core/css/resolver/StyleResolver.cpp |
+++ b/Source/core/css/resolver/StyleResolver.cpp |
@@ -241,6 +241,60 @@ void StyleResolver::collectFeatures() |
m_uncommonAttributeRuleSet = makeRuleSet(m_features.uncommonAttributeRules); |
} |
+bool StyleResolver::supportsStyleSharing(Element* element) |
+{ |
+ if (!element || !element->isStyledElement() || !element->parentElement()) |
+ return false; |
+ |
+ // If the element has inline style it is probably unique. |
+ if (element->inlineStyle()) |
+ return false; |
+ if (element->isSVGElement() && toSVGElement(element)->animatedSMILStyleProperties()) |
+ return false; |
+ // Ids stop style sharing if they show up in the stylesheets. |
+ if (element->hasID() && m_features.idsInRules.contains(element->idForStyleResolution().impl())) |
+ return false; |
+ // Active and hovered elements always make a chain towards the document node |
+ // and no siblings or cousins will have the same state. |
+ if (element->hovered()) |
+ return false; |
+ if (element->active()) |
+ return false; |
+ // There is always only one focused element. |
+ if (element->focused()) |
+ return false; |
+ if (element->parentElement()->hasFlagsSetDuringStylingOfChildren()) |
+ return false; |
+ if (element->hasScopedHTMLStyleChild()) |
+ return false; |
+ if (element == m_document.cssTarget()) |
+ return false; |
+ if (element->isHTMLElement() && toHTMLElement(element)->hasDirectionAuto()) |
+ return false; |
+ if (element->hasActiveAnimations()) |
+ return false; |
+ // When a dialog is first shown, its style is mutated to center it in the |
+ // viewport. So the styles can't be shared since the viewport position and |
+ // size may be different each time a dialog is opened. |
+ if (element->hasTagName(dialogTag)) |
+ return false; |
+ if (isShadowHost(element) && element->shadow()->containsActiveStyles()) |
+ return false; |
+ return true; |
+} |
+ |
+void StyleResolver::addToStyleSharingList(Element* element) |
+{ |
+ if (m_styleSharingList.size() >= styleSharingListSize) |
+ m_styleSharingList.remove(--m_styleSharingList.end()); |
+ m_styleSharingList.prepend(element); |
+} |
+ |
+void StyleResolver::clearStyleSharingList() |
+{ |
+ m_styleSharingList.clear(); |
+} |
+ |
void StyleResolver::pushParentElement(Element* parent) |
{ |
ASSERT(parent); |