Add version number for default stylesheet
authorantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 13 Feb 2016 22:45:34 +0000 (22:45 +0000)
committerantti@apple.com <antti@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 13 Feb 2016 22:45:34 +0000 (22:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=154220

Reviewed by Ryosuke Niwa.

We currently fail to update RuleFeatureSets for shadow trees when the default stylesheet grows
(for example when media controls stylesheet is initialized).

No test since this is not causing known bugs. It is blocking optimizations in shadow trees that
rely on rule features being up-to-date.

* css/CSSDefaultStyleSheets.cpp:
(WebCore::CSSDefaultStyleSheets::loadSimpleDefaultStyle):
(WebCore::CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement):

    Increment version number when the default stylesheet changes.

* css/CSSDefaultStyleSheets.h:
* css/DocumentRuleSets.cpp:
(WebCore::DocumentRuleSets::appendAuthorStyleSheets):
(WebCore::DocumentRuleSets::collectFeatures):

    Store the current default stylesheet version number.

* css/DocumentRuleSets.h:
(WebCore::DocumentRuleSets::features):

    Collect features again if the default stylesheet has changed.

* css/StyleResolver.cpp:
(WebCore::StyleResolver::styleForElement):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@196555 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/css/CSSDefaultStyleSheets.cpp
Source/WebCore/css/CSSDefaultStyleSheets.h
Source/WebCore/css/DocumentRuleSets.cpp
Source/WebCore/css/DocumentRuleSets.h
Source/WebCore/css/StyleResolver.cpp

index 84e4622..94f35f7 100644 (file)
@@ -1,3 +1,37 @@
+2016-02-13  Antti Koivisto  <antti@apple.com>
+
+        Add version number for default stylesheet
+        https://bugs.webkit.org/show_bug.cgi?id=154220
+
+        Reviewed by Ryosuke Niwa.
+
+        We currently fail to update RuleFeatureSets for shadow trees when the default stylesheet grows
+        (for example when media controls stylesheet is initialized).
+
+        No test since this is not causing known bugs. It is blocking optimizations in shadow trees that
+        rely on rule features being up-to-date.
+
+        * css/CSSDefaultStyleSheets.cpp:
+        (WebCore::CSSDefaultStyleSheets::loadSimpleDefaultStyle):
+        (WebCore::CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement):
+
+            Increment version number when the default stylesheet changes.
+
+        * css/CSSDefaultStyleSheets.h:
+        * css/DocumentRuleSets.cpp:
+        (WebCore::DocumentRuleSets::appendAuthorStyleSheets):
+        (WebCore::DocumentRuleSets::collectFeatures):
+
+            Store the current default stylesheet version number.
+
+        * css/DocumentRuleSets.h:
+        (WebCore::DocumentRuleSets::features):
+
+            Collect features again if the default stylesheet has changed.
+
+        * css/StyleResolver.cpp:
+        (WebCore::StyleResolver::styleForElement):
+
 2016-02-13  Konstantin Tokarev  <annulen@yandex.ru>
 
         [cmake] Consolidate building of GStreamer and OpenWebRTC code.
index 30c4f56..2e56ca1 100644 (file)
@@ -51,6 +51,7 @@ using namespace HTMLNames;
 RuleSet* CSSDefaultStyleSheets::defaultStyle;
 RuleSet* CSSDefaultStyleSheets::defaultQuirksStyle;
 RuleSet* CSSDefaultStyleSheets::defaultPrintStyle;
+unsigned CSSDefaultStyleSheets::defaultStyleVersion;
 
 StyleSheetContents* CSSDefaultStyleSheets::simpleDefaultStyleSheet;
 StyleSheetContents* CSSDefaultStyleSheets::defaultStyleSheet;
@@ -148,15 +149,15 @@ void CSSDefaultStyleSheets::loadSimpleDefaultStyle()
 
     simpleDefaultStyleSheet = parseUASheet(simpleUserAgentStyleSheet, strlen(simpleUserAgentStyleSheet));
     defaultStyle->addRulesFromSheet(*simpleDefaultStyleSheet, screenEval());
-
+    ++defaultStyleVersion;
     // No need to initialize quirks sheet yet as there are no quirk rules for elements allowed in simple default style.
 }
 
