<!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>[209835] 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/209835">209835</a></dd>
<dt>Author</dt> <dd>hyatt@apple.com</dd>
<dt>Date</dt> <dd>2016-12-14 14:34:04 -0800 (Wed, 14 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CSS Parser] Make deferred parsing retain the sheet text. Fix invalidation to avoid deferred parsing.
https://bugs.webkit.org/show_bug.cgi?id=165868

Reviewed by Simon Fraser.

With this new model of token copying, the sheet text needs to be retained. The tokenizer did this,
but we're no longer keeping it around.

StyleInvalidation is also aggressively crawling media rules, even unsupported ones, so fix it
to avoid deferred parsing.

* css/StyleInvalidationAnalysis.cpp:
(WebCore::shouldDirtyAllStyle):
* css/parser/CSSDeferredParser.cpp:
(WebCore::CSSDeferredParser::CSSDeferredParser):
* css/parser/CSSDeferredParser.h:
(WebCore::CSSDeferredParser::create):
* css/parser/CSSParserImpl.cpp:
(WebCore::CSSParserImpl::CSSParserImpl):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssStyleInvalidationAnalysiscpp">trunk/Source/WebCore/css/StyleInvalidationAnalysis.cpp</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSDeferredParsercpp">trunk/Source/WebCore/css/parser/CSSDeferredParser.cpp</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSDeferredParserh">trunk/Source/WebCore/css/parser/CSSDeferredParser.h</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSParserImplcpp">trunk/Source/WebCore/css/parser/CSSParserImpl.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209834 => 209835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-14 22:04:25 UTC (rev 209834)
+++ trunk/Source/WebCore/ChangeLog        2016-12-14 22:34:04 UTC (rev 209835)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2016-12-14  Dave Hyatt  &lt;hyatt@apple.com&gt;
+
+        [CSS Parser] Make deferred parsing retain the sheet text. Fix invalidation to avoid deferred parsing.
+        https://bugs.webkit.org/show_bug.cgi?id=165868
+
+        Reviewed by Simon Fraser.
+
+        With this new model of token copying, the sheet text needs to be retained. The tokenizer did this,
+        but we're no longer keeping it around.
+
+        StyleInvalidation is also aggressively crawling media rules, even unsupported ones, so fix it
+        to avoid deferred parsing.
+
+        * css/StyleInvalidationAnalysis.cpp:
+        (WebCore::shouldDirtyAllStyle):
+        * css/parser/CSSDeferredParser.cpp:
+        (WebCore::CSSDeferredParser::CSSDeferredParser):
+        * css/parser/CSSDeferredParser.h:
+        (WebCore::CSSDeferredParser::create):
+        * css/parser/CSSParserImpl.cpp:
+        (WebCore::CSSParserImpl::CSSParserImpl):
+
</ins><span class="cx"> 2016-12-14  Ryosuke Niwa  &lt;rniwa@webkit.org&gt;
</span><span class="cx"> 
</span><span class="cx">         iOS: An element with tabindex is not focusable unless there is no mouse event handler
</span></span></pre></div>
<a id="trunkSourceWebCorecssStyleInvalidationAnalysiscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/StyleInvalidationAnalysis.cpp (209834 => 209835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/StyleInvalidationAnalysis.cpp        2016-12-14 22:04:25 UTC (rev 209834)
+++ trunk/Source/WebCore/css/StyleInvalidationAnalysis.cpp        2016-12-14 22:34:04 UTC (rev 209835)
</span><span class="lines">@@ -42,7 +42,8 @@
</span><span class="cx"> {
</span><span class="cx">     for (auto&amp; rule : rules) {
</span><span class="cx">         if (is&lt;StyleRuleMedia&gt;(*rule)) {
</span><del>-            if (shouldDirtyAllStyle(downcast&lt;StyleRuleMedia&gt;(*rule).childRules()))
</del><ins>+            const auto* childRules = downcast&lt;StyleRuleMedia&gt;(*rule).childRulesWithoutDeferredParsing();
+            if (childRules &amp;&amp; shouldDirtyAllStyle(*childRules))
</ins><span class="cx">                 return true;
</span><span class="cx">             continue;
</span><span class="cx">         }
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSDeferredParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSDeferredParser.cpp (209834 => 209835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSDeferredParser.cpp        2016-12-14 22:04:25 UTC (rev 209834)
+++ trunk/Source/WebCore/css/parser/CSSDeferredParser.cpp        2016-12-14 22:34:04 UTC (rev 209835)
</span><span class="lines">@@ -32,8 +32,9 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-CSSDeferredParser::CSSDeferredParser(const CSSParserContext&amp; context, StyleSheetContents&amp; styleSheet)
</del><ins>+CSSDeferredParser::CSSDeferredParser(const CSSParserContext&amp; context, const String&amp; sheetText, StyleSheetContents&amp; styleSheet)
</ins><span class="cx">     : m_context(context)
</span><ins>+    , m_sheetText(sheetText)
</ins><span class="cx">     , m_styleSheet(styleSheet.createWeakPtr())
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSDeferredParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSDeferredParser.h (209834 => 209835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSDeferredParser.h        2016-12-14 22:04:25 UTC (rev 209834)
+++ trunk/Source/WebCore/css/parser/CSSDeferredParser.h        2016-12-14 22:34:04 UTC (rev 209835)
</span><span class="lines">@@ -38,9 +38,9 @@
</span><span class="cx"> 
</span><span class="cx"> class CSSDeferredParser : public RefCounted&lt;CSSDeferredParser&gt; {
</span><span class="cx"> public:
</span><del>-    static Ref&lt;CSSDeferredParser&gt; create(const CSSParserContext&amp; parserContext, StyleSheetContents&amp; styleSheet)
</del><ins>+    static Ref&lt;CSSDeferredParser&gt; create(const CSSParserContext&amp; parserContext, const String&amp; sheetText, StyleSheetContents&amp; styleSheet)
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new CSSDeferredParser(parserContext, styleSheet));
</del><ins>+        return adoptRef(*new CSSDeferredParser(parserContext, sheetText, styleSheet));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     CSSParserMode mode() const { return m_context.mode; }
</span><span class="lines">@@ -55,11 +55,13 @@
</span><span class="cx">     void adoptTokenizerEscapedStrings(Vector&lt;String&gt;&amp;&amp; strings) { m_escapedStrings = WTFMove(strings); }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    CSSDeferredParser(const CSSParserContext&amp;, StyleSheetContents&amp;);
</del><ins>+    CSSDeferredParser(const CSSParserContext&amp;, const String&amp;, StyleSheetContents&amp;);
</ins><span class="cx">     
</span><span class="cx">     Vector&lt;String&gt; m_escapedStrings;
</span><span class="cx">     CSSParserContext m_context;
</span><span class="cx">     
</span><ins>+    String m_sheetText;
+
</ins><span class="cx">     WeakPtr&lt;StyleSheetContents&gt; m_styleSheet;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSParserImplcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSParserImpl.cpp (209834 => 209835)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSParserImpl.cpp        2016-12-14 22:04:25 UTC (rev 209834)
+++ trunk/Source/WebCore/css/parser/CSSParserImpl.cpp        2016-12-14 22:34:04 UTC (rev 209835)
</span><span class="lines">@@ -77,7 +77,7 @@
</span><span class="cx"> {
</span><span class="cx">     m_tokenizer = wrapper ? std::make_unique&lt;CSSTokenizer&gt;(string, *wrapper) : std::make_unique&lt;CSSTokenizer&gt;(string);
</span><span class="cx">     if (context.deferredCSSParserEnabled &amp;&amp; !wrapper &amp;&amp; styleSheet &amp;&amp; ruleParsing == CSSParser::RuleParsing::Deferred)
</span><del>-        m_deferredParser = CSSDeferredParser::create(context, *styleSheet);
</del><ins>+        m_deferredParser = CSSDeferredParser::create(context, string, *styleSheet);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> CSSParser::ParseResult CSSParserImpl::parseValue(MutableStyleProperties* declaration, CSSPropertyID propertyID, const String&amp; string, bool important, const CSSParserContext&amp; context)
</span></span></pre>
</div>
</div>

</body>
</html>