<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[196555] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/196555">196555</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2016-02-13 14:45:34 -0800 (Sat, 13 Feb 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>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):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSDefaultStyleSheetscpp">trunk/Source/WebCore/css/CSSDefaultStyleSheets.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSDefaultStyleSheetsh">trunk/Source/WebCore/css/CSSDefaultStyleSheets.h</a></li>
<li><a href="#trunkSourceWebCorecssDocumentRuleSetscpp">trunk/Source/WebCore/css/DocumentRuleSets.cpp</a></li>
<li><a href="#trunkSourceWebCorecssDocumentRuleSetsh">trunk/Source/WebCore/css/DocumentRuleSets.h</a></li>
<li><a href="#trunkSourceWebCorecssStyleResolvercpp">trunk/Source/WebCore/css/StyleResolver.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (196554 => 196555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-02-13 22:39:52 UTC (rev 196554)
+++ trunk/Source/WebCore/ChangeLog        2016-02-13 22:45:34 UTC (rev 196555)
</span><span class="lines">@@ -1,3 +1,37 @@
</span><ins>+2016-02-13  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        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):
+
</ins><span class="cx"> 2016-02-13  Konstantin Tokarev  &lt;annulen@yandex.ru&gt;
</span><span class="cx"> 
</span><span class="cx">         [cmake] Consolidate building of GStreamer and OpenWebRTC code.
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSDefaultStyleSheetscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSDefaultStyleSheets.cpp (196554 => 196555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSDefaultStyleSheets.cpp        2016-02-13 22:39:52 UTC (rev 196554)
+++ trunk/Source/WebCore/css/CSSDefaultStyleSheets.cpp        2016-02-13 22:45:34 UTC (rev 196555)
</span><span class="lines">@@ -51,6 +51,7 @@
</span><span class="cx"> RuleSet* CSSDefaultStyleSheets::defaultStyle;
</span><span class="cx"> RuleSet* CSSDefaultStyleSheets::defaultQuirksStyle;
</span><span class="cx"> RuleSet* CSSDefaultStyleSheets::defaultPrintStyle;
</span><ins>+unsigned CSSDefaultStyleSheets::defaultStyleVersion;
</ins><span class="cx"> 
</span><span class="cx"> StyleSheetContents* CSSDefaultStyleSheets::simpleDefaultStyleSheet;
</span><span class="cx"> StyleSheetContents* CSSDefaultStyleSheets::defaultStyleSheet;
</span><span class="lines">@@ -148,15 +149,15 @@
</span><span class="cx"> 
</span><span class="cx">     simpleDefaultStyleSheet = parseUASheet(simpleUserAgentStyleSheet, strlen(simpleUserAgentStyleSheet));
</span><span class="cx">     defaultStyle-&gt;addRulesFromSheet(*simpleDefaultStyleSheet, screenEval());
</span><del>-
</del><ins>+    ++defaultStyleVersion;
</ins><span class="cx">     // No need to initialize quirks sheet yet as there are no quirk rules for elements allowed in simple default style.
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element&amp; element, bool&amp; changedDefaultStyle)
</del><ins>+void CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(Element&amp; element)
</ins><span class="cx"> {
</span><span class="cx">     if (simpleDefaultStyleSheet &amp;&amp; !elementCanUseSimpleDefaultStyle(element)) {
</span><span class="cx">         loadFullDefaultStyle();
</span><del>-        changedDefaultStyle = true;
</del><ins>+        ++defaultStyleVersion;
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (is&lt;HTMLElement&gt;(element)) {
</span><span class="lines">@@ -167,7 +168,7 @@
</span><span class="cx">                     plugInsRules = String(plugInsUserAgentStyleSheet, sizeof(plugInsUserAgentStyleSheet));
</span><span class="cx">                 plugInsStyleSheet = parseUASheet(plugInsRules);
</span><span class="cx">                 defaultStyle-&gt;addRulesFromSheet(*plugInsStyleSheet, screenEval());
</span><del>-                changedDefaultStyle = true;
</del><ins>+                ++defaultStyleVersion;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> #if ENABLE(VIDEO)
</span><span class="lines">@@ -179,7 +180,7 @@
</span><span class="cx">                 mediaControlsStyleSheet = parseUASheet(mediaRules);
</span><span class="cx">                 defaultStyle-&gt;addRulesFromSheet(*mediaControlsStyleSheet, screenEval());
</span><span class="cx">                 defaultPrintStyle-&gt;addRulesFromSheet(*mediaControlsStyleSheet, printEval());
</span><del>-                changedDefaultStyle = true;
</del><ins>+                ++defaultStyleVersion;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> #endif // ENABLE(VIDEO)
</span><span class="lines">@@ -190,7 +191,7 @@
</span><span class="cx">                 imageControlsStyleSheet = parseUASheet(imageControlsRules);
</span><span class="cx">                 defaultStyle-&gt;addRulesFromSheet(*imageControlsStyleSheet, screenEval());
</span><span class="cx">                 defaultPrintStyle-&gt;addRulesFromSheet(*imageControlsStyleSheet, printEval());
</span><del>-                changedDefaultStyle = true;
</del><ins>+                ++defaultStyleVersion;
</ins><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx"> #endif // ENABLE(SERVICE_CONTROLS)
</span><span class="lines">@@ -200,7 +201,7 @@
</span><span class="cx">             svgStyleSheet = parseUASheet(svgUserAgentStyleSheet, sizeof(svgUserAgentStyleSheet));
</span><span class="cx">             defaultStyle-&gt;addRulesFromSheet(*svgStyleSheet, screenEval());
</span><span class="cx">             defaultPrintStyle-&gt;addRulesFromSheet(*svgStyleSheet, printEval());
</span><del>-            changedDefaultStyle = true;
</del><ins>+            ++defaultStyleVersion;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> #if ENABLE(MATHML)
</span><span class="lines">@@ -210,7 +211,7 @@
</span><span class="cx">             mathMLStyleSheet = parseUASheet(mathmlUserAgentStyleSheet, sizeof(mathmlUserAgentStyleSheet));
</span><span class="cx">             defaultStyle-&gt;addRulesFromSheet(*mathMLStyleSheet, screenEval());
</span><span class="cx">             defaultPrintStyle-&gt;addRulesFromSheet(*mathMLStyleSheet, printEval());
</span><del>-            changedDefaultStyle = true;
</del><ins>+            ++defaultStyleVersion;
</ins><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> #endif // ENABLE(MATHML)
</span><span class="lines">@@ -221,7 +222,7 @@
</span><span class="cx">         fullscreenStyleSheet = parseUASheet(fullscreenRules);
</span><span class="cx">         defaultStyle-&gt;addRulesFromSheet(*fullscreenStyleSheet, screenEval());
</span><span class="cx">         defaultQuirksStyle-&gt;addRulesFromSheet(*fullscreenStyleSheet, screenEval());
</span><del>-        changedDefaultStyle = true;
</del><ins>+        ++defaultStyleVersion;
</ins><span class="cx">     }
</span><span class="cx"> #endif // ENABLE(FULLSCREEN_API)
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSDefaultStyleSheetsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSDefaultStyleSheets.h (196554 => 196555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSDefaultStyleSheets.h        2016-02-13 22:39:52 UTC (rev 196554)
+++ trunk/Source/WebCore/css/CSSDefaultStyleSheets.h        2016-02-13 22:45:34 UTC (rev 196555)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx">     static RuleSet* defaultStyle;
</span><span class="cx">     static RuleSet* defaultQuirksStyle;
</span><span class="cx">     static RuleSet* defaultPrintStyle;
</span><ins>+    static unsigned defaultStyleVersion;
</ins><span class="cx"> 
</span><span class="cx">     static StyleSheetContents* simpleDefaultStyleSheet;
</span><span class="cx">     static StyleSheetContents* defaultStyleSheet;
</span><span class="lines">@@ -45,7 +46,7 @@
</span><span class="cx">     static StyleSheetContents* plugInsStyleSheet;
</span><span class="cx">     static StyleSheetContents* imageControlsStyleSheet;
</span><span class="cx"> 
</span><del>-    static void ensureDefaultStyleSheetsForElement(Element&amp;, bool&amp; changedDefaultStyle);
</del><ins>+    static void ensureDefaultStyleSheetsForElement(Element&amp;);
</ins><span class="cx">     static void loadFullDefaultStyle();
</span><span class="cx">     static void loadSimpleDefaultStyle();
</span><span class="cx">     static void initDefaultStyle(Element*);
</span></span></pre></div>
<a id="trunkSourceWebCorecssDocumentRuleSetscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/DocumentRuleSets.cpp (196554 => 196555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/DocumentRuleSets.cpp        2016-02-13 22:39:52 UTC (rev 196554)
+++ trunk/Source/WebCore/css/DocumentRuleSets.cpp        2016-02-13 22:45:34 UTC (rev 196555)
</span><span class="lines">@@ -29,7 +29,6 @@
</span><span class="cx"> #include &quot;config.h&quot;
</span><span class="cx"> #include &quot;DocumentRuleSets.h&quot;
</span><span class="cx"> 
</span><del>-#include &quot;CSSDefaultStyleSheets.h&quot;
</del><span class="cx"> #include &quot;CSSStyleSheet.h&quot;
</span><span class="cx"> #include &quot;ExtensionStyleSheets.h&quot;
</span><span class="cx"> #include &quot;MediaQueryEvaluator.h&quot;
</span><span class="lines">@@ -98,7 +97,7 @@
</span><span class="cx">     collectFeatures();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void DocumentRuleSets::collectFeatures()
</del><ins>+void DocumentRuleSets::collectFeatures() const
</ins><span class="cx"> {
</span><span class="cx">     m_features.clear();
</span><span class="cx">     // Collect all ids and rules using sibling selectors (:first-child and similar)
</span><span class="lines">@@ -106,6 +105,8 @@
</span><span class="cx">     // sharing candidates.
</span><span class="cx">     if (CSSDefaultStyleSheets::defaultStyle)
</span><span class="cx">         m_features.add(CSSDefaultStyleSheets::defaultStyle-&gt;features());
</span><ins>+    m_defaultStyleVersionOnFeatureCollection = CSSDefaultStyleSheets::defaultStyleVersion;
+
</ins><span class="cx">     if (m_authorStyle)
</span><span class="cx">         m_features.add(m_authorStyle-&gt;features());
</span><span class="cx">     if (m_userStyle)
</span></span></pre></div>
<a id="trunkSourceWebCorecssDocumentRuleSetsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/DocumentRuleSets.h (196554 => 196555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/DocumentRuleSets.h        2016-02-13 22:39:52 UTC (rev 196554)
+++ trunk/Source/WebCore/css/DocumentRuleSets.h        2016-02-13 22:45:34 UTC (rev 196555)
</span><span class="lines">@@ -23,6 +23,7 @@
</span><span class="cx"> #ifndef DocumentRuleSets_h
</span><span class="cx"> #define DocumentRuleSets_h
</span><span class="cx"> 
</span><ins>+#include &quot;CSSDefaultStyleSheets.h&quot;
</ins><span class="cx"> #include &quot;RuleFeature.h&quot;
</span><span class="cx"> #include &quot;RuleSet.h&quot;
</span><span class="cx"> #include &lt;memory&gt;
</span><span class="lines">@@ -46,7 +47,7 @@
</span><span class="cx">     RuleSet* authorStyle() const { return m_authorStyle.get(); }
</span><span class="cx">     RuleSet* userStyle() const { return m_userStyle.get(); }
</span><span class="cx">     RuleFeatureSet&amp; features() { return m_features; }
</span><del>-    const RuleFeatureSet&amp; features() const { return m_features; }
</del><ins>+    const RuleFeatureSet&amp; features() const;
</ins><span class="cx">     RuleSet* sibling() const { return m_siblingRuleSet.get(); }
</span><span class="cx">     RuleSet* uncommonAttribute() const { return m_uncommonAttributeRuleSet.get(); }
</span><span class="cx">     RuleSet* ancestorClassRules(AtomicStringImpl* className) const;
</span><span class="lines">@@ -55,18 +56,27 @@
</span><span class="cx">     void resetAuthorStyle();
</span><span class="cx">     void appendAuthorStyleSheets(const Vector&lt;RefPtr&lt;CSSStyleSheet&gt;&gt;&amp;, MediaQueryEvaluator*, InspectorCSSOMWrappers&amp;, StyleResolver*);
</span><span class="cx"> 
</span><del>-    void collectFeatures();
-
</del><span class="cx"> private:
</span><ins>+    void collectFeatures() const;
</ins><span class="cx">     void collectRulesFromUserStyleSheets(const Vector&lt;RefPtr&lt;CSSStyleSheet&gt;&gt;&amp;, RuleSet&amp; userStyle, const MediaQueryEvaluator&amp;, StyleResolver&amp;);
</span><ins>+
</ins><span class="cx">     std::unique_ptr&lt;RuleSet&gt; m_authorStyle;
</span><span class="cx">     std::unique_ptr&lt;RuleSet&gt; m_userStyle;
</span><del>-    RuleFeatureSet m_features;
-    std::unique_ptr&lt;RuleSet&gt; m_siblingRuleSet;
-    std::unique_ptr&lt;RuleSet&gt; m_uncommonAttributeRuleSet;
</del><ins>+
+    mutable RuleFeatureSet m_features;
+    mutable unsigned m_defaultStyleVersionOnFeatureCollection { 0 };
+    mutable std::unique_ptr&lt;RuleSet&gt; m_siblingRuleSet;
+    mutable std::unique_ptr&lt;RuleSet&gt; m_uncommonAttributeRuleSet;
</ins><span class="cx">     mutable HashMap&lt;AtomicStringImpl*, std::unique_ptr&lt;RuleSet&gt;&gt; m_ancestorClassRuleSet;
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+inline const RuleFeatureSet&amp; DocumentRuleSets::features() const
+{
+    if (m_defaultStyleVersionOnFeatureCollection &lt; CSSDefaultStyleSheets::defaultStyleVersion)
+        collectFeatures();
+    return m_features;
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // DocumentRuleSets_h
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleResolvercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleResolver.cpp (196554 => 196555)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleResolver.cpp        2016-02-13 22:39:52 UTC (rev 196554)
+++ trunk/Source/WebCore/css/StyleResolver.cpp        2016-02-13 22:45:34 UTC (rev 196555)
</span><span class="lines">@@ -392,10 +392,7 @@
</span><span class="cx">         state.style()-&gt;setInsideLink(linkState);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool needsCollection = false;
-    CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(element, needsCollection);
-    if (needsCollection)
-        m_ruleSets.collectFeatures();
</del><ins>+    CSSDefaultStyleSheets::ensureDefaultStyleSheetsForElement(element);
</ins><span class="cx"> 
</span><span class="cx">     ElementRuleCollector collector(element, state.style(), m_ruleSets, m_state.selectorFilter());
</span><span class="cx">     collector.setRegionForStyling(regionForStyling);
</span></span></pre>
</div>
</div>

</body>
</html>