-void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element& element, bool& changedDefaultStyle)
+void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element& element)
 {
     if (simpleDefaultStyleSheet && !elementCanUseSimpleDefaultStyle(element)) {
         loadFullDefaultStyle();
-        changedDefaultStyle = true;
+        ++defaultStyleVersion;
     }
 
     if (is<HTMLElement>(element)) {
@@ -167,7 +168,7 @@ void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element& element,
                     plugInsRules = String(plugInsUserAgentStyleSheet, sizeof(plugInsUserAgentStyleSheet));
                 plugInsStyleSheet = parseUASheet(plugInsRules);
                 defaultStyle->addRulesFromSheet(*plugInsStyleSheet, screenEval());
-                changedDefaultStyle = true;
+                ++defaultStyleVersion;
             }
         }
 #if ENABLE(VIDEO)
@@ -179,7 +180,7 @@ void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element& element,
                 mediaControlsStyleSheet = parseUASheet(mediaRules);
                 defaultStyle->addRulesFromSheet(*mediaControlsStyleSheet, screenEval());
                 defaultPrintStyle->addRulesFromSheet(*mediaControlsStyleSheet, printEval());
-                changedDefaultStyle = true;
+                ++defaultStyleVersion;
             }
         }
 #endif // ENABLE(VIDEO)
@@ -190,7 +191,7 @@ void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element& element,
                 imageControlsStyleSheet = parseUASheet(imageControlsRules);
                 defaultStyle->addRulesFromSheet(*imageControlsStyleSheet, screenEval());
                 defaultPrintStyle->addRulesFromSheet(*imageControlsStyleSheet, printEval());
-                changedDefaultStyle = true;
+                ++defaultStyleVersion;
             }
         }
 #endif // ENABLE(SERVICE_CONTROLS)
@@ -200,7 +201,7 @@ void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element& element,
             svgStyleSheet = parseUASheet(svgUserAgentStyleSheet, sizeof(svgUserAgentStyleSheet));
             defaultStyle->addRulesFromSheet(*svgStyleSheet, screenEval());
             defaultPrintStyle->addRulesFromSheet(*svgStyleSheet, printEval());
-            changedDefaultStyle = true;
+            ++defaultStyleVersion;
         }
     }
 #if ENABLE(MATHML)
@@ -210,7 +211,7 @@ void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element& element,
             mathMLStyleSheet = parseUASheet(mathmlUserAgentStyleSheet, sizeof(mathmlUserAgentStyleSheet));
             defaultStyle->addRulesFromSheet(*mathMLStyleSheet, screenEval());
             defaultPrintStyle->addRulesFromSheet(*mathMLStyleSheet, printEval());
-            changedDefaultStyle = true;
+            ++defaultStyleVersion;
         }
     }
 #endif // ENABLE(MATHML)
@@ -221,7 +222,7 @@ void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element& element,
         fullscreenStyleSheet = parseUASheet(fullscreenRules);
         defaultStyle->addRulesFromSheet(*fullscreenStyleSheet, screenEval());
         defaultQuirksStyle->addRulesFromSheet(*fullscreenStyleSheet, screenEval());
-        changedDefaultStyle = true;
+        ++defaultStyleVersion;
     }
 #endif // ENABLE(FULLSCREEN_API)
 
index 793cc9a..413e665 100644 (file)
@@ -34,6 +34,7 @@ public:
     static RuleSet* defaultStyle;
     static RuleSet* defaultQuirksStyle;
     static RuleSet* defaultPrintStyle;
+    static unsigned defaultStyleVersion;
 
     static StyleSheetContents* simpleDefaultStyleSheet;
     static StyleSheetContents* defaultStyleSheet;
@@ -45,7 +46,7 @@ public:
     static StyleSheetContents* plugInsStyleSheet;
     static StyleSheetContents* imageControlsStyleSheet;
 
-    static void ensureDefaultStyleSheetsForElement(Element&, bool& changedDefaultStyle);
+    static void ensureDefaultStyleSheetsForElement(Element&);
     static void loadFullDefaultStyle();
     static void loadSimpleDefaultStyle();
     static void initDefaultStyle(Element*);
index af4fd4e..a2c63ff 100644 (file)
@@ -29,7 +29,6 @@
 #include "config.h"
 #include "DocumentRuleSets.h"
 
