<!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>[207622] 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/207622">207622</a></dd>
<dt>Author</dt> <dd>hyatt@apple.com</dd>
<dt>Date</dt> <dd>2016-10-20 10:25:01 -0700 (Thu, 20 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CSS Parser] Fix font family parsing and add CSS region property parsing
https://bugs.webkit.org/show_bug.cgi?id=163741

Reviewed by Zalan Bujtas.

* css/parser/CSSParser.cpp:
(WebCore::isKeywordPropertyID):
(WebCore::parseKeywordValue):
(WebCore::CSSParser::parseValue):
Modify the old CSSParser to have its own keyword check, since keywords were
incorrectly added to the new parser when this check was consolidated. Column
and region breaks are considered keyword properties by the old parser, but
not by the new parser, since the new parser special cases them and maps them
into the generic break property.

* css/parser/CSSParserFastPaths.cpp:
(WebCore::CSSParserFastPaths::isValidKeywordPropertyAndValue):
(WebCore::CSSParserFastPaths::isKeywordPropertyID):
Update for regions to make sure all the region properties are there. Remove the
column and region break properties, since they're not supposed to be here in the
new parser.

* css/parser/CSSPropertyParser.cpp:
(WebCore::consumeFamilyName):
Fix font parsing to make font family values so that fonts work.

(WebCore::consumeFlowProperty):
Add a function for handling -webkit-flow-from and -webkit-flow-into.

(WebCore::CSSPropertyParser::parseSingleValue):
Add support for the region properties.

