<!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>[207543] 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/207543">207543</a></dd>
<dt>Author</dt> <dd>hyatt@apple.com</dd>
<dt>Date</dt> <dd>2016-10-19 10:40:27 -0700 (Wed, 19 Oct 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[CSS Parser] Fix transform parsing
https://bugs.webkit.org/show_bug.cgi?id=163671

Reviewed by Dean Jackson.

The new parser turned function names into CSSValueIDs and made CSSFunctionValue store them. This
meant it could be used to handle transform values, with the function name representing the
transform operation efficiently as a CSSValueID.

The old parser, however, creates WebKitCSSTransformValues. This value does not exist in the new
parser. Rather than forcing the old and new parser over to CSSFunctionValues, I opted to
just make the new parser build WebkitCSSTransformValues too.

The main reason I did this is that WebkitCSSTransformValue is actually exposed to the Web via
IDL. To be safe, I am not eliminating it (even though Blink has).

* css/parser/CSSPropertyParser.cpp:
(WebCore::consumeTranslate3d):
(WebCore::consumeNumbers):
(WebCore::consumePerspective):
(WebCore::transformOperationForCSSValueID):
(WebCore::consumeTransformValue):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</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 (207542 => 207543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-10-19 17:18:27 UTC (rev 207542)
+++ trunk/Source/WebCore/ChangeLog        2016-10-19 17:40:27 UTC (rev 207543)
</span><span class="lines">@@ -1,3 +1,28 @@
</span><ins>+2016-10-19  Dave Hyatt  &lt;hyatt@apple.com&gt;
+
+        [CSS Parser] Fix transform parsing
+        https://bugs.webkit.org/show_bug.cgi?id=163671
+
+        Reviewed by Dean Jackson.
+
+        The new parser turned function names into CSSValueIDs and made CSSFunctionValue store them. This
+        meant it could be used to handle transform values, with the function name representing the
+        transform operation efficiently as a CSSValueID.
+
+        The old parser, however, creates WebKitCSSTransformValues. This value does not exist in the new
+        parser. Rather than forcing the old and new parser over to CSSFunctionValues, I opted to
+        just make the new parser build WebkitCSSTransformValues too.
+
+        The main reason I did this is that WebkitCSSTransformValue is actually exposed to the Web via
+        IDL. To be safe, I am not eliminating it (even though Blink has).
+
+        * css/parser/CSSPropertyParser.cpp:
+        (WebCore::consumeTranslate3d):
+        (WebCore::consumeNumbers):
+        (WebCore::consumePerspective):
+        (WebCore::transformOperationForCSSValueID):
+        (WebCore::consumeTransformValue):
+
</ins><span class="cx"> 2016-10-19  Darin Adler  &lt;darin@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Move XPath from ExceptionCode to Exception
</span></span></pre></div>
<a id="trunkSourceWebCorecssparserCSSPropertyParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp (207542 => 207543)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp        2016-10-19 17:18:27 UTC (rev 207542)
+++ trunk/Source/WebCore/css/parser/CSSPropertyParser.cpp        2016-10-19 17:40:27 UTC (rev 207543)
</span><span class="lines">@@ -68,6 +68,7 @@
</span><span class="cx"> #include &quot;SVGPathUtilities.h&quot;
</span><span class="cx"> #include &quot;StylePropertyShorthand.h&quot;
</span><span class="cx"> #include &quot;StylePropertyShorthandFunctions.h&quot;
</span><ins>+#include &quot;WebkitCSSTransformValue.h&quot;
</ins><span class="cx"> #include &lt;memory&gt;
</span><span class="cx"> #include &lt;wtf/text/StringBuilder.h&gt;
</span><span class="cx"> 
</span><span class="lines">@@ -1451,7 +1452,7 @@
</span><span class="cx">     return consumeLineWidth(range, cssParserMode, UnitlessQuirk::Forbid);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool consumeTranslate3d(CSSParserTokenRange&amp; args, CSSParserMode cssParserMode, RefPtr&lt;CSSFunctionValue&gt;&amp; transformValue)
</del><ins>+static bool consumeTranslate3d(CSSParserTokenRange&amp; args, CSSParserMode cssParserMode, RefPtr&lt;WebKitCSSTransformValue&gt;&amp; transformValue)
</ins><span class="cx"> {
</span><span class="cx">     unsigned numberOfArguments = 2;
</span><span class="cx">     RefPtr&lt;CSSValue&gt; parsedValue;
</span><span class="lines">@@ -1470,7 +1471,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool consumeNumbers(CSSParserTokenRange&amp; args, RefPtr&lt;CSSFunctionValue&gt;&amp; transformValue, unsigned numberOfArguments)
</del><ins>+static bool consumeNumbers(CSSParserTokenRange&amp; args, RefPtr&lt;WebKitCSSTransformValue&gt;&amp; transformValue, unsigned numberOfArguments)
</ins><span class="cx"> {
</span><span class="cx">     do {
</span><span class="cx">         RefPtr&lt;CSSPrimitiveValue&gt; parsedValue = consumeNumber(args, ValueRangeAll);
</span><span class="lines">@@ -1483,7 +1484,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool consumePerspective(CSSParserTokenRange&amp; args, CSSParserMode cssParserMode, RefPtr&lt;CSSFunctionValue&gt;&amp; transformValue)
</del><ins>+static bool consumePerspective(CSSParserTokenRange&amp; args, CSSParserMode cssParserMode, RefPtr&lt;WebKitCSSTransformValue&gt;&amp; transformValue)
</ins><span class="cx"> {
</span><span class="cx">     RefPtr&lt;CSSPrimitiveValue&gt; parsedValue = consumeLength(args, cssParserMode, ValueRangeNonNegative);
</span><span class="cx">     if (!parsedValue) {
</span><span class="lines">@@ -1498,6 +1499,58 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+// FIXME-NEWPARSER: This has no reason to exist once we eliminate WebkitCSSTransformValue in favor
+// of CSSFunctionValue.
+static WebKitCSSTransformValue::TransformOperationType transformOperationForCSSValueID(CSSValueID functionId)
+{
+    switch (functionId) {
+    case CSSValueRotate:
+        return WebKitCSSTransformValue::RotateTransformOperation;
+    case CSSValueRotatex:
+        return WebKitCSSTransformValue::RotateXTransformOperation;
+    case CSSValueRotatey:
+        return WebKitCSSTransformValue::RotateYTransformOperation;
+    case CSSValueRotatez:
+        return WebKitCSSTransformValue::RotateZTransformOperation;
+    case CSSValueSkewx:
+        return WebKitCSSTransformValue::SkewXTransformOperation;
+    case CSSValueSkewy:
+        return WebKitCSSTransformValue::SkewYTransformOperation;
+    case CSSValueSkew:
+        return WebKitCSSTransformValue::SkewTransformOperation;
+    case CSSValueScalex:
+        return WebKitCSSTransformValue::ScaleXTransformOperation;
+    case CSSValueScaley:
+        return WebKitCSSTransformValue::ScaleYTransformOperation;
+    case CSSValueScalez:
+        return WebKitCSSTransformValue::ScaleZTransformOperation;
+    case CSSValueScale:
+        return WebKitCSSTransformValue::ScaleTransformOperation;
+    case CSSValuePerspective:
+        return WebKitCSSTransformValue::PerspectiveTransformOperation;
+    case CSSValueTranslatex:
+        return WebKitCSSTransformValue::TranslateXTransformOperation;
+    case CSSValueTranslatey:
+        return WebKitCSSTransformValue::TranslateYTransformOperation;
+    case CSSValueTranslate:
+        return WebKitCSSTransformValue::TranslateTransformOperation;
+    case CSSValueTranslatez:
+        return WebKitCSSTransformValue::TranslateZTransformOperation;
+    case CSSValueMatrix:
+        return WebKitCSSTransformValue::MatrixTransformOperation;
+    case CSSValueMatrix3d:
+        return WebKitCSSTransformValue::Matrix3DTransformOperation;
+    case CSSValueScale3d:
+        return WebKitCSSTransformValue::Scale3DTransformOperation;
+    case CSSValueRotate3d:
+        return WebKitCSSTransformValue::Rotate3DTransformOperation;
+    case CSSValueTranslate3d:
+        return WebKitCSSTransformValue::Translate3DTransformOperation;
+    default:
+        return WebKitCSSTransformValue::UnknownTransformOperation;
+    }
+}
+
</ins><span class="cx"> static RefPtr&lt;CSSValue&gt; consumeTransformValue(CSSParserTokenRange&amp; range, CSSParserMode cssParserMode)
</span><span class="cx"> {
</span><span class="cx">     CSSValueID functionId = range.peek().functionId();
</span><span class="lines">@@ -1506,7 +1559,10 @@
</span><span class="cx">     CSSParserTokenRange args = consumeFunction(range);
</span><span class="cx">     if (args.atEnd())
</span><span class="cx">         return nullptr;
</span><del>-    RefPtr&lt;CSSFunctionValue&gt; transformValue = CSSFunctionValue::create(functionId);
</del><ins>+    
+    // FIXME-NEWPARSER: Do we really need WebkitCSSTransformValue? A CSSFunctionValue is good
+    // enough and has the CSSValueID as the operation type. Blink has eliminated it.
+    RefPtr&lt;WebKitCSSTransformValue&gt; transformValue = WebKitCSSTransformValue::create(transformOperationForCSSValueID(functionId));
</ins><span class="cx">     RefPtr&lt;CSSValue&gt; parsedValue;
</span><span class="cx">     switch (functionId) {
</span><span class="cx">     case CSSValueRotate:
</span></span></pre>
</div>
</div>

</body>
</html>