-#include "CSSDefaultStyleSheets.h"
 #include "CSSStyleSheet.h"
 #include "ExtensionStyleSheets.h"
 #include "MediaQueryEvaluator.h"
@@ -98,7 +97,7 @@ void DocumentRuleSets::appendAuthorStyleSheets(const Vector<RefPtr<CSSStyleSheet
     collectFeatures();
 }
 
-void DocumentRuleSets::collectFeatures()
+void DocumentRuleSets::collectFeatures() const
 {
     m_features.clear();
     // Collect all ids and rules using sibling selectors (:first-child and similar)
@@ -106,6 +105,8 @@ void DocumentRuleSets::collectFeatures()
     // sharing candidates.
     if (CSSDefaultStyleSheets::defaultStyle)
         m_features.add(CSSDefaultStyleSheets::defaultStyle->features());
+    m_defaultStyleVersionOnFeatureCollection = CSSDefaultStyleSheets::defaultStyleVersion;
+
     if (m_authorStyle)
         m_features.add(m_authorStyle->features());
     if (m_userStyle)
index a5461f7..acd15ca 100644 (file)
@@ -23,6 +23,7 @@
 #ifndef DocumentRuleSets_h
 #define DocumentRuleSets_h
 
+#include "CSSDefaultStyleSheets.h"
 #include "RuleFeature.h"
 #include "RuleSet.h"
 #include <memory>
@@ -46,7 +47,7 @@ public:
     RuleSet* authorStyle() const { return m_authorStyle.get(); }
     RuleSet* userStyle() const { return m_userStyle.get(); }
     RuleFeatureSet& features() { return m_features; }
-    const RuleFeatureSet& features() const { return m_features; }
+    const RuleFeatureSet& features() const;
     RuleSet* sibling() const { return m_siblingRuleSet.get(); }
     RuleSet* uncommonAttribute() const { return m_uncommonAttributeRuleSet.get(); }
     RuleSet* ancestorClassRules(AtomicStringImpl* className) const;
@@ -55,18 +56,27 @@ public:
     void resetAuthorStyle();
     void appendAuthorStyleSheets(const Vector<RefPtr<CSSStyleSheet>>&, MediaQueryEvaluator*, InspectorCSSOMWrappers&, StyleResolver*);
 
-    void collectFeatures();
-
 private:
+    void collectFeatures() const;
     void collectRulesFromUserStyleSheets(const Vector<RefPtr<CSSStyleSheet>>&, RuleSet& userStyle, const MediaQueryEvaluator&, StyleResolver&);
+
     std::unique_ptr<RuleSet> m_authorStyle;
     std::unique_ptr<RuleSet> m_userStyle;
-    RuleFeatureSet m_features;
-    std::unique_ptr<RuleSet> m_siblingRuleSet;
-    std::unique_ptr<RuleSet> m_uncommonAttributeRuleSet;
+
+    mutable RuleFeatureSet m_features;
+    mutable unsigned m_defaultStyleVersionOnFeatureCollection { 0 };
+    mutable std::unique_ptr<RuleSet> m_siblingRuleSet;
+    mutable std::unique_ptr<RuleSet> m_uncommonAttributeRuleSet;
     mutable HashMap<AtomicStringImpl*, std::unique_ptr<RuleSet>> m_ancestorClassRuleSet;
 };
 
+inline const RuleFeatureSet& DocumentRuleSets::features() const
+{
+    if (m_defaultStyleVersionOnFeatureCollection < CSSDefaultStyleSheets::defaultStyleVersion)
+        collectFeatures();
+    return m_features;
+}
+
 } // namespace WebCore
 
 #endif // DocumentRuleSets_h
index bdd7a4b..abce951 100644 (file)
@@ -392,10 +392,7 @@ Ref<RenderStyle> StyleResolver::styleForElement(Element& element, RenderStyle* p
         state.style()->setInsideLink(linkState);
     }
 
-    bool needsCollection = false;
-    CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(element, needsCollection);
-    if (needsCollection)
-        m_ruleSets.collectFeatures();
+    CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(element);
 
     ElementRuleCollector collector(element, state.style(), m_ruleSets, m_state.selectorFilter());
     collector.setRegionForStyling(regionForStyling);