Move StyleResolver ownership from Document/ShadowRoot to Style::Scope
https://bugs.webkit.org/show_bug.cgi?id=163148
Reviewed by Andreas Kling.
Reduce duplication between Document and ShadowRoot.
* css/CSSComputedStyleDeclaration.cpp:
(WebCore::ComputedStyleExtractor::propertyValue):
* css/CSSStyleSheet.cpp:
(WebCore::CSSStyleSheet::didMutateRules):
* css/ElementRuleCollector.cpp:
(WebCore::ElementRuleCollector::matchHostPseudoClassRules):
(WebCore::ElementRuleCollector::matchSlottedPseudoElementRules):
* css/MediaQueryMatcher.cpp:
(WebCore::MediaQueryMatcher::documentElementUserAgentStyle):
* css/StyleMedia.cpp:
(WebCore::StyleMedia::matchMedium):
* css/parser/SizesAttributeParser.cpp:
(WebCore::SizesAttributeParser::mediaConditionMatches):
* dom/Document.cpp:
(WebCore::Document::~Document):
(WebCore::Document::childrenChanged):
(WebCore::Document::isPageBoxVisible):
(WebCore::Document::pageSizeAndMarginsInPixels):
(WebCore::Document::userAgentShadowTreeStyleResolver):
(WebCore::Document::fontsNeedUpdate):
(WebCore::Document::didClearStyleResolver):
(WebCore::Document::updateViewportUnitsOnResize):
(WebCore::Document::createStyleResolver): Deleted.
(WebCore::Document::clearStyleResolver): Deleted.
* dom/Document.h:
(WebCore::Document::styleResolverIfExists): Deleted.
(WebCore::Document::ensureStyleResolver): Deleted.
* dom/Element.cpp:
(WebCore::Element::styleResolver):
* dom/ShadowRoot.cpp:
(WebCore::ShadowRoot::styleResolver): Deleted.
(WebCore::ShadowRoot::styleResolverIfExists): Deleted.
(WebCore::ShadowRoot::resetStyleResolver): Deleted.
* dom/ShadowRoot.h:
* page/DOMWindow.cpp:
(WebCore::DOMWindow::getMatchedCSSRules):
* page/FrameView.cpp:
(WebCore::FrameView::layout):
* page/Page.cpp:
(WebCore::Page::updateStyleForAllPagesAfterGlobalChangeInEnvironment):
* page/PrintContext.cpp:
(WebCore::PrintContext::pageProperty):
* platform/MemoryPressureHandler.cpp:
(WebCore::MemoryPressureHandler::releaseCriticalMemory):
* style/AttributeChangeInvalidation.cpp:
(WebCore::Style::mayBeAffectedByHostStyle):
* style/ClassChangeInvalidation.cpp:
(WebCore::Style::mayBeAffectedByHostStyle):
* style/IdChangeInvalidation.cpp:
(WebCore::Style::mayBeAffectedByHostStyle):
* style/StyleScope.cpp:
(WebCore::Style::Scope::resolver):
(WebCore::Style::Scope::resolverIfExists):
(WebCore::Style::Scope::clearResolver):
(WebCore::Style::Scope::analyzeStyleSheetChange):
(WebCore::Style::Scope::updateActiveStyleSheets):
(WebCore::Style::Scope::updateStyleResolver):
(WebCore::Style::Scope::styleResolver): Deleted.
(WebCore::Style::Scope::styleResolverIfExists): Deleted.
* style/StyleScope.h:
* style/StyleSharingResolver.cpp:
(WebCore::Style::SharingResolver::resolve):
(WebCore::Style::SharingResolver::canShareStyleWithElement):
* style/StyleTreeResolver.cpp:
(WebCore::Style::TreeResolver::Scope::Scope):
(WebCore::Style::TreeResolver::resolve):
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@206951 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/style/StyleScope.cpp b/Source/WebCore/style/StyleScope.cpp
index d1ed51c..a5c7715 100644
--- a/Source/WebCore/style/StyleScope.cpp
+++ b/Source/WebCore/style/StyleScope.cpp
@@ -71,20 +71,32 @@
{
}
-StyleResolver& Scope::styleResolver()
+StyleResolver& Scope::resolver()
{
- if (m_shadowRoot)
- return m_shadowRoot->styleResolver();
+ if (m_shadowRoot && m_shadowRoot->mode() == ShadowRoot::Mode::UserAgent)
+ return m_document.userAgentShadowTreeStyleResolver();
- return m_document.ensureStyleResolver();
+ if (!m_resolver) {
+ m_resolver = std::make_unique<StyleResolver>(m_document);
+ m_resolver->appendAuthorStyleSheets(m_activeStyleSheets);
+ }
+ return *m_resolver;
}
-StyleResolver* Scope::styleResolverIfExists()
+StyleResolver* Scope::resolverIfExists()
{
- if (m_shadowRoot)
- return m_shadowRoot->styleResolverIfExists();
+ if (m_shadowRoot && m_shadowRoot->mode() == ShadowRoot::Mode::UserAgent)
+ return &m_document.userAgentShadowTreeStyleResolver();
- return m_document.styleResolverIfExists();
+ return m_resolver.get();
+}
+
+void Scope::clearResolver()
+{
+ m_resolver = nullptr;
+
+ if (!m_shadowRoot)
+ m_document.didClearStyleResolver();
}
Scope& Scope::forNode(Node& node)
@@ -118,7 +130,8 @@
}
if (m_shadowRoot) {
- m_shadowRoot->updateStyle();
+ // FIXME: Make optimized updates work.
+ didChangeContentsOrInterpretation();
return;
}
@@ -248,10 +261,10 @@
unsigned newStylesheetCount = newStylesheets.size();
- if (!styleResolverIfExists())
+ if (!resolverIfExists())
return Reconstruct;
- StyleResolver& styleResolver = *styleResolverIfExists();
+ auto& styleResolver = *resolverIfExists();
// Find out which stylesheets are new.
unsigned oldStylesheetCount = m_activeStyleSheets.size();
@@ -323,14 +336,14 @@
}
if (!m_document.hasLivingRenderTree()) {
- m_document.clearStyleResolver();
+ clearResolver();
return;
}
// Don't bother updating, since we haven't loaded all our style info yet
// and haven't calculated the style resolver for the first time.
if (!m_shadowRoot && !m_didUpdateActiveStyleSheets && m_pendingStyleSheetCount) {
- m_document.clearStyleResolver();
+ clearResolver();
return;
}
@@ -378,13 +391,10 @@
void Scope::updateStyleResolver(Vector<RefPtr<CSSStyleSheet>>& activeStyleSheets, StyleResolverUpdateType updateType)
{
if (updateType == Reconstruct) {
- if (m_shadowRoot)
- m_shadowRoot->resetStyleResolver();
- else
- m_document.clearStyleResolver();
+ clearResolver();
return;
}
- auto& styleResolver = this->styleResolver();
+ auto& styleResolver = resolver();
if (updateType == Reset) {
styleResolver.ruleSets().resetAuthorStyle();