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();