(WebCore::mapFromRegionBreakBetween):
(WebCore::mapFromColumnRegionOrPageBreakInside):
(WebCore::mapFromLegacyBreakProperty):
(WebCore::CSSPropertyParser::consumeLegacyBreakProperty):
(WebCore::mapFromColumnOrPageBreakInside): Deleted.
Update to handle the region break properties in the same way that column break
properties are handled.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSParsercpp">trunk/Source/WebCore/css/parser/CSSParser.cpp</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSParserFastPathscpp">trunk/Source/WebCore/css/parser/CSSParserFastPaths.cpp</a></li>
<li><a href="#trunkSourceWebCorecssparserCSSPropertyParsercpp">trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (207621 => 207622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-20 16:53:00 UTC (rev 207621)
+++ trunk/Source/WebCore/ChangeLog        2016-10-20 17:25:01 UTC (rev 207622)
</span><span class="lines">@@ -1,3 +1,45 @@
</span><ins>+2016-10-20  Dave Hyatt  &lt;hyatt@apple.com&gt;
+
+        [CSS Parser] Fix font family parsing and add CSS region property parsing
+        https://bugs.webkit.org/show_bug.cgi?id=163741
+
+        Reviewed by Zalan Bujtas.
+
+        * css/parser/CSSParser.cpp:
+        (WebCore::isKeywordPropertyID):
+        (WebCore::parseKeywordValue):
+        (WebCore::CSSParser::parseValue):
+        Modify the old CSSParser to have its own keyword check, since keywords were
+        incorrectly added to the new parser when this check was consolidated. Column
+        and region breaks are considered keyword properties by the old parser, but
+        not by the new parser, since the new parser special cases them and maps them
+        into the generic break property.
+
+        * css/parser/CSSParserFastPaths.cpp:
+        (WebCore::CSSParserFastPaths::isValidKeywordPropertyAndValue):
+        (WebCore::CSSParserFastPaths::isKeywordPropertyID):
+        Update for regions to make sure all the region properties are there. Remove the
+        column and region break properties, since they're not supposed to be here in the
+        new parser.
+
+        * css/parser/CSSPropertyParser.cpp:
+        (WebCore::consumeFamilyName):
+        Fix font parsing to make font family values so that fonts work.
+
+        (WebCore::consumeFlowProperty):
+        Add a function for handling -webkit-flow-from and -webkit-flow-into.
+
+        (WebCore::CSSPropertyParser::parseSingleValue):
+        Add support for the region properties.
+
+        (WebCore::mapFromRegionBreakBetween):
+        (WebCore::mapFromColumnRegionOrPageBreakInside):
+        (WebCore::mapFromLegacyBreakProperty):
+        (WebCore::CSSPropertyParser::consumeLegacyBreakProperty):
+        (WebCore::mapFromColumnOrPageBreakInside): Deleted.
+        Update to handle the region break properties in the same way that column break
+        properties are handled.
+
</ins><span class="cx"> 2016-10-20  Jer Noble  &lt;jer.noble@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         CRASH in WebCore::MediaSource::seekToTime + 185
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSParser.cpp (207621 => 207622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSParser.cpp        2016-10-20 16:53:00 UTC (rev 207621)
+++ trunk/Source/WebCore/css/parser/CSSParser.cpp        2016-10-20 17:25:01 UTC (rev 207622)
</span><span class="lines">@@ -1149,11 +1149,30 @@
</span><span class="cx">         || equalLettersIgnoringASCIICase(string, &quot;revert&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static bool isKeywordPropertyID(CSSPropertyID propertyID)
+{
+    switch (propertyID) {
+        case CSSPropertyWebkitColumnBreakAfter:
+        case CSSPropertyWebkitColumnBreakBefore:
+        case CSSPropertyWebkitColumnBreakInside:
+#if ENABLE(CSS_REGIONS)
+        case CSSPropertyWebkitRegionBreakAfter:
+        case CSSPropertyWebkitRegionBreakBefore:
+        case CSSPropertyWebkitRegionBreakInside:
+#endif
+            return true;
+        default:
+            break;
+    }
+    
+    return CSSParserFastPaths::isKeywordPropertyID(propertyID);
+}
+
</ins><span class="cx"> static CSSParser::ParseResult parseKeywordValue(MutableStyleProperties&amp; declaration, CSSPropertyID propertyId, const String&amp; string, bool important, const CSSParserContext&amp; parserContext, StyleSheetContents* styleSheetContents)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!string.isEmpty());
</span><span class="cx"> 
</span><del>-    if (!CSSParserFastPaths::isKeywordPropertyID(propertyId)) {
</del><ins>+    if (!isKeywordPropertyID(propertyId)) {
</ins><span class="cx">         if (!isUniversalKeyword(string))
</span><span class="cx">             return CSSParser::ParseResult::Error;
</span><span class="cx"> 
</span><span class="lines">@@ -1842,7 +1861,7 @@
</span><span class="cx">     if (propId == CSSPropertyAll)
</span><span class="cx">         return false; // &quot;all&quot; doesn't allow you to specify anything other than inherit/initial/unset.
</span><span class="cx"> 
</span><del>-    if (CSSParserFastPaths::isKeywordPropertyID(propId)) {
</del><ins>+    if (isKeywordPropertyID(propId)) {
</ins><span class="cx">         if (!isValidKeywordPropertyAndValue(propId, id, m_context, m_styleSheet))
</span><span class="cx">             return false;
</span><span class="cx">         if (m_valueList-&gt;next() &amp;&amp; !inShorthand())
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSParserFastPathscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSParserFastPaths.cpp (207621 => 207622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSParserFastPaths.cpp        2016-10-20 16:53:00 UTC (rev 207621)
+++ trunk/Source/WebCore/css/parser/CSSParserFastPaths.cpp        2016-10-20 17:25:01 UTC (rev 207622)
</span><span class="lines">@@ -745,6 +745,10 @@
</span><span class="cx">         return valueID == CSSValueNormal || valueID == CSSValueBreakAll || valueID == CSSValueKeepAll || valueID == CSSValueBreakWord;
</span><span class="cx">     case CSSPropertyWebkitBorderFit:
</span><span class="cx">         return valueID == CSSValueBorder || valueID == CSSValueLines;
</span><ins>+#if ENABLE(CSS_REGIONS)
+    case CSSPropertyWebkitRegionFragment:
+        return valueID == CSSValueAuto || valueID == CSSValueBreak;
+#endif
</ins><span class="cx"> #if ENABLE(CSS_SCROLL_SNAP)
</span><span class="cx">     case CSSPropertyWebkitScrollSnapType: // none | mandatory | proximity
</span><span class="cx">         return valueID == CSSValueNone || valueID == CSSValueMandatory || valueID == CSSValueProximity;
</span><span class="lines">@@ -839,9 +843,6 @@
</span><span class="cx">     case CSSPropertyWebkitBoxOrient:
</span><span class="cx">     case CSSPropertyWebkitBoxPack:
</span><span class="cx">     case CSSPropertyWebkitColumnAxis:
</span><del>-    case CSSPropertyWebkitColumnBreakAfter:
-    case CSSPropertyWebkitColumnBreakBefore:
-    case CSSPropertyWebkitColumnBreakInside:
</del><span class="cx">     case CSSPropertyWebkitFontKerning:
</span><span class="cx">     case CSSPropertyWebkitFontSmoothing:
</span><span class="cx">     case CSSPropertyWebkitHyphens:
</span><span class="lines">@@ -930,9 +931,6 @@
</span><span class="cx">     case CSSPropertyWebkitOverflowScrolling:
</span><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CSS_REGIONS)
</span><del>-    case CSSPropertyWebkitRegionBreakAfter:
-    case CSSPropertyWebkitRegionBreakBefore:
-    case CSSPropertyWebkitRegionBreakInside:
</del><span class="cx">     case CSSPropertyWebkitRegionFragment:
</span><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CSS3_TEXT)
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSPropertyParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp (207621 => 207622)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp        2016-10-20 16:53:00 UTC (rev 207621)
+++ trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp        2016-10-20 17:25:01 UTC (rev 207622)
</span><span class="lines">@@ -706,13 +706,13 @@
</span><span class="cx"> static RefPtr&lt;CSSValue&gt; consumeFamilyName(CSSParserTokenRange&amp; range)
</span><span class="cx"> {
</span><span class="cx">     if (range.peek().type() == StringToken)
</span><del>-        return CSSPrimitiveValue::create(range.consumeIncludingWhitespace().value().toString(), CSSPrimitiveValue::UnitTypes::CSS_STRING);
</del><ins>+        return CSSValuePool::singleton().createFontFamilyValue(range.consumeIncludingWhitespace().value().toString());
</ins><span class="cx">     if (range.peek().type() != IdentToken)
</span><span class="cx">         return nullptr;
</span><span class="cx">     String familyName = concatenateFamilyName(range);
</span><span class="cx">     if (familyName.isNull())
</span><span class="cx">         return nullptr;
</span><del>-    return CSSPrimitiveValue::create(familyName, CSSPrimitiveValue::UnitTypes::CSS_STRING);
</del><ins>+    return CSSValuePool::singleton().createFontFamilyValue(familyName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static RefPtr&lt;CSSValue&gt; consumeGenericFamily(CSSParserTokenRange&amp; range)
</span><span class="lines">@@ -3007,6 +3007,18 @@
</span><span class="cx">     return CSSGridTemplateAreasValue::create(gridAreaMap, rowCount, columnCount);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if ENABLE(CSS_REGIONS)
+static RefPtr&lt;CSSValue&gt; consumeFlowProperty(CSSParserTokenRange&amp; range)
+{
+    RefPtr&lt;CSSValue&gt; result;
+    if (range.peek().id() == CSSValueNone)
+        result = consumeIdent(range);
+    else
+        result = consumeCustomIdent(range);
+    return result;
+}
+#endif
+
</ins><span class="cx"> RefPtr&lt;CSSValue&gt; CSSPropertyParser::parseSingleValue(CSSPropertyID property, CSSPropertyID currentShorthand)
</span><span class="cx"> {
</span><span class="cx">     if (CSSParserFastPaths::isKeywordPropertyID(property)) {
</span><span class="lines">@@ -3368,6 +3380,11 @@
</span><span class="cx">         return consumeGridTemplateAreas(m_range);
</span><span class="cx">     case CSSPropertyGridAutoFlow:
</span><span class="cx">         return consumeGridAutoFlow(m_range);
</span><ins>+#if ENABLE(CSS_REGIONS)
+    case CSSPropertyWebkitFlowInto:
+    case CSSPropertyWebkitFlowFrom:
+        return consumeFlowProperty(m_range);
+#endif
</ins><span class="cx">     default:
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="lines">@@ -4000,13 +4017,24 @@
</span><span class="cx">     return CSSValueInvalid;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline CSSValueID mapFromColumnOrPageBreakInside(CSSValueID value)
</del><ins>+#if ENABLE(CSS_REGIONS)
+static inline CSSValueID mapFromRegionBreakBetween(CSSValueID value)
</ins><span class="cx"> {
</span><ins>+    if (value == CSSValueAlways)
+        return CSSValueRegion;
</ins><span class="cx">     if (value == CSSValueAuto || value == CSSValueAvoid)
</span><span class="cx">         return value;
</span><span class="cx">     return CSSValueInvalid;
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx"> 
</span><ins>+static inline CSSValueID mapFromColumnRegionOrPageBreakInside(CSSValueID value)
+{
+    if (value == CSSValueAuto || value == CSSValueAvoid)
+        return value;
+    return CSSValueInvalid;
+}
+
</ins><span class="cx"> static inline CSSPropertyID mapFromLegacyBreakProperty(CSSPropertyID property)
</span><span class="cx"> {
</span><span class="cx">     if (property == CSSPropertyPageBreakAfter || property == CSSPropertyWebkitColumnBreakAfter)
</span><span class="lines">@@ -4013,7 +4041,15 @@
</span><span class="cx">         return CSSPropertyBreakAfter;
</span><span class="cx">     if (property == CSSPropertyPageBreakBefore || property == CSSPropertyWebkitColumnBreakBefore)
</span><span class="cx">         return CSSPropertyBreakBefore;
</span><ins>+#if ENABLE(CSS_REGIONS)
+    if (property == CSSPropertyWebkitRegionBreakAfter)
+        return CSSPropertyBreakAfter;
+    if (property == CSSPropertyWebkitRegionBreakBefore)
+        return CSSPropertyBreakBefore;
+    ASSERT(property == CSSPropertyPageBreakInside || property == CSSPropertyWebkitColumnBreakInside || property == CSSPropertyWebkitRegionBreakInside);
+#else
</ins><span class="cx">     ASSERT(property == CSSPropertyPageBreakInside || property == CSSPropertyWebkitColumnBreakInside);
</span><ins>+#endif
</ins><span class="cx">     return CSSPropertyBreakInside;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -4037,9 +4073,16 @@
</span><span class="cx">     case CSSPropertyWebkitColumnBreakBefore:
</span><span class="cx">         value = mapFromColumnBreakBetween(value);
</span><span class="cx">         break;
</span><ins>+#if ENABLE(CSS_REGIONS)
+    case CSSPropertyWebkitRegionBreakAfter:
+    case CSSPropertyWebkitRegionBreakBefore:
+        value = mapFromRegionBreakBetween(value);
+        break;
+    case CSSPropertyWebkitRegionBreakInside:
+#endif
</ins><span class="cx">     case CSSPropertyPageBreakInside:
</span><span class="cx">     case CSSPropertyWebkitColumnBreakInside:
</span><del>-        value = mapFromColumnOrPageBreakInside(value);
</del><ins>+        value = mapFromColumnRegionOrPageBreakInside(value);
</ins><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         ASSERT_NOT_REACHED();
</span></span></pre>
</div>
</div>

</body>
</html>