<!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>[177623] 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/177623">177623</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2014-12-20 18:56:23 -0800 (Sat, 20 Dec 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Get rid of error-prone ReleaseParsedCalcValueCondition argument in CSSParser
https://bugs.webkit.org/show_bug.cgi?id=139334

Reviewed by Darin Adler.

Get rid of error-prone ReleaseParsedCalcValueCondition argument in
CSSParser that determines the the m_parsedCalculation member should
be released.

Instead, introduce a new ValueWithCalculation type which wraps a
CSSParserValue and an optional parsed calculation value. This way,
the parsed calculation value is now associated with its CSSParserValue.
This makes it very difficult to use a parsed calculation value for the
wrong CSSParserValue. The API is also easier to use as developers no
longer need to explicitly indicate if the calculation value should be
released or not.

No new tests, no web-behavior change.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSParsercpp">trunk/Source/WebCore/css/CSSParser.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSParserh">trunk/Source/WebCore/css/CSSParser.h</a></li>
<li><a href="#trunkSourceWebCorecssSVGCSSParsercpp">trunk/Source/WebCore/css/SVGCSSParser.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (177622 => 177623)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-12-20 18:28:37 UTC (rev 177622)
+++ trunk/Source/WebCore/ChangeLog        2014-12-21 02:56:23 UTC (rev 177623)
</span><span class="lines">@@ -1,3 +1,24 @@
</span><ins>+2014-12-20  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        Get rid of error-prone ReleaseParsedCalcValueCondition argument in CSSParser
+        https://bugs.webkit.org/show_bug.cgi?id=139334
+
+        Reviewed by Darin Adler.
+
+        Get rid of error-prone ReleaseParsedCalcValueCondition argument in
+        CSSParser that determines the the m_parsedCalculation member should
+        be released.
+
+        Instead, introduce a new ValueWithCalculation type which wraps a
+        CSSParserValue and an optional parsed calculation value. This way,
+        the parsed calculation value is now associated with its CSSParserValue.
+        This makes it very difficult to use a parsed calculation value for the
+        wrong CSSParserValue. The API is also easier to use as developers no
+        longer need to explicitly indicate if the calculation value should be
+        released or not.
+
+        No new tests, no web-behavior change.
+
</ins><span class="cx"> 2014-12-20  Eric Carlson  &lt;eric.carlson@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] add optimized fullscreen API
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSParser.cpp (177622 => 177623)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSParser.cpp        2014-12-20 18:28:37 UTC (rev 177622)
+++ trunk/Source/WebCore/css/CSSParser.cpp        2014-12-21 02:56:23 UTC (rev 177623)
</span><span class="lines">@@ -1582,80 +1582,82 @@
</span><span class="cx">     return completeURL(m_context, url);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool CSSParser::validCalculationUnit(CSSParserValue&amp; value, Units unitflags, ReleaseParsedCalcValueCondition releaseCalc)
</del><ins>+bool CSSParser::validateCalculationUnit(ValueWithCalculation&amp; valueWithCalculation, Units unitFlags)
</ins><span class="cx"> {
</span><del>-    bool mustBeNonNegative = unitflags &amp; FNonNeg;
</del><ins>+    bool mustBeNonNegative = unitFlags &amp; FNonNeg;
</ins><span class="cx"> 
</span><del>-    if (!parseCalculation(value, mustBeNonNegative ? CalculationRangeNonNegative : CalculationRangeAll))
</del><ins>+    ASSERT(!valueWithCalculation.calculation());
+    RefPtr&lt;CSSCalcValue&gt; calculation = parseCalculation(valueWithCalculation, mustBeNonNegative ? CalculationRangeNonNegative : CalculationRangeAll);
+    if (!calculation)
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    bool b = false;
-    switch (m_parsedCalculation-&gt;category()) {
</del><ins>+    bool isValid = false;
+    switch (calculation-&gt;category()) {
</ins><span class="cx">     case CalcNumber:
</span><del>-        b = (unitflags &amp; FNumber);
-        if (!b &amp;&amp; (unitflags &amp; FInteger) &amp;&amp; m_parsedCalculation-&gt;isInt())
-            b = true;
-        if (b &amp;&amp; mustBeNonNegative &amp;&amp; m_parsedCalculation-&gt;isNegative())
-            b = false;
</del><ins>+        isValid = (unitFlags &amp; FNumber);
+        if (!isValid &amp;&amp; (unitFlags &amp; FInteger) &amp;&amp; calculation-&gt;isInt())
+            isValid = true;
+        if (isValid &amp;&amp; mustBeNonNegative &amp;&amp; calculation-&gt;isNegative())
+            isValid = false;
</ins><span class="cx">         break;
</span><span class="cx">     case CalcLength:
</span><del>-        b = (unitflags &amp; FLength);
</del><ins>+        isValid = (unitFlags &amp; FLength);
</ins><span class="cx">         break;
</span><span class="cx">     case CalcPercent:
</span><del>-        b = (unitflags &amp; FPercent);
-        if (b &amp;&amp; mustBeNonNegative &amp;&amp; m_parsedCalculation-&gt;isNegative())
-            b = false;
</del><ins>+        isValid = (unitFlags &amp; FPercent);
+        if (isValid &amp;&amp; mustBeNonNegative &amp;&amp; calculation-&gt;isNegative())
+            isValid = false;
</ins><span class="cx">         break;
</span><span class="cx">     case CalcPercentLength:
</span><del>-        b = (unitflags &amp; FPercent) &amp;&amp; (unitflags &amp; FLength);
</del><ins>+        isValid = (unitFlags &amp; FPercent) &amp;&amp; (unitFlags &amp; FLength);
</ins><span class="cx">         break;
</span><span class="cx">     case CalcPercentNumber:
</span><del>-        b = (unitflags &amp; FPercent) &amp;&amp; (unitflags &amp; FNumber);
</del><ins>+        isValid = (unitFlags &amp; FPercent) &amp;&amp; (unitFlags &amp; FNumber);
</ins><span class="cx">         break;
</span><span class="cx">     case CalcAngle:
</span><del>-        b = (unitflags &amp; FAngle);
</del><ins>+        isValid = (unitFlags &amp; FAngle);
</ins><span class="cx">         break;
</span><span class="cx">     case CalcTime:
</span><del>-        b = (unitflags &amp; FTime);
</del><ins>+        isValid = (unitFlags &amp; FTime);
</ins><span class="cx">         break;
</span><span class="cx">     case CalcFrequency:
</span><del>-        b = (unitflags &amp; FFrequency);
</del><ins>+        isValid = (unitFlags &amp; FFrequency);
</ins><span class="cx">         break;
</span><span class="cx">     case CalcOther:
</span><span class="cx">         break;
</span><span class="cx">     }
</span><del>-    if (!b || releaseCalc == ReleaseParsedCalcValue)
-        m_parsedCalculation = nullptr;
-    return b;    
</del><ins>+    if (isValid)
+        valueWithCalculation.setCalculation(WTF::move(calculation));
+    return isValid;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline bool CSSParser::shouldAcceptUnitLessValues(CSSParserValue&amp; value, Units unitflags, CSSParserMode cssParserMode)
</del><ins>+inline bool CSSParser::shouldAcceptUnitLessValues(CSSParserValue&amp; value, Units unitFlags, CSSParserMode cssParserMode)
</ins><span class="cx"> {
</span><span class="cx">     // Qirks mode and svg presentation attributes accept unit less values.
</span><del>-    return (unitflags &amp; (FLength | FAngle | FTime)) &amp;&amp; (!value.fValue || cssParserMode == CSSQuirksMode || cssParserMode == SVGAttributeMode);
</del><ins>+    return (unitFlags &amp; (FLength | FAngle | FTime)) &amp;&amp; (!value.fValue || cssParserMode == CSSQuirksMode || cssParserMode == SVGAttributeMode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool CSSParser::validUnit(CSSParserValue&amp; value, Units unitflags, CSSParserMode cssParserMode, ReleaseParsedCalcValueCondition releaseCalc)
</del><ins>+bool CSSParser::validateUnit(ValueWithCalculation&amp; valueWithCalculation, Units unitFlags, CSSParserMode cssParserMode)
</ins><span class="cx"> {
</span><del>-    if (isCalculation(value))
-        return validCalculationUnit(value, unitflags, releaseCalc);
</del><ins>+    if (isCalculation(valueWithCalculation))
+        return validateCalculationUnit(valueWithCalculation, unitFlags);
</ins><span class="cx">         
</span><span class="cx">     bool b = false;
</span><del>-    switch (value.unit) {
</del><ins>+    switch (valueWithCalculation.value().unit) {
</ins><span class="cx">     case CSSPrimitiveValue::CSS_NUMBER:
</span><del>-        b = (unitflags &amp; FNumber);
-        if (!b &amp;&amp; shouldAcceptUnitLessValues(value, unitflags, cssParserMode)) {
-            value.unit = (unitflags &amp; FLength) ? CSSPrimitiveValue::CSS_PX :
-                          ((unitflags &amp; FAngle) ? CSSPrimitiveValue::CSS_DEG : CSSPrimitiveValue::CSS_MS);
</del><ins>+        b = (unitFlags &amp; FNumber);
+        if (!b &amp;&amp; shouldAcceptUnitLessValues(valueWithCalculation, unitFlags, cssParserMode)) {
+            valueWithCalculation.value().unit = (unitFlags &amp; FLength) ? CSSPrimitiveValue::CSS_PX :
+                          ((unitFlags &amp; FAngle) ? CSSPrimitiveValue::CSS_DEG : CSSPrimitiveValue::CSS_MS);
</ins><span class="cx">             b = true;
</span><span class="cx">         }
</span><del>-        if (!b &amp;&amp; (unitflags &amp; FInteger) &amp;&amp; value.isInt)
</del><ins>+        if (!b &amp;&amp; (unitFlags &amp; FInteger) &amp;&amp; valueWithCalculation.value().isInt)
</ins><span class="cx">             b = true;
</span><del>-        if (!b &amp;&amp; (unitflags &amp; FPositiveInteger) &amp;&amp; value.isInt &amp;&amp; value.fValue &gt; 0)
</del><ins>+        if (!b &amp;&amp; (unitFlags &amp; FPositiveInteger) &amp;&amp; valueWithCalculation.value().isInt &amp;&amp; valueWithCalculation.value().fValue &gt; 0)
</ins><span class="cx">             b = true;
</span><span class="cx">         break;
</span><span class="cx">     case CSSPrimitiveValue::CSS_PERCENTAGE:
</span><del>-        b = (unitflags &amp; FPercent);
</del><ins>+        b = (unitFlags &amp; FPercent);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSParserValue::Q_EMS:
</span><span class="cx">     case CSSPrimitiveValue::CSS_EMS:
</span><span class="lines">@@ -1672,23 +1674,23 @@
</span><span class="cx">     case CSSPrimitiveValue::CSS_VH:
</span><span class="cx">     case CSSPrimitiveValue::CSS_VMIN:
</span><span class="cx">     case CSSPrimitiveValue::CSS_VMAX:
</span><del>-        b = (unitflags &amp; FLength);
</del><ins>+        b = (unitFlags &amp; FLength);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPrimitiveValue::CSS_MS:
</span><span class="cx">     case CSSPrimitiveValue::CSS_S:
</span><del>-        b = (unitflags &amp; FTime);
</del><ins>+        b = (unitFlags &amp; FTime);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPrimitiveValue::CSS_DEG:
</span><span class="cx">     case CSSPrimitiveValue::CSS_RAD:
</span><span class="cx">     case CSSPrimitiveValue::CSS_GRAD:
</span><span class="cx">     case CSSPrimitiveValue::CSS_TURN:
</span><del>-        b = (unitflags &amp; FAngle);
</del><ins>+        b = (unitFlags &amp; FAngle);
</ins><span class="cx">         break;
</span><span class="cx"> #if ENABLE(CSS_IMAGE_RESOLUTION) || ENABLE(RESOLUTION_MEDIA_QUERY)
</span><span class="cx">     case CSSPrimitiveValue::CSS_DPPX:
</span><span class="cx">     case CSSPrimitiveValue::CSS_DPI:
</span><span class="cx">     case CSSPrimitiveValue::CSS_DPCM:
</span><del>-        b = (unitflags &amp; FResolution);
</del><ins>+        b = (unitFlags &amp; FResolution);
</ins><span class="cx">         break;
</span><span class="cx"> #endif
</span><span class="cx">     case CSSPrimitiveValue::CSS_HZ:
</span><span class="lines">@@ -1697,20 +1699,19 @@
</span><span class="cx">     default:
</span><span class="cx">         break;
</span><span class="cx">     }
</span><del>-    if (b &amp;&amp; unitflags &amp; FNonNeg &amp;&amp; value.fValue &lt; 0)
</del><ins>+    if (b &amp;&amp; unitFlags &amp; FNonNeg &amp;&amp; valueWithCalculation.value().fValue &lt; 0)
</ins><span class="cx">         b = false;
</span><del>-    if (b &amp;&amp; std::isinf(value.fValue))
</del><ins>+    if (b &amp;&amp; std::isinf(valueWithCalculation.value().fValue))
</ins><span class="cx">         b = false;
</span><span class="cx">     return b;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline Ref&lt;CSSPrimitiveValue&gt; CSSParser::createPrimitiveNumericValue(CSSParserValue&amp; value)
</del><ins>+inline Ref&lt;CSSPrimitiveValue&gt; CSSParser::createPrimitiveNumericValue(ValueWithCalculation&amp; valueWithCalculation)
</ins><span class="cx"> {
</span><del>-    if (m_parsedCalculation) {
-        ASSERT(isCalculation(value));
-        return CSSPrimitiveValue::create(m_parsedCalculation.release());
-    }
</del><ins>+    if (valueWithCalculation.calculation())
+        return CSSPrimitiveValue::create(valueWithCalculation.calculation());
</ins><span class="cx"> 
</span><ins>+    CSSParserValue&amp; value = valueWithCalculation;
</ins><span class="cx"> #if ENABLE(CSS_IMAGE_RESOLUTION) || ENABLE(RESOLUTION_MEDIA_QUERY)
</span><span class="cx">     ASSERT((value.unit &gt;= CSSPrimitiveValue::CSS_NUMBER &amp;&amp; value.unit &lt;= CSSPrimitiveValue::CSS_KHZ)
</span><span class="cx">         || (value.unit &gt;= CSSPrimitiveValue::CSS_TURN &amp;&amp; value.unit &lt;= CSSPrimitiveValue::CSS_CHS)
</span><span class="lines">@@ -1740,43 +1741,44 @@
</span><span class="cx">     return value.unit == CSSParserValue::Operator &amp;&amp; value.iValue == '/';
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool CSSParser::validWidth(CSSParserValue&amp; value)
</del><ins>+bool CSSParser::validateWidth(ValueWithCalculation&amp; valueWithCalculation)
</ins><span class="cx"> {
</span><del>-    int id = value.id;
</del><ins>+    int id = valueWithCalculation.value().id;
</ins><span class="cx">     if (id == CSSValueIntrinsic || id == CSSValueMinIntrinsic || id == CSSValueWebkitMinContent || id == CSSValueWebkitMaxContent || id == CSSValueWebkitFillAvailable || id == CSSValueWebkitFitContent)
</span><span class="cx">         return true;
</span><del>-    return !id &amp;&amp; validUnit(value, FLength | FPercent | FNonNeg);
</del><ins>+    return !id &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> // FIXME: Combine this with validWidth when we support fit-content, et al, for heights.
</span><del>-bool CSSParser::validHeight(CSSParserValue&amp; value)
</del><ins>+bool CSSParser::validateHeight(ValueWithCalculation&amp; valueWithCalculation)
</ins><span class="cx"> {
</span><del>-    int id = value.id;
</del><ins>+    int id = valueWithCalculation.value().id;
</ins><span class="cx">     if (id == CSSValueIntrinsic || id == CSSValueMinIntrinsic)
</span><span class="cx">         return true;
</span><del>-    return !id &amp;&amp; validUnit(value, FLength | FPercent | FNonNeg);
</del><ins>+    return !id &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline PassRefPtr&lt;CSSPrimitiveValue&gt; CSSParser::parseValidPrimitive(CSSValueID identifier, CSSParserValue&amp; value)
</del><ins>+inline PassRefPtr&lt;CSSPrimitiveValue&gt; CSSParser::parseValidPrimitive(CSSValueID identifier, ValueWithCalculation&amp; valueWithCalculation)
</ins><span class="cx"> {
</span><span class="cx">     if (identifier)
</span><span class="cx">         return cssValuePool().createIdentifierValue(identifier);
</span><del>-    if (value.unit == CSSPrimitiveValue::CSS_STRING)
-        return createPrimitiveStringValue(value);
-    if (value.unit &gt;= CSSPrimitiveValue::CSS_NUMBER &amp;&amp; value.unit &lt;= CSSPrimitiveValue::CSS_KHZ)
-        return createPrimitiveNumericValue(value);
-    if (value.unit &gt;= CSSPrimitiveValue::CSS_TURN &amp;&amp; value.unit &lt;= CSSPrimitiveValue::CSS_CHS)
-        return createPrimitiveNumericValue(value);
-    if (value.unit &gt;= CSSPrimitiveValue::CSS_VW &amp;&amp; value.unit &lt;= CSSPrimitiveValue::CSS_VMAX)
-        return createPrimitiveNumericValue(value);
</del><ins>+
+    if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_STRING)
+        return createPrimitiveStringValue(valueWithCalculation);
+    if (valueWithCalculation.value().unit &gt;= CSSPrimitiveValue::CSS_NUMBER &amp;&amp; valueWithCalculation.value().unit &lt;= CSSPrimitiveValue::CSS_KHZ)
+        return createPrimitiveNumericValue(valueWithCalculation);
+    if (valueWithCalculation.value().unit &gt;= CSSPrimitiveValue::CSS_TURN &amp;&amp; valueWithCalculation.value().unit &lt;= CSSPrimitiveValue::CSS_CHS)
+        return createPrimitiveNumericValue(valueWithCalculation);
+    if (valueWithCalculation.value().unit &gt;= CSSPrimitiveValue::CSS_VW &amp;&amp; valueWithCalculation.value().unit &lt;= CSSPrimitiveValue::CSS_VMAX)
+        return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx"> #if ENABLE(CSS_IMAGE_RESOLUTION) || ENABLE(RESOLUTION_MEDIA_QUERY)
</span><del>-    if (value.unit &gt;= CSSPrimitiveValue::CSS_DPPX &amp;&amp; value.unit &lt;= CSSPrimitiveValue::CSS_DPCM)
-        return createPrimitiveNumericValue(value);
</del><ins>+    if (valueWithCalculation.value().unit &gt;= CSSPrimitiveValue::CSS_DPPX &amp;&amp; valueWithCalculation.value().unit &lt;= CSSPrimitiveValue::CSS_DPCM)
+        return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx"> #endif
</span><del>-    if (value.unit &gt;= CSSParserValue::Q_EMS)
-        return CSSPrimitiveValue::createAllowingMarginQuirk(value.fValue, CSSPrimitiveValue::CSS_EMS);
-    if (isCalculation(value))
-        return CSSPrimitiveValue::create(m_parsedCalculation.release());
</del><ins>+    if (valueWithCalculation.value().unit &gt;= CSSParserValue::Q_EMS)
+        return CSSPrimitiveValue::createAllowingMarginQuirk(valueWithCalculation.value().fValue, CSSPrimitiveValue::CSS_EMS);
+    if (valueWithCalculation.calculation())
+        return CSSPrimitiveValue::create(valueWithCalculation.calculation());
</ins><span class="cx"> 
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="lines">@@ -1799,20 +1801,12 @@
</span><span class="cx"> 
</span><span class="cx"> bool CSSParser::parseValue(CSSPropertyID propId, bool important)
</span><span class="cx"> {
</span><del>-    if (!m_valueList)
</del><ins>+    if (!m_valueList || !m_valueList-&gt;current())
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    CSSParserValue* value = m_valueList-&gt;current();
</del><ins>+    ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
+    CSSValueID id = valueWithCalculation.value().id;
</ins><span class="cx"> 
</span><del>-    if (!value)
-        return false;
-
-    // Note: m_parsedCalculation is used to pass the calc value to validUnit and then cleared at the end of this function.
-    // FIXME: This is to avoid having to pass parsedCalc to all validUnit callers.
-    ASSERT(!m_parsedCalculation);
-    
-    CSSValueID id = value-&gt;id;
-
</del><span class="cx">     unsigned num = inShorthand() ? 1 : m_valueList-&gt;size();
</span><span class="cx"> 
</span><span class="cx">     if (id == CSSValueInherit) {
</span><span class="lines">@@ -1875,7 +1869,7 @@
</span><span class="cx">     case CSSPropertyClip:                 // &lt;shape&gt; | auto | inherit
</span><span class="cx">         if (id == CSSValueAuto)
</span><span class="cx">             validPrimitive = true;
</span><del>-        else if (value-&gt;unit == CSSParserValue::Function)
</del><ins>+        else if (valueWithCalculation.value().unit == CSSParserValue::Function)
</ins><span class="cx">             return parseClipShape(propId, important);
</span><span class="cx">         break;
</span><span class="cx"> 
</span><span class="lines">@@ -1933,7 +1927,7 @@
</span><span class="cx">     }
</span><span class="cx">     case CSSPropertyWebkitBorderHorizontalSpacing:
</span><span class="cx">     case CSSPropertyWebkitBorderVerticalSpacing:
</span><del>-        validPrimitive = validUnit(*value, FLength | FNonNeg);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FLength | FNonNeg);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyOutlineColor:        // &lt;color&gt; | invert | inherit
</span><span class="cx">         // Outline color has &quot;invert&quot; as additional keyword.
</span><span class="lines">@@ -1986,6 +1980,7 @@
</span><span class="cx">         // zoom-in | zoom-out | all-scroll | -webkit-grab | -webkit-grabbing | -webkit-zoom-in |
</span><span class="cx">         // -webkit-zoom-out ] ] | inherit
</span><span class="cx">         RefPtr&lt;CSSValueList&gt; list;
</span><ins>+        CSSParserValue* value = &amp;valueWithCalculation.value();
</ins><span class="cx">         while (value) {
</span><span class="cx">             RefPtr&lt;CSSValue&gt; image;
</span><span class="cx">             if (value-&gt;unit == CSSPrimitiveValue::CSS_URI) {
</span><span class="lines">@@ -2028,7 +2023,8 @@
</span><span class="cx">             value = m_valueList-&gt;next(); // comma
</span><span class="cx">         }
</span><span class="cx">         if (list) {
</span><del>-            if (!value) { // no value after url list (MSIE 5 compatibility)
</del><ins>+            if (!value) {
+                // no value after url list (MSIE 5 compatibility)
</ins><span class="cx">                 if (list-&gt;length() != 1)
</span><span class="cx">                     return false;
</span><span class="cx">             } else if (inQuirksMode() &amp;&amp; value-&gt;id == CSSValueHand) // MSIE 5 compatibility :/
</span><span class="lines">@@ -2040,7 +2036,8 @@
</span><span class="cx">             break;
</span><span class="cx">         } else if (value) {
</span><span class="cx">             id = value-&gt;id;
</span><del>-            if (inQuirksMode() &amp;&amp; value-&gt;id == CSSValueHand) { // MSIE 5 compatibility :/
</del><ins>+            if (inQuirksMode() &amp;&amp; value-&gt;id == CSSValueHand) {
+                // MSIE 5 compatibility :/
</ins><span class="cx">                 id = CSSValuePointer;
</span><span class="cx">                 validPrimitive = true;
</span><span class="cx">             } else if ((value-&gt;id &gt;= CSSValueAuto &amp;&amp; value-&gt;id &lt;= CSSValueWebkitZoomOut) || value-&gt;id == CSSValueCopy || value-&gt;id == CSSValueNone)
</span><span class="lines">@@ -2114,17 +2111,17 @@
</span><span class="cx">         if (id == CSSValueNone) {
</span><span class="cx">             parsedValue = cssValuePool().createIdentifierValue(CSSValueNone);
</span><span class="cx">             m_valueList-&gt;next();
</span><del>-        } else if (value-&gt;unit == CSSPrimitiveValue::CSS_URI) {
-            parsedValue = CSSImageValue::create(completeURL(value-&gt;string));
</del><ins>+        } else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_URI) {
+            parsedValue = CSSImageValue::create(completeURL(valueWithCalculation.value().string));
</ins><span class="cx">             m_valueList-&gt;next();
</span><del>-        } else if (isGeneratedImageValue(*value)) {
</del><ins>+        } else if (isGeneratedImageValue(valueWithCalculation)) {
</ins><span class="cx">             if (parseGeneratedImage(*m_valueList, parsedValue))
</span><span class="cx">                 m_valueList-&gt;next();
</span><span class="cx">             else
</span><span class="cx">                 return false;
</span><span class="cx">         }
</span><span class="cx"> #if ENABLE(CSS_IMAGE_SET)
</span><del>-        else if (value-&gt;unit == CSSParserValue::Function &amp;&amp; equalIgnoringCase(value-&gt;function-&gt;name, &quot;-webkit-image-set(&quot;)) {
</del><ins>+        else if (valueWithCalculation.value().unit == CSSParserValue::Function &amp;&amp; equalIgnoringCase(valueWithCalculation.value().function-&gt;name, &quot;-webkit-image-set(&quot;)) {
</ins><span class="cx">             parsedValue = parseImageSet();
</span><span class="cx">             if (!parsedValue)
</span><span class="cx">                 return false;
</span><span class="lines">@@ -2147,21 +2144,21 @@
</span><span class="cx">         if (id == CSSValueThin || id == CSSValueMedium || id == CSSValueThick)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = validUnit(*value, FLength | FNonNeg);
</del><ins>+            validPrimitive = validateUnit(valueWithCalculation, FLength | FNonNeg);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyLetterSpacing:       // normal | &lt;length&gt; | inherit
</span><span class="cx">         if (id == CSSValueNormal)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = validUnit(*value, FLength);
</del><ins>+            validPrimitive = validateUnit(valueWithCalculation, FLength);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyWordSpacing:         // normal | &lt;length&gt; | &lt;percentage&gt; | inherit
</span><span class="cx">         if (id == CSSValueNormal)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = validUnit(*value, FLength | FPercent);
</del><ins>+            validPrimitive = validateUnit(valueWithCalculation, FLength | FPercent);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyTextIndent:
</span><span class="lines">@@ -2176,37 +2173,37 @@
</span><span class="cx">     case CSSPropertyWebkitPaddingEnd:
</span><span class="cx">     case CSSPropertyWebkitPaddingBefore:
</span><span class="cx">     case CSSPropertyWebkitPaddingAfter:
</span><del>-        validPrimitive = (!id &amp;&amp; validUnit(*value, FLength | FPercent | FNonNeg));
</del><ins>+        validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyMaxWidth:
</span><span class="cx">     case CSSPropertyWebkitMaxLogicalWidth:
</span><del>-        validPrimitive = (id == CSSValueNone || validWidth(*value));
</del><ins>+        validPrimitive = (id == CSSValueNone || validateWidth(valueWithCalculation));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyMinWidth:
</span><span class="cx">     case CSSPropertyWebkitMinLogicalWidth:
</span><del>-        validPrimitive = validWidth(*value);
</del><ins>+        validPrimitive = validateWidth(valueWithCalculation);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyWidth:
</span><span class="cx">     case CSSPropertyWebkitLogicalWidth:
</span><del>-        validPrimitive = (id == CSSValueAuto || validWidth(*value));
</del><ins>+        validPrimitive = (id == CSSValueAuto || validateWidth(valueWithCalculation));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyMaxHeight:
</span><span class="cx">     case CSSPropertyWebkitMaxLogicalHeight:
</span><del>-        validPrimitive = (id == CSSValueNone || validHeight(*value));
</del><ins>+        validPrimitive = (id == CSSValueNone || validateHeight(valueWithCalculation));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyMinHeight:
</span><span class="cx">     case CSSPropertyWebkitMinLogicalHeight:
</span><del>-        validPrimitive = validHeight(*value);
</del><ins>+        validPrimitive = validateHeight(valueWithCalculation);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyHeight:
</span><span class="cx">     case CSSPropertyWebkitLogicalHeight:
</span><del>-        validPrimitive = (id == CSSValueAuto || validHeight(*value));
</del><ins>+        validPrimitive = (id == CSSValueAuto || validateHeight(valueWithCalculation));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyFontSize:
</span><span class="lines">@@ -2222,7 +2219,7 @@
</span><span class="cx">         if (id &gt;= CSSValueBaseline &amp;&amp; id &lt;= CSSValueWebkitBaselineMiddle)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = (!id &amp;&amp; validUnit(*value, FLength | FPercent));
</del><ins>+            validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyBottom:               // &lt;length&gt; | &lt;percentage&gt; | auto | inherit
</span><span class="lines">@@ -2240,14 +2237,14 @@
</span><span class="cx">         if (id == CSSValueAuto)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = (!id &amp;&amp; validUnit(*value, FLength | FPercent));
</del><ins>+            validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyZIndex:              // auto | &lt;integer&gt; | inherit
</span><span class="cx">         if (id == CSSValueAuto)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = (!id &amp;&amp; validUnit(*value, FInteger, CSSQuirksMode));
</del><ins>+            validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FInteger, CSSQuirksMode));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyOrphans: // &lt;integer&gt; | inherit | auto (We've added support for auto for backwards compatibility)
</span><span class="lines">@@ -2255,7 +2252,7 @@
</span><span class="cx">         if (id == CSSValueAuto)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = (!id &amp;&amp; validUnit(*value, FPositiveInteger, CSSQuirksMode));
</del><ins>+            validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FPositiveInteger, CSSQuirksMode));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyLineHeight:
</span><span class="lines">@@ -2305,7 +2302,7 @@
</span><span class="cx">         if (id == CSSValueNormal || id == CSSValueReset || id == CSSValueDocument)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = (!id &amp;&amp; validUnit(*value, FNumber | FPercent | FNonNeg, CSSStrictMode));
</del><ins>+            validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FNumber | FPercent | FNonNeg, CSSStrictMode));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertySrc: // Only used within @font-face and @-webkit-filter, so cannot use inherit | initial or be !important. This is a list of urls or local references.
</span><span class="lines">@@ -2371,17 +2368,17 @@
</span><span class="cx">     case CSSPropertyBorderBottomRightRadius: {
</span><span class="cx">         if (num != 1 &amp;&amp; num != 2)
</span><span class="cx">             return false;
</span><del>-        validPrimitive = validUnit(*value, FLength | FPercent | FNonNeg);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg);
</ins><span class="cx">         if (!validPrimitive)
</span><span class="cx">             return false;
</span><del>-        RefPtr&lt;CSSPrimitiveValue&gt; parsedValue1 = createPrimitiveNumericValue(*value);
</del><ins>+        RefPtr&lt;CSSPrimitiveValue&gt; parsedValue1 = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">         RefPtr&lt;CSSPrimitiveValue&gt; parsedValue2;
</span><span class="cx">         if (num == 2) {
</span><del>-            value = m_valueList-&gt;next();
-            validPrimitive = validUnit(*value, FLength | FPercent | FNonNeg);
</del><ins>+            ValueWithCalculation nextValueWithCalculation(*m_valueList-&gt;next());
+            validPrimitive = validateUnit(nextValueWithCalculation, FLength | FPercent | FNonNeg);
</ins><span class="cx">             if (!validPrimitive)
</span><span class="cx">                 return false;
</span><del>-            parsedValue2 = createPrimitiveNumericValue(*value);
</del><ins>+            parsedValue2 = createPrimitiveNumericValue(nextValueWithCalculation);
</ins><span class="cx">         } else
</span><span class="cx">             parsedValue2 = parsedValue1;
</span><span class="cx"> 
</span><span class="lines">@@ -2389,7 +2386,7 @@
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx">     case CSSPropertyTabSize:
</span><del>-        validPrimitive = validUnit(*value, FInteger | FNonNeg);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FInteger | FNonNeg);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitAspectRatio:
</span><span class="cx">         return parseAspectRatio(important);
</span><span class="lines">@@ -2397,7 +2394,7 @@
</span><span class="cx">     case CSSPropertyWebkitBorderRadius:
</span><span class="cx">         return parseBorderRadius(propId, important);
</span><span class="cx">     case CSSPropertyOutlineOffset:
</span><del>-        validPrimitive = validUnit(*value, FLength);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FLength);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyTextShadow: // CSS2 property, dropped in CSS2.1, back in CSS3, so treat as CSS3
</span><span class="cx">     case CSSPropertyBoxShadow:
</span><span class="lines">@@ -2420,17 +2417,17 @@
</span><span class="cx">         else {
</span><span class="cx">             if (num != 1 &amp;&amp; num != 2)
</span><span class="cx">                 return false;
</span><del>-            validPrimitive = validUnit(*value, FPositiveInteger);
</del><ins>+            validPrimitive = validateUnit(valueWithCalculation, FPositiveInteger);
</ins><span class="cx">             if (!validPrimitive)
</span><span class="cx">                 return false;
</span><del>-            RefPtr&lt;CSSPrimitiveValue&gt; parsedValue1 = createPrimitiveNumericValue(*value);
</del><ins>+            RefPtr&lt;CSSPrimitiveValue&gt; parsedValue1 = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">             RefPtr&lt;CSSPrimitiveValue&gt; parsedValue2;
</span><span class="cx">             if (num == 2) {
</span><del>-                value = m_valueList-&gt;next();
-                validPrimitive = validUnit(*value, FPositiveInteger);
</del><ins>+                ValueWithCalculation nextValueWithCalculation(*m_valueList-&gt;next());
+                validPrimitive = validateUnit(nextValueWithCalculation, FPositiveInteger);
</ins><span class="cx">                 if (!validPrimitive)
</span><span class="cx">                     return false;
</span><del>-                parsedValue2 = createPrimitiveNumericValue(*value);
</del><ins>+                parsedValue2 = createPrimitiveNumericValue(nextValueWithCalculation);
</ins><span class="cx">             } else
</span><span class="cx">                 parsedValue2 = parsedValue1;
</span><span class="cx">             addProperty(propId, createPrimitiveValuePair(parsedValue1.release(), parsedValue2.release()), important);
</span><span class="lines">@@ -2445,16 +2442,16 @@
</span><span class="cx">             return parseReflect(propId, important);
</span><span class="cx">         break;
</span><span class="cx">     case CSSPropertyOpacity:
</span><del>-        validPrimitive = validUnit(*value, FNumber);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FNumber);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitBoxFlex:
</span><del>-        validPrimitive = validUnit(*value, FNumber);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FNumber);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitBoxFlexGroup:
</span><del>-        validPrimitive = validUnit(*value, FInteger | FNonNeg, CSSStrictMode);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FInteger | FNonNeg, CSSStrictMode);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitBoxOrdinalGroup:
</span><del>-        validPrimitive = validUnit(*value, FInteger | FNonNeg, CSSStrictMode) &amp;&amp; value-&gt;fValue;
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FInteger | FNonNeg, CSSStrictMode) &amp;&amp; valueWithCalculation.value().fValue;
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitFilter:
</span><span class="cx"> #if ENABLE(FILTERS_LEVEL_2)
</span><span class="lines">@@ -2495,16 +2492,16 @@
</span><span class="cx">         if (id == CSSValueAuto)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = (!id &amp;&amp; validUnit(*value, FLength | FPercent | FNonNeg));
</del><ins>+            validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg));
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyFlexGrow:
</span><span class="cx">     case CSSPropertyFlexShrink:
</span><del>-        validPrimitive = validUnit(*value, FNumber | FNonNeg);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FNumber | FNonNeg);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyOrder:
</span><del>-        if (validUnit(*value, FInteger, CSSStrictMode)) {
</del><ins>+        if (validateUnit(valueWithCalculation, FInteger, CSSStrictMode)) {
</ins><span class="cx">             // We restrict the smallest value to int min + 2 because we use int min and int min + 1 as special values in a hash set.
</span><del>-            double result = std::max&lt;double&gt;(std::numeric_limits&lt;int&gt;::min() + 2, parsedDouble(*value, ReleaseParsedCalcValue));
</del><ins>+            double result = std::max&lt;double&gt;(std::numeric_limits&lt;int&gt;::min() + 2, parsedDouble(valueWithCalculation));
</ins><span class="cx">             parsedValue = cssValuePool().createValue(result, CSSPrimitiveValue::CSS_NUMBER);
</span><span class="cx">             m_valueList-&gt;next();
</span><span class="cx">         }
</span><span class="lines">@@ -2515,19 +2512,19 @@
</span><span class="cx">         if (id == CSSValueSmall || id == CSSValueLarge || id == CSSValueMedium)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = validUnit(*value, FLength | FPercent);
</del><ins>+            validPrimitive = validateUnit(valueWithCalculation, FLength | FPercent);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitMarqueeRepetition:
</span><span class="cx">         if (id == CSSValueInfinite)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = validUnit(*value, FInteger | FNonNeg);
</del><ins>+            validPrimitive = validateUnit(valueWithCalculation, FInteger | FNonNeg);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitMarqueeSpeed:
</span><span class="cx">         if (id == CSSValueNormal || id == CSSValueSlow || id == CSSValueFast)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = validUnit(*value, FTime | FInteger | FNonNeg);
</del><ins>+            validPrimitive = validateUnit(valueWithCalculation, FTime | FInteger | FNonNeg);
</ins><span class="cx">         break;
</span><span class="cx"> #if ENABLE(CSS_REGIONS)
</span><span class="cx">     case CSSPropertyWebkitFlowInto:
</span><span class="lines">@@ -2574,8 +2571,8 @@
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else {
</span><span class="cx">             // Accepting valueless numbers is a quirk of the -webkit prefixed version of the property.
</span><del>-            if (validUnit(*value, FNumber | FLength | FNonNeg)) {
-                RefPtr&lt;CSSValue&gt; val = createPrimitiveNumericValue(*value);
</del><ins>+            if (validateUnit(valueWithCalculation, FNumber | FLength | FNonNeg)) {
+                RefPtr&lt;CSSValue&gt; val = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">                 if (val) {
</span><span class="cx">                     addProperty(propId, val.release(), important);
</span><span class="cx">                     return true;
</span><span class="lines">@@ -2695,19 +2692,19 @@
</span><span class="cx">             id == CSSValueMedium || id == CSSValueThick)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = !id &amp;&amp; validUnit(*value, FNumber | FLength | FPercent);
</del><ins>+            validPrimitive = !id &amp;&amp; validateUnit(valueWithCalculation, FNumber | FLength | FPercent);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyColumnCount:
</span><span class="cx">         if (id == CSSValueAuto)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = !id &amp;&amp; validUnit(*value, FPositiveInteger, CSSQuirksMode);
</del><ins>+            validPrimitive = !id &amp;&amp; validateUnit(valueWithCalculation, FPositiveInteger, CSSQuirksMode);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyColumnGap: // normal | &lt;length&gt;
</span><span class="cx">         if (id == CSSValueNormal)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = validUnit(*value, FLength | FNonNeg);
</del><ins>+            validPrimitive = validateUnit(valueWithCalculation, FLength | FNonNeg);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitColumnAxis:
</span><span class="cx">         if (id == CSSValueHorizontal || id == CSSValueVertical || id == CSSValueAuto)
</span><span class="lines">@@ -2720,7 +2717,7 @@
</span><span class="cx">     case CSSPropertyColumnSpan: // none | all | 1 (will be dropped in the unprefixed property)
</span><span class="cx">         if (id == CSSValueAll || id == CSSValueNone)
</span><span class="cx">             validPrimitive = true;
</span><del>-        else if (validUnit(*value, FNumber | FNonNeg) &amp;&amp; parsedDouble(*value, ReleaseParsedCalcValue) == 1) {
</del><ins>+        else if (validateUnit(valueWithCalculation, FNumber | FNonNeg) &amp;&amp; parsedDouble(valueWithCalculation) == 1) {
</ins><span class="cx">             addProperty(CSSPropertyColumnSpan, cssValuePool().createValue(1, CSSPrimitiveValue::CSS_NUMBER), important);
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="lines">@@ -2730,9 +2727,7 @@
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else {
</span><span class="cx">             // Always parse this property in strict mode, since it would be ambiguous otherwise when used in the 'columns' shorthand property.
</span><del>-            validPrimitive = validUnit(*value, FLength | FNonNeg, CSSStrictMode) &amp;&amp; parsedDouble(*value);
-            if (!validPrimitive)
-                m_parsedCalculation.clear();
</del><ins>+            validPrimitive = validateUnit(valueWithCalculation, FLength | FNonNeg, CSSStrictMode) &amp;&amp; parsedDouble(valueWithCalculation);
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     // End of CSS3 properties
</span><span class="lines">@@ -2742,7 +2737,7 @@
</span><span class="cx">     case CSSPropertyWebkitLineClamp:
</span><span class="cx">         // When specifying number of lines, don't allow 0 as a valid value
</span><span class="cx">         // When specifying either type of unit, require non-negative integers
</span><del>-        validPrimitive = (!id &amp;&amp; (value-&gt;unit == CSSPrimitiveValue::CSS_PERCENTAGE || value-&gt;fValue) &amp;&amp; validUnit(*value, FInteger | FPercent | FNonNeg, CSSQuirksMode));
</del><ins>+        validPrimitive = (!id &amp;&amp; (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_PERCENTAGE || valueWithCalculation.value().fValue) &amp;&amp; validateUnit(valueWithCalculation, FInteger | FPercent | FNonNeg, CSSQuirksMode));
</ins><span class="cx">         break;
</span><span class="cx"> #if ENABLE(IOS_TEXT_AUTOSIZING)
</span><span class="cx">     case CSSPropertyWebkitTextSizeAdjust:
</span><span class="lines">@@ -2750,36 +2745,36 @@
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else {
</span><span class="cx">             // FIXME: Handle multilength case where we allow relative units.
</span><del>-            validPrimitive = (!id &amp;&amp; validUnit(*value, FPercent | FNonNeg, CSSStrictMode));
</del><ins>+            validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FPercent | FNonNeg, CSSStrictMode));
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyWebkitFontSizeDelta:           // &lt;length&gt;
</span><del>-        validPrimitive = validUnit(*value, FLength);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FLength);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyWebkitHyphenateCharacter:
</span><del>-        if (id == CSSValueAuto || value-&gt;unit == CSSPrimitiveValue::CSS_STRING)
</del><ins>+        if (id == CSSValueAuto || valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_STRING)
</ins><span class="cx">             validPrimitive = true;
</span><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyWebkitHyphenateLimitBefore:
</span><span class="cx">     case CSSPropertyWebkitHyphenateLimitAfter:
</span><del>-        if (id == CSSValueAuto || validUnit(*value, FInteger | FNonNeg, CSSStrictMode))
</del><ins>+        if (id == CSSValueAuto || validateUnit(valueWithCalculation, FInteger | FNonNeg, CSSStrictMode))
</ins><span class="cx">             validPrimitive = true;
</span><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyWebkitHyphenateLimitLines:
</span><del>-        if (id == CSSValueNoLimit || validUnit(*value, FInteger | FNonNeg, CSSStrictMode))
</del><ins>+        if (id == CSSValueNoLimit || validateUnit(valueWithCalculation, FInteger | FNonNeg, CSSStrictMode))
</ins><span class="cx">             validPrimitive = true;
</span><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyWebkitLineGrid:
</span><span class="cx">         if (id == CSSValueNone)
</span><span class="cx">             validPrimitive = true;
</span><del>-        else if (value-&gt;unit == CSSPrimitiveValue::CSS_IDENT) {
-            String lineGridValue = String(value-&gt;string);
</del><ins>+        else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_IDENT) {
+            String lineGridValue = String(valueWithCalculation.value().string);
</ins><span class="cx">             if (!lineGridValue.isEmpty()) {
</span><span class="cx">                 addProperty(propId, cssValuePool().createValue(lineGridValue, CSSPrimitiveValue::CSS_STRING), important);
</span><span class="cx">                 return true;
</span><span class="lines">@@ -2787,13 +2782,13 @@
</span><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitLocale:
</span><del>-        if (id == CSSValueAuto || value-&gt;unit == CSSPrimitiveValue::CSS_STRING)
</del><ins>+        if (id == CSSValueAuto || valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_STRING)
</ins><span class="cx">             validPrimitive = true;
</span><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(DASHBOARD_SUPPORT)
</span><span class="cx">     case CSSPropertyWebkitDashboardRegion: // &lt;dashboard-region&gt; | &lt;dashboard-region&gt;
</span><del>-        if (value-&gt;unit == CSSParserValue::Function || id == CSSValueNone)
</del><ins>+        if (valueWithCalculation.value().unit == CSSParserValue::Function || id == CSSValueNone)
</ins><span class="cx">             return parseDashboardRegions(propId, important);
</span><span class="cx">         break;
</span><span class="cx"> #endif
</span><span class="lines">@@ -2957,15 +2952,15 @@
</span><span class="cx">         parsedValue = parseShapeProperty(propId);
</span><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitShapeMargin:
</span><del>-        validPrimitive = (RuntimeEnabledFeatures::sharedFeatures().cssShapesEnabled() &amp;&amp; !id &amp;&amp; validUnit(*value, FLength | FPercent | FNonNeg));
</del><ins>+        validPrimitive = (RuntimeEnabledFeatures::sharedFeatures().cssShapesEnabled() &amp;&amp; !id &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg));
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWebkitShapeImageThreshold:
</span><del>-        validPrimitive = (RuntimeEnabledFeatures::sharedFeatures().cssShapesEnabled() &amp;&amp; !id &amp;&amp; validUnit(*value, FNumber));
</del><ins>+        validPrimitive = (RuntimeEnabledFeatures::sharedFeatures().cssShapesEnabled() &amp;&amp; !id &amp;&amp; validateUnit(valueWithCalculation, FNumber));
</ins><span class="cx">         break;
</span><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CSS_IMAGE_ORIENTATION)
</span><span class="cx">     case CSSPropertyImageOrientation:
</span><del>-        validPrimitive = !id &amp;&amp; validUnit(*value, FAngle);
</del><ins>+        validPrimitive = !id &amp;&amp; validateUnit(valueWithCalculation, FAngle);
</ins><span class="cx">         break;
</span><span class="cx"> #endif
</span><span class="cx"> #if ENABLE(CSS_IMAGE_RESOLUTION)
</span><span class="lines">@@ -3115,10 +3110,10 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (validPrimitive) {
</span><del>-        parsedValue = parseValidPrimitive(id, *value);
</del><ins>+        parsedValue = parseValidPrimitive(id, valueWithCalculation);
</ins><span class="cx">         m_valueList-&gt;next();
</span><span class="cx">     }
</span><del>-    ASSERT(!m_parsedCalculation);
</del><ins>+
</ins><span class="cx">     if (parsedValue) {
</span><span class="cx">         if (!m_valueList-&gt;current() || inShorthand()) {
</span><span class="cx">             addProperty(propId, parsedValue.release(), important);
</span><span class="lines">@@ -3221,16 +3216,17 @@
</span><span class="cx"> bool CSSParser::parseNonElementSnapPoints(CSSPropertyID propId, bool important)
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;CSSValueList&gt; values = CSSValueList::createSpaceSeparated();
</span><del>-    while (CSSParserValue* val = m_valueList-&gt;current()) {
-        if (validUnit(*val, FPercent | FLength))
-            values-&gt;append(createPrimitiveNumericValue(*val));
-        else if (val-&gt;unit == CSSParserValue::Function
-            &amp;&amp; val-&gt;function-&gt;args
-            &amp;&amp; val-&gt;function-&gt;args-&gt;size() == 1
-            &amp;&amp; equalIgnoringCase(val-&gt;function-&gt;name, &quot;repeat(&quot;)) {
-            CSSParserValue&amp; parserVal = *val-&gt;function-&gt;args.get()-&gt;current();
-            if (validUnit(parserVal, FLength | FPercent)) {
-                values-&gt;append(cssValuePool().createValue(LengthRepeat::create(createPrimitiveNumericValue(parserVal))));
</del><ins>+    while (CSSParserValue* value = m_valueList-&gt;current()) {
+        ValueWithCalculation valueWithCalculation(*value);
+        if (validateUnit(valueWithCalculation, FPercent | FLength))
+            values-&gt;append(createPrimitiveNumericValue(valueWithCalculation));
+        else if (value-&gt;unit == CSSParserValue::Function
+            &amp;&amp; value-&gt;function-&gt;args
+            &amp;&amp; value-&gt;function-&gt;args-&gt;size() == 1
+            &amp;&amp; equalIgnoringCase(value-&gt;function-&gt;name, &quot;repeat(&quot;)) {
+            ValueWithCalculation argumentWithCalculation(*value-&gt;function-&gt;args.get()-&gt;current());
+            if (validateUnit(argumentWithCalculation, FLength | FPercent)) {
+                values-&gt;append(cssValuePool().createValue(LengthRepeat::create(createPrimitiveNumericValue(argumentWithCalculation))));
</ins><span class="cx">                 m_valueList-&gt;next();
</span><span class="cx">                 if (m_valueList-&gt;current())
</span><span class="cx">                     return false;
</span><span class="lines">@@ -3253,15 +3249,15 @@
</span><span class="cx">     RefPtr&lt;CSSValueList&gt; position = CSSValueList::createSpaceSeparated();
</span><span class="cx">     if (m_valueList-&gt;size() != 2)
</span><span class="cx">         return false;
</span><del>-    CSSParserValue* curParserVal = m_valueList-&gt;current();
-    if (!validUnit(*curParserVal, FPercent | FLength))
</del><ins>+    ValueWithCalculation valueXWithCalculation(*m_valueList-&gt;current());
+    if (!validateUnit(valueXWithCalculation, FPercent | FLength))
</ins><span class="cx">         return false;
</span><del>-    RefPtr&lt;CSSValue&gt; cssValueX = createPrimitiveNumericValue(*curParserVal);
-    m_valueList-&gt;next();
-    curParserVal = m_valueList-&gt;current();
-    if (!validUnit(*curParserVal, FPercent | FLength))
</del><ins>+    RefPtr&lt;CSSValue&gt; cssValueX = createPrimitiveNumericValue(valueXWithCalculation);
+
+    ValueWithCalculation valueYWithCalculation(*m_valueList-&gt;next());
+    if (!validateUnit(valueYWithCalculation, FPercent | FLength))
</ins><span class="cx">         return false;
</span><del>-    RefPtr&lt;CSSValue&gt; cssValueY = createPrimitiveNumericValue(*curParserVal);
</del><ins>+    RefPtr&lt;CSSValue&gt; cssValueY = createPrimitiveNumericValue(valueYWithCalculation);
</ins><span class="cx">     position-&gt;append(cssValueX.releaseNonNull());
</span><span class="cx">     position-&gt;append(cssValueY.releaseNonNull());
</span><span class="cx">     addProperty(propId, position, important);
</span><span class="lines">@@ -3273,15 +3269,15 @@
</span><span class="cx"> {
</span><span class="cx">     RefPtr&lt;CSSValueList&gt; positions = CSSValueList::createSpaceSeparated();
</span><span class="cx">     while (m_valueList-&gt;current()) {
</span><del>-        CSSParserValue&amp; parsedValueX = *m_valueList-&gt;current();
</del><ins>+        ValueWithCalculation valueXWithCalculation(*m_valueList-&gt;current());
</ins><span class="cx">         // Don't accept odd-length lists of coordinates.
</span><span class="cx">         if (!m_valueList-&gt;next())
</span><span class="cx">             return false;
</span><del>-        CSSParserValue&amp; parsedValueY = *m_valueList-&gt;current();
-        if (!validUnit(parsedValueX, FPercent | FLength) || !validUnit(parsedValueY, FPercent | FLength))
</del><ins>+        ValueWithCalculation valueYWithCalculation(*m_valueList-&gt;current());
+        if (!validateUnit(valueXWithCalculation, FPercent | FLength) || !validateUnit(valueYWithCalculation, FPercent | FLength))
</ins><span class="cx">             return false;
</span><del>-        positions-&gt;append(createPrimitiveNumericValue(parsedValueX));
-        positions-&gt;append(createPrimitiveNumericValue(parsedValueY));
</del><ins>+        positions-&gt;append(createPrimitiveNumericValue(valueXWithCalculation));
+        positions-&gt;append(createPrimitiveNumericValue(valueYWithCalculation));
</ins><span class="cx">         m_valueList-&gt;next();
</span><span class="cx">     }
</span><span class="cx">     if (positions-&gt;length()) {
</span><span class="lines">@@ -3774,12 +3770,14 @@
</span><span class="cx">             return PageSize;
</span><span class="cx">         }
</span><span class="cx">         return None;
</span><del>-    case CSSValueInvalid:
-        if (validUnit(value, FLength | FNonNeg) &amp;&amp; (prevParamType == None || prevParamType == Length)) {
-            parsedValues.append(createPrimitiveNumericValue(value));
</del><ins>+    case CSSValueInvalid: {
+        ValueWithCalculation valueWithCalculation(value);
+        if (validateUnit(valueWithCalculation, FLength | FNonNeg) &amp;&amp; (prevParamType == None || prevParamType == Length)) {
+            parsedValues.append(createPrimitiveNumericValue(valueWithCalculation));
</ins><span class="cx">             return Length;
</span><span class="cx">         }
</span><span class="cx">         return None;
</span><ins>+    }
</ins><span class="cx">     default:
</span><span class="cx">         return None;
</span><span class="cx">     }
</span><span class="lines">@@ -3975,8 +3973,9 @@
</span><span class="cx">             percent = 50;
</span><span class="cx">         return cssValuePool().createValue(percent, CSSPrimitiveValue::CSS_PERCENTAGE);
</span><span class="cx">     }
</span><del>-    if (validUnit(*valueList.current(), FPercent | FLength))
-        return createPrimitiveNumericValue(*valueList.current());
</del><ins>+    ValueWithCalculation valueWithCalculation(*valueList.current());
+    if (validateUnit(valueWithCalculation, FPercent | FLength))
+        return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -3991,8 +3990,9 @@
</span><span class="cx">             percent = 50;
</span><span class="cx">         return cssValuePool().createValue(percent, CSSPrimitiveValue::CSS_PERCENTAGE);
</span><span class="cx">     }
</span><del>-    if (validUnit(*valueList.current(), FPercent | FLength))
-        return createPrimitiveNumericValue(*valueList.current());
</del><ins>+    ValueWithCalculation valueWithCalculation(*valueList.current());
+    if (validateUnit(valueWithCalculation, FPercent | FLength))
+        return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -4028,19 +4028,17 @@
</span><span class="cx"> 
</span><span class="cx">         return cssValuePool().createValue(percent, CSSPrimitiveValue::CSS_PERCENTAGE);
</span><span class="cx">     }
</span><del>-    if (validUnit(*valueList.current(), FPercent | FLength)) {
</del><ins>+    ValueWithCalculation valueWithCalculation(*valueList.current());
+    if (validateUnit(valueWithCalculation, FPercent | FLength)) {
</ins><span class="cx">         if (!cumulativeFlags) {
</span><span class="cx">             cumulativeFlags |= XFillPosition;
</span><span class="cx">             individualFlag = XFillPosition;
</span><span class="cx">         } else if (cumulativeFlags &amp; (XFillPosition | AmbiguousFillPosition)) {
</span><span class="cx">             cumulativeFlags |= YFillPosition;
</span><span class="cx">             individualFlag = YFillPosition;
</span><del>-        } else {
-            if (m_parsedCalculation)
-                m_parsedCalculation = nullptr;
</del><ins>+        } else
</ins><span class="cx">             return nullptr;
</span><del>-        }
-        return createPrimitiveNumericValue(*valueList.current());
</del><ins>+        return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">     }
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="lines">@@ -4202,7 +4200,10 @@
</span><span class="cx"> 
</span><span class="cx"> inline bool CSSParser::isPotentialPositionValue(CSSParserValue&amp; value)
</span><span class="cx"> {
</span><del>-    return isFillPositionKeyword(value.id) || validUnit(value, FPercent | FLength, ReleaseParsedCalcValue);
</del><ins>+    if (isFillPositionKeyword(value.id))
+        return true;
+    ValueWithCalculation valueWithCalculation(value);
+    return validateUnit(valueWithCalculation, FPercent | FLength);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void CSSParser::parseFillPosition(CSSParserValueList&amp; valueList, RefPtr&lt;CSSValue&gt;&amp; value1, RefPtr&lt;CSSValue&gt;&amp; value2)
</span><span class="lines">@@ -4366,9 +4367,10 @@
</span><span class="cx">     if (value-&gt;id == CSSValueAuto)
</span><span class="cx">         parsedValue1 = cssValuePool().createIdentifierValue(CSSValueAuto);
</span><span class="cx">     else {
</span><del>-        if (!validUnit(*value, FLength | FPercent))
</del><ins>+        ValueWithCalculation valueWithCalculation(*value);
+        if (!validateUnit(valueWithCalculation, FLength | FPercent))
</ins><span class="cx">             return nullptr;
</span><del>-        parsedValue1 = createPrimitiveNumericValue(*value);
</del><ins>+        parsedValue1 = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;CSSPrimitiveValue&gt; parsedValue2;
</span><span class="lines">@@ -4376,13 +4378,14 @@
</span><span class="cx">         if (value-&gt;unit == CSSParserValue::Operator &amp;&amp; value-&gt;iValue == ',')
</span><span class="cx">             allowComma = false;
</span><span class="cx">         else if (value-&gt;id != CSSValueAuto) {
</span><del>-            if (!validUnit(*value, FLength | FPercent)) {
</del><ins>+            ValueWithCalculation valueWithCalculation(*value);
+            if (!validateUnit(valueWithCalculation, FLength | FPercent)) {
</ins><span class="cx">                 if (!inShorthand())
</span><span class="cx">                     return nullptr;
</span><span class="cx">                 // We need to rewind the value list, so that when it is advanced we'll end up back at this value.
</span><span class="cx">                 m_valueList-&gt;previous();
</span><span class="cx">             } else
</span><del>-                parsedValue2 = createPrimitiveNumericValue(*value);
</del><ins>+                parsedValue2 = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">         }
</span><span class="cx">     } else if (!parsedValue2 &amp;&amp; propId == CSSPropertyWebkitBackgroundSize) {
</span><span class="cx">         // For backwards compatibility we set the second value to the first if it is omitted.
</span><span class="lines">@@ -4586,9 +4589,9 @@
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;CSSValue&gt; CSSParser::parseAnimationDelay()
</span><span class="cx"> {
</span><del>-    CSSParserValue&amp; value = *m_valueList-&gt;current();
-    if (validUnit(value, FTime))
-        return createPrimitiveNumericValue(value);
</del><ins>+    ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
+    if (validateUnit(valueWithCalculation, FTime))
+        return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -4602,9 +4605,9 @@
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;CSSValue&gt; CSSParser::parseAnimationDuration()
</span><span class="cx"> {
</span><del>-    CSSParserValue&amp; value = *m_valueList-&gt;current();
-    if (validUnit(value, FTime | FNonNeg))
-        return createPrimitiveNumericValue(value);
</del><ins>+    ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
+    if (validateUnit(valueWithCalculation, FTime | FNonNeg))
+        return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -4621,8 +4624,9 @@
</span><span class="cx">     CSSParserValue&amp; value = *m_valueList-&gt;current();
</span><span class="cx">     if (value.id == CSSValueInfinite)
</span><span class="cx">         return cssValuePool().createIdentifierValue(value.id);
</span><del>-    if (validUnit(value, FNumber | FNonNeg))
-        return createPrimitiveNumericValue(value);
</del><ins>+    ValueWithCalculation valueWithCalculation(value);
+    if (validateUnit(valueWithCalculation, FNumber | FNonNeg))
+        return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -4672,8 +4676,9 @@
</span><span class="cx"> 
</span><span class="cx">     // now get z
</span><span class="cx">     if (m_valueList-&gt;current()) {
</span><del>-        if (validUnit(*m_valueList-&gt;current(), FLength)) {
-            value3 = createPrimitiveNumericValue(*m_valueList-&gt;current());
</del><ins>+        ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
+        if (validateUnit(valueWithCalculation, FLength)) {
+            value3 = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">             m_valueList-&gt;next();
</span><span class="cx">             return true;
</span><span class="cx">         }
</span><span class="lines">@@ -4685,16 +4690,16 @@
</span><span class="cx"> 
</span><span class="cx"> bool CSSParser::parseCubicBezierTimingFunctionValue(CSSParserValueList&amp; args, double&amp; result)
</span><span class="cx"> {
</span><del>-    CSSParserValue* value = args.current();
-    if (!validUnit(*value, FNumber))
</del><ins>+    ValueWithCalculation argumentWithCalculation(*args.current());
+    if (!validateUnit(argumentWithCalculation, FNumber))
</ins><span class="cx">         return false;
</span><del>-    result = parsedDouble(*value, ReleaseParsedCalcValue);
-    value = args.next();
-    if (!value) {
</del><ins>+    result = parsedDouble(argumentWithCalculation);
+    CSSParserValue* nextValue = args.next();
+    if (!nextValue) {
</ins><span class="cx">         // The last number in the function has no comma after it, so we're done.
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><del>-    if (!isComma(value))
</del><ins>+    if (!isComma(nextValue))
</ins><span class="cx">         return false;
</span><span class="cx">     args.next();
</span><span class="cx">     return true;
</span><span class="lines">@@ -4722,22 +4727,24 @@
</span><span class="cx">         int numSteps;
</span><span class="cx">         bool stepAtStart = false;
</span><span class="cx"> 
</span><del>-        CSSParserValue* currentValue = args-&gt;current();
-        if (!validUnit(*currentValue, FInteger))
</del><ins>+        CSSParserValue* argument = args-&gt;current();
+        ValueWithCalculation argumentWithCalculation(*argument);
+        if (!validateUnit(argumentWithCalculation, FInteger))
</ins><span class="cx">             return nullptr;
</span><del>-        numSteps = clampToInteger(currentValue-&gt;fValue);
</del><ins>+        // FIXME: This doesn't handle calculated values.
+        numSteps = clampToInteger(argument-&gt;fValue);
</ins><span class="cx">         if (numSteps &lt; 1)
</span><span class="cx">             return nullptr;
</span><del>-        currentValue = args-&gt;next();
</del><ins>+        argument = args-&gt;next();
</ins><span class="cx"> 
</span><del>-        if (currentValue) {
</del><ins>+        if (argument) {
</ins><span class="cx">             // There is a comma so we need to parse the second value
</span><del>-            if (!isComma(currentValue))
</del><ins>+            if (!isComma(argument))
</ins><span class="cx">                 return nullptr;
</span><del>-            currentValue = args-&gt;next();
-            if (currentValue-&gt;id != CSSValueStart &amp;&amp; currentValue-&gt;id != CSSValueEnd)
</del><ins>+            argument = args-&gt;next();
+            if (argument-&gt;id != CSSValueStart &amp;&amp; argument-&gt;id != CSSValueEnd)
</ins><span class="cx">                 return nullptr;
</span><del>-            stepAtStart = currentValue-&gt;id == CSSValueStart;
</del><ins>+            stepAtStart = argument-&gt;id == CSSValueStart;
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         return CSSStepsTimingFunctionValue::create(numSteps, stepAtStart);
</span><span class="lines">@@ -4898,23 +4905,25 @@
</span><span class="cx"> // The function parses [ &lt;integer&gt; || &lt;custom-ident&gt; ] in &lt;grid-line&gt; (which can be stand alone or with 'span').
</span><span class="cx"> bool CSSParser::parseIntegerOrCustomIdentFromGridPosition(RefPtr&lt;CSSPrimitiveValue&gt;&amp; numericValue, RefPtr&lt;CSSPrimitiveValue&gt;&amp; gridLineName)
</span><span class="cx"> {
</span><del>-    CSSParserValue* value = m_valueList-&gt;current();
-    if (validUnit(*value, FInteger) &amp;&amp; value-&gt;fValue) {
-        numericValue = createPrimitiveNumericValue(*value);
-        value = m_valueList-&gt;next();
-        if (value &amp;&amp; isValidCustomIdent(*value)) {
-            gridLineName = createPrimitiveStringValue(*m_valueList-&gt;current());
</del><ins>+    ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
+    if (validateUnit(valueWithCalculation, FInteger) &amp;&amp; valueWithCalculation.value().fValue) {
+        numericValue = createPrimitiveNumericValue(valueWithCalculation);
+        CSSParserValue* nextValue = m_valueList-&gt;next();
+        if (nextValue &amp;&amp; isValidCustomIdent(*nextValue)) {
+            gridLineName = createPrimitiveStringValue(*nextValue);
</ins><span class="cx">             m_valueList-&gt;next();
</span><span class="cx">         }
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (isValidCustomIdent(*value)) {
-        gridLineName = createPrimitiveStringValue(*m_valueList-&gt;current());
-        value = m_valueList-&gt;next();
-        if (value &amp;&amp; validUnit(*value, FInteger) &amp;&amp; value-&gt;fValue) {
-            numericValue = createPrimitiveNumericValue(*value);
-            m_valueList-&gt;next();
</del><ins>+    if (isValidCustomIdent(valueWithCalculation)) {
+        gridLineName = createPrimitiveStringValue(valueWithCalculation);
+        if (CSSParserValue* nextValue = m_valueList-&gt;next()) {
+            ValueWithCalculation nextValueWithCalculation(*nextValue);
+            if (validateUnit(nextValueWithCalculation, FInteger) &amp;&amp; nextValueWithCalculation.value().fValue) {
+                numericValue = createPrimitiveNumericValue(nextValueWithCalculation);
+                m_valueList-&gt;next();
+            }
</ins><span class="cx">         }
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><span class="lines">@@ -5298,13 +5307,18 @@
</span><span class="cx"> bool CSSParser::parseGridTrackRepeatFunction(CSSValueList&amp; list)
</span><span class="cx"> {
</span><span class="cx">     CSSParserValueList* arguments = m_valueList-&gt;current()-&gt;function-&gt;args.get();
</span><del>-    if (!arguments || arguments-&gt;size() &lt; 3 || !validUnit(*arguments-&gt;valueAt(0), FPositiveInteger) || !isComma(arguments-&gt;valueAt(1)))
</del><ins>+    if (!arguments || arguments-&gt;size() &lt; 3)
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    ASSERT(arguments-&gt;valueAt(0)-&gt;fValue &gt; 0);
</del><ins>+    ValueWithCalculation firstValueWithCalculation(*arguments-&gt;valueAt(0));
+    if (!validateUnit(firstValueWithCalculation, FPositiveInteger) || !isComma(arguments-&gt;valueAt(1)))
+        return false;
+
+    // FIXME: This doesn't handle calculated values.
+    ASSERT(firstValueWithCalculation.value().fValue &gt; 0);
</ins><span class="cx">     // If arguments-&gt;valueAt(0)-&gt;fValue &gt; SIZE_MAX then repetitions becomes 0 during the type casting, that's why we
</span><span class="cx">     // clamp it down to kGridMaxTracks before the type casting.
</span><del>-    unsigned repetitions = clampTo&lt;unsigned&gt;(arguments-&gt;valueAt(0)-&gt;fValue, 0, kGridMaxTracks);
</del><ins>+    unsigned repetitions = clampTo&lt;unsigned&gt;(firstValueWithCalculation.value().fValue, 0, kGridMaxTracks);
</ins><span class="cx"> 
</span><span class="cx">     RefPtr&lt;CSSValueList&gt; repeatedValues = CSSValueList::createSpaceSeparated();
</span><span class="cx">     arguments-&gt;next(); // Skip the repetition count.
</span><span class="lines">@@ -5378,13 +5392,13 @@
</span><span class="cx">     return parseGridBreadth(currentValue);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-PassRefPtr&lt;CSSPrimitiveValue&gt; CSSParser::parseGridBreadth(CSSParserValue&amp; currentValue)
</del><ins>+PassRefPtr&lt;CSSPrimitiveValue&gt; CSSParser::parseGridBreadth(CSSParserValue&amp; value)
</ins><span class="cx"> {
</span><del>-    if (currentValue.id == CSSValueWebkitMinContent || currentValue.id == CSSValueWebkitMaxContent)
-        return cssValuePool().createIdentifierValue(currentValue.id);
</del><ins>+    if (value.id == CSSValueWebkitMinContent || value.id == CSSValueWebkitMaxContent)
+        return cssValuePool().createIdentifierValue(value.id);
</ins><span class="cx"> 
</span><del>-    if (currentValue.unit == CSSPrimitiveValue::CSS_FR) {
-        double flexValue = currentValue.fValue;
</del><ins>+    if (value.unit == CSSPrimitiveValue::CSS_FR) {
+        double flexValue = value.fValue;
</ins><span class="cx"> 
</span><span class="cx">         // Fractional unit is a non-negative dimension.
</span><span class="cx">         if (flexValue &lt;= 0)
</span><span class="lines">@@ -5393,10 +5407,11 @@
</span><span class="cx">         return cssValuePool().createValue(flexValue, CSSPrimitiveValue::CSS_FR);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!validUnit(currentValue, FNonNeg | FLength | FPercent))
</del><ins>+    ValueWithCalculation valueWithCalculation(value);
+    if (!validateUnit(valueWithCalculation, FNonNeg | FLength | FPercent))
</ins><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><del>-    return createPrimitiveNumericValue(currentValue);
</del><ins>+    return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static inline bool isValidGridAutoFlowId(CSSValueID id)
</span><span class="lines">@@ -5565,11 +5580,12 @@
</span><span class="cx">                 arg = args-&gt;next();
</span><span class="cx">                 arg = skipCommaInDashboardRegion(args);
</span><span class="cx"> 
</span><del>-                valid = arg-&gt;id == CSSValueAuto || validUnit(*arg, FLength);
</del><ins>+                ValueWithCalculation argWithCalculation(*arg);
+                valid = arg-&gt;id == CSSValueAuto || validateUnit(argWithCalculation, FLength);
</ins><span class="cx">                 if (!valid)
</span><span class="cx">                     break;
</span><span class="cx"> 
</span><del>-                RefPtr&lt;CSSPrimitiveValue&gt; amount = arg-&gt;id == CSSValueAuto ? cssValuePool().createIdentifierValue(CSSValueAuto) : createPrimitiveNumericValue(*arg);
</del><ins>+                RefPtr&lt;CSSPrimitiveValue&gt; amount = arg-&gt;id == CSSValueAuto ? cssValuePool().createIdentifierValue(CSSValueAuto) : createPrimitiveNumericValue(argWithCalculation);
</ins><span class="cx"> 
</span><span class="cx">                 if (i == 0)
</span><span class="cx">                     region-&gt;setTop(amount);
</span><span class="lines">@@ -5745,12 +5761,13 @@
</span><span class="cx">     RefPtr&lt;Rect&gt; rect = Rect::create();
</span><span class="cx">     bool valid = true;
</span><span class="cx">     int i = 0;
</span><del>-    CSSParserValue* currentValue = args-&gt;current();
-    while (currentValue) {
-        valid = currentValue-&gt;id == CSSValueAuto || validUnit(*currentValue, FLength);
</del><ins>+    CSSParserValue* argument = args-&gt;current();
+    while (argument) {
+        ValueWithCalculation argumentWithCalculation(*argument);
+        valid = argument-&gt;id == CSSValueAuto || validateUnit(argumentWithCalculation, FLength);
</ins><span class="cx">         if (!valid)
</span><span class="cx">             break;
</span><del>-        RefPtr&lt;CSSPrimitiveValue&gt; length = currentValue-&gt;id == CSSValueAuto ? cssValuePool().createIdentifierValue(CSSValueAuto) : createPrimitiveNumericValue(*currentValue);
</del><ins>+        RefPtr&lt;CSSPrimitiveValue&gt; length = argument-&gt;id == CSSValueAuto ? cssValuePool().createIdentifierValue(CSSValueAuto) : createPrimitiveNumericValue(argumentWithCalculation);
</ins><span class="cx">         if (i == 0)
</span><span class="cx">             rect-&gt;setTop(length);
</span><span class="cx">         else if (i == 1)
</span><span class="lines">@@ -5759,10 +5776,10 @@
</span><span class="cx">             rect-&gt;setBottom(length);
</span><span class="cx">         else
</span><span class="cx">             rect-&gt;setLeft(length);
</span><del>-        currentValue = args-&gt;next();
-        if (currentValue &amp;&amp; args-&gt;size() == 7) {
-            if (currentValue-&gt;unit == CSSParserValue::Operator &amp;&amp; currentValue-&gt;iValue == ',') {
-                currentValue = args-&gt;next();
</del><ins>+        argument = args-&gt;next();
+        if (argument &amp;&amp; args-&gt;size() == 7) {
+            if (argument-&gt;unit == CSSParserValue::Operator &amp;&amp; argument-&gt;iValue == ',') {
+                argument = args-&gt;next();
</ins><span class="cx">             } else {
</span><span class="cx">                 valid = false;
</span><span class="cx">                 break;
</span><span class="lines">@@ -5829,10 +5846,11 @@
</span><span class="cx">         if (i - indexAfterSlash &gt;= 4)
</span><span class="cx">             return nullptr;
</span><span class="cx"> 
</span><del>-        if (!validUnit(value, FLength | FPercent | FNonNeg))
</del><ins>+        ValueWithCalculation valueWithCalculation(value);
+        if (!validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg))
</ins><span class="cx">             return nullptr;
</span><span class="cx"> 
</span><del>-        RefPtr&lt;CSSPrimitiveValue&gt; radius = createPrimitiveNumericValue(value);
</del><ins>+        RefPtr&lt;CSSPrimitiveValue&gt; radius = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx"> 
</span><span class="cx">         if (!indexAfterSlash)
</span><span class="cx">             radii[0][i] = radius;
</span><span class="lines">@@ -5869,10 +5887,11 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         Units unitFlags = FLength | FPercent;
</span><del>-        if (!validUnit(*argument, unitFlags) || widthArguments.size() &gt; 4)
</del><ins>+        ValueWithCalculation argumentWithCalculation(*argument);
+        if (!validateUnit(argumentWithCalculation, unitFlags) || widthArguments.size() &gt; 4)
</ins><span class="cx">             return nullptr;
</span><span class="cx"> 
</span><del>-        widthArguments.append(createPrimitiveNumericValue(*argument));
</del><ins>+        widthArguments.append(createPrimitiveNumericValue(argumentWithCalculation));
</ins><span class="cx">         argument = args.next();
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -5907,10 +5926,11 @@
</span><span class="cx">     if (value.id == CSSValueClosestSide || value.id == CSSValueFarthestSide)
</span><span class="cx">         return cssValuePool().createIdentifierValue(value.id);
</span><span class="cx"> 
</span><del>-    if (!validUnit(value, FLength | FPercent | FNonNeg))
</del><ins>+    ValueWithCalculation valueWithCalculation(value);
+    if (!validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg))
</ins><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><del>-    return createPrimitiveNumericValue(value);
</del><ins>+    return createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> PassRefPtr&lt;CSSBasicShape&gt; CSSParser::parseBasicShapeCircle(CSSParserValueList&amp; args)
</span><span class="lines">@@ -6024,14 +6044,18 @@
</span><span class="cx">     CSSParserValue* argumentX = argument;
</span><span class="cx">     while (argumentX) {
</span><span class="cx"> 
</span><del>-        if (!validUnit(*argumentX, FLength | FPercent))
</del><ins>+        ValueWithCalculation argumentXWithCalculation(*argumentX);
+        if (!validateUnit(argumentXWithCalculation, FLength | FPercent))
</ins><span class="cx">             return nullptr;
</span><del>-        RefPtr&lt;CSSPrimitiveValue&gt; xLength = createPrimitiveNumericValue(*argumentX);
</del><ins>+        RefPtr&lt;CSSPrimitiveValue&gt; xLength = createPrimitiveNumericValue(argumentXWithCalculation);
</ins><span class="cx"> 
</span><span class="cx">         CSSParserValue* argumentY = args.next();
</span><del>-        if (!argumentY || !validUnit(*argumentY, FLength | FPercent))
</del><ins>+        if (!argumentY)
</ins><span class="cx">             return nullptr;
</span><del>-        RefPtr&lt;CSSPrimitiveValue&gt; yLength = createPrimitiveNumericValue(*argumentY);
</del><ins>+        ValueWithCalculation argumentYWithCalculation(*argumentY);
+        if (!validateUnit(argumentYWithCalculation, FLength | FPercent))
+            return nullptr;
+        RefPtr&lt;CSSPrimitiveValue&gt; yLength = createPrimitiveNumericValue(argumentYWithCalculation);
</ins><span class="cx"> 
</span><span class="cx">         shape-&gt;appendPoint(xLength.release(), yLength.release());
</span><span class="cx"> 
</span><span class="lines">@@ -6086,7 +6110,7 @@
</span><span class="cx">             list-&gt;append(shapeValue.releaseNonNull());
</span><span class="cx">             shapeFound = true;
</span><span class="cx">         } else if (isBoxValue(valueId, propId) &amp;&amp; !boxFound) {
</span><del>-            RefPtr&lt;CSSPrimitiveValue&gt; parsedValue = parseValidPrimitive(valueId, *value);
</del><ins>+            RefPtr&lt;CSSPrimitiveValue&gt; parsedValue = cssValuePool().createIdentifierValue(valueId);
</ins><span class="cx">             list-&gt;append(parsedValue.releaseNonNull());
</span><span class="cx">             boxFound = true;
</span><span class="cx">             m_valueList-&gt;next();
</span><span class="lines">@@ -6108,13 +6132,10 @@
</span><span class="cx"> 
</span><span class="cx">     CSSParserValue&amp; value = *m_valueList-&gt;current();
</span><span class="cx">     CSSValueID valueId = value.id;
</span><del>-    RefPtr&lt;CSSPrimitiveValue&gt; keywordValue;
-    RefPtr&lt;CSSPrimitiveValue&gt; shapeValue;
</del><span class="cx"> 
</span><span class="cx">     if (valueId == CSSValueNone) {
</span><del>-        keywordValue = parseValidPrimitive(valueId, value);
</del><span class="cx">         m_valueList-&gt;next();
</span><del>-        return keywordValue.release();
</del><ins>+        return cssValuePool().createIdentifierValue(valueId);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;CSSValue&gt; imageValue;
</span><span class="lines">@@ -6134,7 +6155,7 @@
</span><span class="cx"> 
</span><span class="cx">     if (valueId == CSSValueNone) {
</span><span class="cx">         m_valueList-&gt;next();
</span><del>-        return parseValidPrimitive(valueId, value);
</del><ins>+        return cssValuePool().createIdentifierValue(valueId);
</ins><span class="cx">     }
</span><span class="cx">     if (value.unit == CSSPrimitiveValue::CSS_URI) {
</span><span class="cx">         m_valueList-&gt;next();
</span><span class="lines">@@ -6354,31 +6375,31 @@
</span><span class="cx"> 
</span><span class="cx"> bool CSSParser::parseLineHeight(bool important)
</span><span class="cx"> {
</span><del>-    CSSParserValue&amp; value = *m_valueList-&gt;current();
-    CSSValueID id = value.id;
</del><ins>+    ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
+    CSSValueID id = valueWithCalculation.value().id;
</ins><span class="cx">     bool validPrimitive = false;
</span><span class="cx">     // normal | &lt;number&gt; | &lt;length&gt; | &lt;percentage&gt; | inherit
</span><span class="cx">     if (id == CSSValueNormal)
</span><span class="cx">         validPrimitive = true;
</span><span class="cx">     else
</span><del>-        validPrimitive = (!id &amp;&amp; validUnit(value, FNumber | FLength | FPercent | FNonNeg));
</del><ins>+        validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FNumber | FLength | FPercent | FNonNeg));
</ins><span class="cx">     if (validPrimitive &amp;&amp; (!m_valueList-&gt;next() || inShorthand()))
</span><del>-        addProperty(CSSPropertyLineHeight, parseValidPrimitive(id, value), important);
</del><ins>+        addProperty(CSSPropertyLineHeight, parseValidPrimitive(id, valueWithCalculation), important);
</ins><span class="cx">     return validPrimitive;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool CSSParser::parseFontSize(bool important)
</span><span class="cx"> {
</span><del>-    CSSParserValue&amp; value = *m_valueList-&gt;current();
-    CSSValueID id = value.id;
</del><ins>+    ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
+    CSSValueID id = valueWithCalculation.value().id;
</ins><span class="cx">     bool validPrimitive = false;
</span><span class="cx">     // &lt;absolute-size&gt; | &lt;relative-size&gt; | &lt;length&gt; | &lt;percentage&gt; | inherit
</span><span class="cx">     if (id &gt;= CSSValueXxSmall &amp;&amp; id &lt;= CSSValueLarger)
</span><span class="cx">         validPrimitive = true;
</span><span class="cx">     else
</span><del>-        validPrimitive = validUnit(value, FLength | FPercent | FNonNeg);
</del><ins>+        validPrimitive = validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg);
</ins><span class="cx">     if (validPrimitive &amp;&amp; (!m_valueList-&gt;next() || inShorthand()))
</span><del>-        addProperty(CSSPropertyFontSize, parseValidPrimitive(id, value), important);
</del><ins>+        addProperty(CSSPropertyFontSize, parseValidPrimitive(id, valueWithCalculation), important);
</ins><span class="cx">     return validPrimitive;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -6444,8 +6465,9 @@
</span><span class="cx">         addProperty(CSSPropertyFontWeight, cssValuePool().createIdentifierValue(value.id), important);
</span><span class="cx">         return true;
</span><span class="cx">     }
</span><del>-    if (validUnit(value, FInteger | FNonNeg, CSSQuirksMode)) {
-        int weight = static_cast&lt;int&gt;(parsedDouble(value, ReleaseParsedCalcValue));
</del><ins>+    ValueWithCalculation valueWithCalculation(value);
+    if (validateUnit(valueWithCalculation, FInteger | FNonNeg, CSSQuirksMode)) {
+        int weight = static_cast&lt;int&gt;(parsedDouble(valueWithCalculation));
</ins><span class="cx">         if (!(weight % 100) &amp;&amp; weight &gt;= 100 &amp;&amp; weight &lt;= 900) {
</span><span class="cx">             addProperty(CSSPropertyFontWeight, cssValuePool().createIdentifierValue(createFontWeightValueKeyword(weight)), important);
</span><span class="cx">             return true;
</span><span class="lines">@@ -6940,12 +6962,9 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx">     
</span><del>-inline double CSSParser::parsedDouble(CSSParserValue&amp; value, ReleaseParsedCalcValueCondition releaseCalc)
</del><ins>+inline double CSSParser::parsedDouble(ValueWithCalculation&amp; valueWithCalculation)
</ins><span class="cx"> {
</span><del>-    double result = m_parsedCalculation ? m_parsedCalculation-&gt;doubleValue() : value.fValue;
-    if (releaseCalc == ReleaseParsedCalcValue)
-        m_parsedCalculation = nullptr;
-    return result;
</del><ins>+    return valueWithCalculation.calculation() ? valueWithCalculation.calculation()-&gt;doubleValue() : valueWithCalculation.value().fValue;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> bool CSSParser::isCalculation(CSSParserValue&amp; value)
</span><span class="lines">@@ -6957,16 +6976,16 @@
</span><span class="cx">             || equalIgnoringCase(value.function-&gt;name, &quot;-webkit-max(&quot;));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-inline int CSSParser::colorIntFromValue(CSSParserValue&amp; value)
</del><ins>+inline int CSSParser::colorIntFromValue(ValueWithCalculation&amp; valueWithCalculation)
</ins><span class="cx"> {
</span><span class="cx">     bool isPercent;
</span><span class="cx">     
</span><del>-    if (m_parsedCalculation)
-        isPercent = m_parsedCalculation-&gt;category() == CalcPercent;
</del><ins>+    if (valueWithCalculation.calculation())
+        isPercent = valueWithCalculation.calculation()-&gt;category() == CalcPercent;
</ins><span class="cx">     else
</span><del>-        isPercent = value.unit == CSSPrimitiveValue::CSS_PERCENTAGE;
</del><ins>+        isPercent = valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_PERCENTAGE;
</ins><span class="cx"> 
</span><del>-    const double doubleValue = parsedDouble(value, ReleaseParsedCalcValue);
</del><ins>+    const double doubleValue = parsedDouble(valueWithCalculation);
</ins><span class="cx">     
</span><span class="cx">     if (doubleValue &lt;= 0.0)
</span><span class="cx">         return 0;
</span><span class="lines">@@ -6986,34 +7005,34 @@
</span><span class="cx"> bool CSSParser::parseColorParameters(CSSParserValue&amp; value, int* colorArray, bool parseAlpha)
</span><span class="cx"> {
</span><span class="cx">     CSSParserValueList* args = value.function-&gt;args.get();
</span><del>-    CSSParserValue* currentValue = args-&gt;current();
</del><ins>+    ValueWithCalculation firstArgumentWithCalculation(*args-&gt;current());
</ins><span class="cx">     Units unitType = FUnknown;
</span><span class="cx">     // Get the first value and its type
</span><del>-    if (validUnit(*currentValue, FInteger, CSSStrictMode))
</del><ins>+    if (validateUnit(firstArgumentWithCalculation, FInteger, CSSStrictMode))
</ins><span class="cx">         unitType = FInteger;
</span><del>-    else if (validUnit(*currentValue, FPercent, CSSStrictMode))
</del><ins>+    else if (validateUnit(firstArgumentWithCalculation, FPercent, CSSStrictMode))
</ins><span class="cx">         unitType = FPercent;
</span><span class="cx">     else
</span><span class="cx">         return false;
</span><span class="cx">     
</span><del>-    colorArray[0] = colorIntFromValue(*currentValue);
</del><ins>+    colorArray[0] = colorIntFromValue(firstArgumentWithCalculation);
</ins><span class="cx">     for (int i = 1; i &lt; 3; i++) {
</span><del>-        currentValue = args-&gt;next();
-        if (currentValue-&gt;unit != CSSParserValue::Operator &amp;&amp; currentValue-&gt;iValue != ',')
</del><ins>+        CSSParserValue&amp; operatorArgument = *args-&gt;next();
+        if (operatorArgument.unit != CSSParserValue::Operator &amp;&amp; operatorArgument.iValue != ',')
</ins><span class="cx">             return false;
</span><del>-        currentValue = args-&gt;next();
-        if (!validUnit(*currentValue, unitType, CSSStrictMode))
</del><ins>+        ValueWithCalculation argumentWithCalculation(*args-&gt;next());
+        if (!validateUnit(argumentWithCalculation, unitType, CSSStrictMode))
</ins><span class="cx">             return false;
</span><del>-        colorArray[i] = colorIntFromValue(*currentValue);
</del><ins>+        colorArray[i] = colorIntFromValue(argumentWithCalculation);
</ins><span class="cx">     }
</span><span class="cx">     if (parseAlpha) {
</span><del>-        currentValue = args-&gt;next();
-        if (currentValue-&gt;unit != CSSParserValue::Operator &amp;&amp; currentValue-&gt;iValue != ',')
</del><ins>+        CSSParserValue&amp; operatorArgument = *args-&gt;next();
+        if (operatorArgument.unit != CSSParserValue::Operator &amp;&amp; operatorArgument.iValue != ',')
</ins><span class="cx">             return false;
</span><del>-        currentValue = args-&gt;next();
-        if (!validUnit(*currentValue, FNumber, CSSStrictMode))
</del><ins>+        ValueWithCalculation argumentWithCalculation(*args-&gt;next());
+        if (!validateUnit(argumentWithCalculation, FNumber, CSSStrictMode))
</ins><span class="cx">             return false;
</span><del>-        double doubleValue = parsedDouble(*currentValue, ReleaseParsedCalcValue);
</del><ins>+        double doubleValue = parsedDouble(argumentWithCalculation);
</ins><span class="cx">         // Convert the floating pointer number of alpha to an integer in the range [0, 256),
</span><span class="cx">         // with an equal distribution across all 256 values.
</span><span class="cx">         colorArray[3] = static_cast&lt;int&gt;(std::max&lt;double&gt;(0, std::min&lt;double&gt;(1, doubleValue)) * nextafter(256.0, 0.0));
</span><span class="lines">@@ -7029,29 +7048,29 @@
</span><span class="cx"> bool CSSParser::parseHSLParameters(CSSParserValue&amp; value, double* colorArray, bool parseAlpha)
</span><span class="cx"> {
</span><span class="cx">     CSSParserValueList* args = value.function-&gt;args.get();
</span><del>-    CSSParserValue* currentValue = args-&gt;current();
</del><ins>+    ValueWithCalculation firstArgumentWithCalculation(*args-&gt;current());
</ins><span class="cx">     // Get the first value
</span><del>-    if (!validUnit(*currentValue, FNumber, CSSStrictMode))
</del><ins>+    if (!validateUnit(firstArgumentWithCalculation, FNumber, CSSStrictMode))
</ins><span class="cx">         return false;
</span><span class="cx">     // normalize the Hue value and change it to be between 0 and 1.0
</span><del>-    colorArray[0] = (((static_cast&lt;int&gt;(parsedDouble(*currentValue, ReleaseParsedCalcValue)) % 360) + 360) % 360) / 360.0;
</del><ins>+    colorArray[0] = (((static_cast&lt;int&gt;(parsedDouble(firstArgumentWithCalculation)) % 360) + 360) % 360) / 360.0;
</ins><span class="cx">     for (int i = 1; i &lt; 3; ++i) {
</span><del>-        currentValue = args-&gt;next();
-        if (currentValue-&gt;unit != CSSParserValue::Operator &amp;&amp; currentValue-&gt;iValue != ',')
</del><ins>+        CSSParserValue&amp; operatorArgument = *args-&gt;next();
+        if (operatorArgument.unit != CSSParserValue::Operator &amp;&amp; operatorArgument.iValue != ',')
</ins><span class="cx">             return false;
</span><del>-        currentValue = args-&gt;next();
-        if (!validUnit(*currentValue, FPercent, CSSStrictMode))
</del><ins>+        ValueWithCalculation argumentWithCalculation(*args-&gt;next());
+        if (!validateUnit(argumentWithCalculation, FPercent, CSSStrictMode))
</ins><span class="cx">             return false;
</span><del>-        colorArray[i] = std::max&lt;double&gt;(0, std::min&lt;double&gt;(100, parsedDouble(*currentValue, ReleaseParsedCalcValue))) / 100.0; // needs to be value between 0 and 1.0
</del><ins>+        colorArray[i] = std::max&lt;double&gt;(0, std::min&lt;double&gt;(100, parsedDouble(argumentWithCalculation))) / 100.0; // needs to be value between 0 and 1.0
</ins><span class="cx">     }
</span><span class="cx">     if (parseAlpha) {
</span><del>-        currentValue = args-&gt;next();
-        if (currentValue-&gt;unit != CSSParserValue::Operator &amp;&amp; currentValue-&gt;iValue != ',')
</del><ins>+        CSSParserValue&amp; operatorArgument = *args-&gt;next();
+        if (operatorArgument.unit != CSSParserValue::Operator &amp;&amp; operatorArgument.iValue != ',')
</ins><span class="cx">             return false;
</span><del>-        currentValue = args-&gt;next();
-        if (!validUnit(*currentValue, FNumber, CSSStrictMode))
</del><ins>+        ValueWithCalculation argumentWithCalculation(*args-&gt;next());
+        if (!validateUnit(argumentWithCalculation, FNumber, CSSStrictMode))
</ins><span class="cx">             return false;
</span><del>-        colorArray[3] = std::max&lt;double&gt;(0, std::min&lt;double&gt;(1, parsedDouble(*currentValue, ReleaseParsedCalcValue)));
</del><ins>+        colorArray[3] = std::max&lt;double&gt;(0, std::min&lt;double&gt;(1, parsedDouble(argumentWithCalculation)));
</ins><span class="cx">     }
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="lines">@@ -7163,9 +7182,9 @@
</span><span class="cx">         allowStyle = property == CSSPropertyWebkitBoxShadow || property == CSSPropertyBoxShadow;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    void commitLength(CSSParserValue&amp; value)
</del><ins>+    void commitLength(CSSParser::ValueWithCalculation&amp; valueWithCalculation)
</ins><span class="cx">     {
</span><del>-        RefPtr&lt;CSSPrimitiveValue&gt; primitiveValue = m_parser.createPrimitiveNumericValue(value);
</del><ins>+        RefPtr&lt;CSSPrimitiveValue&gt; primitiveValue = m_parser.createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx"> 
</span><span class="cx">         if (allowX) {
</span><span class="cx">             x = primitiveValue.release();
</span><span class="lines">@@ -7243,6 +7262,7 @@
</span><span class="cx">     ShadowParseContext context(propId, *this);
</span><span class="cx">     CSSParserValue* value;
</span><span class="cx">     while ((value = valueList.current())) {
</span><ins>+        ValueWithCalculation valueWithCalculation(*value);
</ins><span class="cx">         // Check for a comma break first.
</span><span class="cx">         if (value-&gt;unit == CSSParserValue::Operator) {
</span><span class="cx">             if (value-&gt;iValue != ',' || !context.allowBreak) {
</span><span class="lines">@@ -7255,22 +7275,22 @@
</span><span class="cx">                 return nullptr;
</span><span class="cx">             // The value is good.  Commit it.
</span><span class="cx">             context.commitValue();
</span><del>-        } else if (validUnit(*value, FLength, CSSStrictMode)) {
</del><ins>+        } else if (validateUnit(valueWithCalculation, FLength, CSSStrictMode)) {
</ins><span class="cx">             // We required a length and didn't get one. Invalid.
</span><span class="cx">             if (!context.allowLength())
</span><span class="cx">                 return nullptr;
</span><span class="cx"> 
</span><span class="cx">             // Blur radius must be non-negative.
</span><del>-            if (context.allowBlur &amp;&amp; !validUnit(*value, FLength | FNonNeg, CSSStrictMode))
</del><ins>+            if (context.allowBlur &amp;&amp; !validateUnit(valueWithCalculation, FLength | FNonNeg, CSSStrictMode))
</ins><span class="cx">                 return nullptr;
</span><span class="cx"> 
</span><span class="cx">             // A length is allowed here.  Construct the value and add it.
</span><del>-            context.commitLength(*value);
</del><ins>+            context.commitLength(valueWithCalculation);
</ins><span class="cx">         } else if (value-&gt;id == CSSValueInset) {
</span><span class="cx">             if (!context.allowStyle)
</span><span class="cx">                 return nullptr;
</span><span class="cx"> 
</span><del>-            context.commitStyle(*value);
</del><ins>+            context.commitStyle(valueWithCalculation);
</ins><span class="cx">         } else {
</span><span class="cx">             // The only other type of value that's ok is a color value.
</span><span class="cx">             RefPtr&lt;CSSPrimitiveValue&gt; parsedColor;
</span><span class="lines">@@ -7311,34 +7331,35 @@
</span><span class="cx">     // box-reflect: &lt;direction&gt; &lt;offset&gt; &lt;mask&gt;
</span><span class="cx"> 
</span><span class="cx">     // Direction comes first.
</span><del>-    CSSParserValue* currentValue = m_valueList-&gt;current();
</del><ins>+    CSSParserValue* value = m_valueList-&gt;current();
</ins><span class="cx">     RefPtr&lt;CSSPrimitiveValue&gt; direction;
</span><del>-    switch (currentValue-&gt;id) {
</del><ins>+    switch (value-&gt;id) {
</ins><span class="cx">         case CSSValueAbove:
</span><span class="cx">         case CSSValueBelow:
</span><span class="cx">         case CSSValueLeft:
</span><span class="cx">         case CSSValueRight:
</span><del>-            direction = cssValuePool().createIdentifierValue(currentValue-&gt;id);
</del><ins>+            direction = cssValuePool().createIdentifierValue(value-&gt;id);
</ins><span class="cx">             break;
</span><span class="cx">         default:
</span><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // The offset comes next.
</span><del>-    currentValue = m_valueList-&gt;next();
</del><ins>+    value = m_valueList-&gt;next();
</ins><span class="cx">     RefPtr&lt;CSSPrimitiveValue&gt; offset;
</span><del>-    if (!currentValue)
</del><ins>+    if (!value)
</ins><span class="cx">         offset = cssValuePool().createValue(0, CSSPrimitiveValue::CSS_PX);
</span><span class="cx">     else {
</span><del>-        if (!validUnit(*currentValue, FLength | FPercent))
</del><ins>+        ValueWithCalculation valueWithCalculation(*value);
+        if (!validateUnit(valueWithCalculation, FLength | FPercent))
</ins><span class="cx">             return false;
</span><del>-        offset = createPrimitiveNumericValue(*currentValue);
</del><ins>+        offset = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Now for the mask.
</span><span class="cx">     RefPtr&lt;CSSValue&gt; mask;
</span><del>-    currentValue = m_valueList-&gt;next();
-    if (currentValue) {
</del><ins>+    value = m_valueList-&gt;next();
+    if (value) {
</ins><span class="cx">         if (!parseBorderImage(propId, mask))
</span><span class="cx">             return false;
</span><span class="cx">     }
</span><span class="lines">@@ -7358,20 +7379,21 @@
</span><span class="cx">     RefPtr&lt;CSSPrimitiveValue&gt; flexBasis;
</span><span class="cx"> 
</span><span class="cx">     while (CSSParserValue* argument = args.current()) {
</span><del>-        if (validUnit(*argument, FNumber | FNonNeg)) {
</del><ins>+        ValueWithCalculation argumentWithCalculation(*argument);
+        if (validateUnit(argumentWithCalculation, FNumber | FNonNeg)) {
</ins><span class="cx">             if (flexGrow == unsetValue)
</span><del>-                flexGrow = parsedDouble(*argument, ReleaseParsedCalcValue);
</del><ins>+                flexGrow = parsedDouble(argumentWithCalculation);
</ins><span class="cx">             else if (flexShrink == unsetValue)
</span><del>-                flexShrink = parsedDouble(*argument, ReleaseParsedCalcValue);
-            else if (!parsedDouble(*argument, ReleaseParsedCalcValue)) {
</del><ins>+                flexShrink = parsedDouble(argumentWithCalculation);
+            else if (!parsedDouble(argumentWithCalculation)) {
</ins><span class="cx">                 // flex only allows a basis of 0 (sans units) if flex-grow and flex-shrink values have already been set.
</span><span class="cx">                 flexBasis = cssValuePool().createValue(0, CSSPrimitiveValue::CSS_PX);
</span><span class="cx">             } else {
</span><span class="cx">                 // We only allow 3 numbers without units if the last value is 0. E.g., flex:1 1 1 is invalid.
</span><span class="cx">                 return false;
</span><span class="cx">             }
</span><del>-        } else if (!flexBasis &amp;&amp; (argument-&gt;id == CSSValueAuto || validUnit(*argument, FLength | FPercent | FNonNeg)))
-            flexBasis = parseValidPrimitive(argument-&gt;id, *argument);
</del><ins>+        } else if (!flexBasis &amp;&amp; (argumentWithCalculation.value().id == CSSValueAuto || validateUnit(argumentWithCalculation, FLength | FPercent | FNonNeg)))
+            flexBasis = parseValidPrimitive(argumentWithCalculation.value().id, argumentWithCalculation);
</ins><span class="cx">         else {
</span><span class="cx">             // Not a valid arg for flex.
</span><span class="cx">             return false;
</span><span class="lines">@@ -7640,9 +7662,9 @@
</span><span class="cx">     bool allowFinalCommit() const { return m_allowFinalCommit; }
</span><span class="cx">     CSSPrimitiveValue* top() const { return m_top.get(); }
</span><span class="cx"> 
</span><del>-    void commitNumber(CSSParserValue&amp; value)
</del><ins>+    void commitNumber(CSSParser::ValueWithCalculation&amp; valueWithCalculation)
</ins><span class="cx">     {
</span><del>-        RefPtr&lt;CSSPrimitiveValue&gt; primitiveValue = m_parser.createPrimitiveNumericValue(value);
</del><ins>+        RefPtr&lt;CSSPrimitiveValue&gt; primitiveValue = m_parser.createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">         if (!m_top)
</span><span class="cx">             m_top = primitiveValue.release();
</span><span class="cx">         else if (!m_right)
</span><span class="lines">@@ -7707,9 +7729,10 @@
</span><span class="cx">     BorderImageSliceParseContext context(*this);
</span><span class="cx">     CSSParserValue* value;
</span><span class="cx">     while ((value = m_valueList-&gt;current())) {
</span><ins>+        ValueWithCalculation valueWithCalculation(*value);
</ins><span class="cx">         // FIXME calc() http://webkit.org/b/16662 : calc is parsed but values are not created yet.
</span><del>-        if (context.allowNumber() &amp;&amp; !isCalculation(*value) &amp;&amp; validUnit(*value, FInteger | FNonNeg | FPercent, CSSStrictMode)) {
-            context.commitNumber(*value);
</del><ins>+        if (context.allowNumber() &amp;&amp; !isCalculation(valueWithCalculation) &amp;&amp; validateUnit(valueWithCalculation, FInteger | FNonNeg | FPercent, CSSStrictMode)) {
+            context.commitNumber(valueWithCalculation);
</ins><span class="cx">         } else if (context.allowFill() &amp;&amp; value-&gt;id == CSSValueFill)
</span><span class="cx">             context.commitFill();
</span><span class="cx">         else if (!inShorthand()) {
</span><span class="lines">@@ -7751,13 +7774,13 @@
</span><span class="cx">     bool allowFinalCommit() const { return m_allowFinalCommit; }
</span><span class="cx">     CSSPrimitiveValue* top() const { return m_top.get(); }
</span><span class="cx"> 
</span><del>-    void commitNumber(CSSParserValue&amp; value)
</del><ins>+    void commitNumber(CSSParser::ValueWithCalculation&amp; valueWithCalculation)
</ins><span class="cx">     {
</span><span class="cx">         RefPtr&lt;CSSPrimitiveValue&gt; primitiveValue;
</span><del>-        if (value.id == CSSValueAuto)
-            primitiveValue = cssValuePool().createIdentifierValue(value.id);
</del><ins>+        if (valueWithCalculation.value().id == CSSValueAuto)
+            primitiveValue = cssValuePool().createIdentifierValue(valueWithCalculation.value().id);
</ins><span class="cx">         else
</span><del>-            primitiveValue = m_parser.createPrimitiveNumericValue(value);
</del><ins>+            primitiveValue = m_parser.createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx"> 
</span><span class="cx">         if (!m_top)
</span><span class="cx">             m_top = primitiveValue.release();
</span><span class="lines">@@ -7819,10 +7842,11 @@
</span><span class="cx"> bool CSSParser::parseBorderImageQuad(Units validUnits, RefPtr&lt;CSSPrimitiveValue&gt;&amp; result)
</span><span class="cx"> {
</span><span class="cx">     BorderImageQuadParseContext context(*this);
</span><del>-    CSSParserValue* currentValue;
-    while ((currentValue = m_valueList-&gt;current())) {
-        if (context.allowNumber() &amp;&amp; (validUnit(*currentValue, validUnits, CSSStrictMode) || currentValue-&gt;id == CSSValueAuto)) {
-            context.commitNumber(*currentValue);
</del><ins>+    CSSParserValue* value;
+    while ((value = m_valueList-&gt;current())) {
+        ValueWithCalculation valueWithCalculation(*value);
+        if (context.allowNumber() &amp;&amp; (validateUnit(valueWithCalculation, validUnits, CSSStrictMode) || value-&gt;id == CSSValueAuto)) {
+            context.commitNumber(valueWithCalculation);
</ins><span class="cx">         } else if (!inShorthand()) {
</span><span class="cx">             // If we're not parsing a shorthand then we are invalid.
</span><span class="cx">             return false;
</span><span class="lines">@@ -7879,10 +7903,11 @@
</span><span class="cx">         if (i - indexAfterSlash &gt;= 4)
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        if (!validUnit(value, FLength | FPercent | FNonNeg))
</del><ins>+        ValueWithCalculation valueWithCalculation(value);
+        if (!validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg))
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        RefPtr&lt;CSSPrimitiveValue&gt; radius = createPrimitiveNumericValue(value);
</del><ins>+        RefPtr&lt;CSSPrimitiveValue&gt; radius = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx"> 
</span><span class="cx">         if (!indexAfterSlash) {
</span><span class="cx">             radii[0][i] = radius;
</span><span class="lines">@@ -7925,20 +7950,21 @@
</span><span class="cx">     if (num != 3)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    CSSParserValue&amp; lvalue = *m_valueList-&gt;valueAt(0);
</del><span class="cx">     CSSParserValue&amp; op = *m_valueList-&gt;valueAt(1);
</span><del>-    CSSParserValue&amp; rvalue = *m_valueList-&gt;valueAt(2);
</del><span class="cx"> 
</span><span class="cx">     if (!isForwardSlashOperator(op))
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    if (!validUnit(lvalue, FNumber | FNonNeg) || !validUnit(rvalue, FNumber | FNonNeg))
</del><ins>+    ValueWithCalculation lvalueWithCalculation(*m_valueList-&gt;valueAt(0));
+    ValueWithCalculation rvalueWithCalculation(*m_valueList-&gt;valueAt(2));
+    if (!validateUnit(lvalueWithCalculation, FNumber | FNonNeg) || !validateUnit(rvalueWithCalculation, FNumber | FNonNeg))
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    if (!lvalue.fValue || !rvalue.fValue)
</del><ins>+    // FIXME: This doesn't handle calculated values.
+    if (!lvalueWithCalculation.value().fValue || !rvalueWithCalculation.value().fValue)
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    addProperty(CSSPropertyWebkitAspectRatio, CSSAspectRatioValue::create(narrowPrecisionToFloat(lvalue.fValue), narrowPrecisionToFloat(rvalue.fValue)), important);
</del><ins>+    addProperty(CSSPropertyWebkitAspectRatio, CSSAspectRatioValue::create(narrowPrecisionToFloat(lvalueWithCalculation.value().fValue), narrowPrecisionToFloat(rvalueWithCalculation.value().fValue)), important);
</ins><span class="cx"> 
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="lines">@@ -8132,9 +8158,11 @@
</span><span class="cx">     // For radial gradients only, we now expect a numeric radius.
</span><span class="cx">     if (gradientType == CSSDeprecatedRadialGradient) {
</span><span class="cx">         argument = args-&gt;next();
</span><ins>+        // FIXME: This does not handle calculation values.
</ins><span class="cx">         if (!argument || argument-&gt;unit != CSSPrimitiveValue::CSS_NUMBER)
</span><span class="cx">             return false;
</span><del>-        downcast&lt;CSSRadialGradientValue&gt;(*result).setFirstRadius(createPrimitiveNumericValue(*argument));
</del><ins>+        ValueWithCalculation argumentWithCalculation(*argument);
+        downcast&lt;CSSRadialGradientValue&gt;(*result).setFirstRadius(createPrimitiveNumericValue(argumentWithCalculation));
</ins><span class="cx"> 
</span><span class="cx">         // Comma after the first radius.
</span><span class="cx">         argument = args-&gt;next();
</span><span class="lines">@@ -8169,9 +8197,11 @@
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="cx">         argument = args-&gt;next();
</span><ins>+        // FIXME: This does not handle calculation values.
</ins><span class="cx">         if (!argument || argument-&gt;unit != CSSPrimitiveValue::CSS_NUMBER)
</span><span class="cx">             return false;
</span><del>-        downcast&lt;CSSRadialGradientValue&gt;(*result).setSecondRadius(createPrimitiveNumericValue(*argument));
</del><ins>+        ValueWithCalculation argumentWithCalculation(*argument);
+        downcast&lt;CSSRadialGradientValue&gt;(*result).setSecondRadius(createPrimitiveNumericValue(argumentWithCalculation));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // We now will accept any number of stops (0 or more).
</span><span class="lines">@@ -8241,11 +8271,12 @@
</span><span class="cx">     CSSParserValue* argument = args-&gt;current();
</span><span class="cx">     if (!argument)
</span><span class="cx">         return false;
</span><ins>+    ValueWithCalculation argumentWithCalculation(*argument);
</ins><span class="cx"> 
</span><span class="cx">     bool expectComma = false;
</span><span class="cx">     // Look for angle.
</span><del>-    if (validUnit(*argument, FAngle, CSSStrictMode)) {
-        result-&gt;setAngle(createPrimitiveNumericValue(*argument));
</del><ins>+    if (validateUnit(argumentWithCalculation, FAngle, CSSStrictMode)) {
+        result-&gt;setAngle(createPrimitiveNumericValue(argumentWithCalculation));
</ins><span class="cx"> 
</span><span class="cx">         args-&gt;next();
</span><span class="cx">         expectComma = true;
</span><span class="lines">@@ -8382,8 +8413,9 @@
</span><span class="cx">     RefPtr&lt;CSSPrimitiveValue&gt; verticalSize;
</span><span class="cx"> 
</span><span class="cx">     if (!shapeValue &amp;&amp; !sizeValue) {
</span><del>-        if (validUnit(*argument, FLength | FPercent)) {
-            horizontalSize = createPrimitiveNumericValue(*argument);
</del><ins>+        ValueWithCalculation hSizeWithCalculation(*argument);
+        if (validateUnit(hSizeWithCalculation, FLength | FPercent)) {
+            horizontalSize = createPrimitiveNumericValue(hSizeWithCalculation);
</ins><span class="cx">             argument = args-&gt;next();
</span><span class="cx">             if (!argument)
</span><span class="cx">                 return false;
</span><span class="lines">@@ -8391,8 +8423,9 @@
</span><span class="cx">             expectComma = true;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (validUnit(*argument, FLength | FPercent)) {
-            verticalSize = createPrimitiveNumericValue(*argument);
</del><ins>+        ValueWithCalculation vSizeWithCalculation(*argument);
+        if (validateUnit(vSizeWithCalculation, FLength | FPercent)) {
+            verticalSize = createPrimitiveNumericValue(vSizeWithCalculation);
</ins><span class="cx"> 
</span><span class="cx">             argument = args-&gt;next();
</span><span class="cx">             if (!argument)
</span><span class="lines">@@ -8423,28 +8456,29 @@
</span><span class="cx">     if (!args || !args-&gt;size())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    CSSParserValue* argument = args-&gt;current();
-    if (!argument)
</del><ins>+    if (!args-&gt;current())
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><ins>+    ValueWithCalculation firstArgumentWithCalculation(*args-&gt;current());
+
</ins><span class="cx">     bool expectComma = false;
</span><span class="cx">     // Look for angle.
</span><del>-    if (validUnit(*argument, FAngle, CSSStrictMode)) {
-        result-&gt;setAngle(createPrimitiveNumericValue(*argument));
</del><ins>+    if (validateUnit(firstArgumentWithCalculation, FAngle, CSSStrictMode)) {
+        result-&gt;setAngle(createPrimitiveNumericValue(firstArgumentWithCalculation));
</ins><span class="cx"> 
</span><span class="cx">         args-&gt;next();
</span><span class="cx">         expectComma = true;
</span><del>-    } else if (argument-&gt;unit == CSSPrimitiveValue::CSS_IDENT &amp;&amp; equalIgnoringCase(*argument, &quot;to&quot;)) {
</del><ins>+    } else if (firstArgumentWithCalculation.value().unit == CSSPrimitiveValue::CSS_IDENT &amp;&amp; equalIgnoringCase(firstArgumentWithCalculation, &quot;to&quot;)) {
</ins><span class="cx">         // to [ [left | right] || [top | bottom] ]
</span><del>-        argument = args-&gt;next();
-        if (!argument)
</del><ins>+        CSSParserValue* nextArgument = args-&gt;next();
+        if (!nextArgument)
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="cx">         RefPtr&lt;CSSPrimitiveValue&gt; endX, endY;
</span><span class="cx">         RefPtr&lt;CSSPrimitiveValue&gt; location;
</span><span class="cx">         bool isHorizontal = false;
</span><span class="cx"> 
</span><del>-        location = valueFromSideKeyword(*argument, isHorizontal);
</del><ins>+        location = valueFromSideKeyword(*nextArgument, isHorizontal);
</ins><span class="cx">         if (!location)
</span><span class="cx">             return false;
</span><span class="cx"> 
</span><span class="lines">@@ -8453,11 +8487,11 @@
</span><span class="cx">         else
</span><span class="cx">             endY = location;
</span><span class="cx"> 
</span><del>-        argument = args-&gt;next();
-        if (!argument)
</del><ins>+        nextArgument = args-&gt;next();
+        if (!nextArgument)
</ins><span class="cx">             return false;
</span><span class="cx"> 
</span><del>-        location = valueFromSideKeyword(*argument, isHorizontal);
</del><ins>+        location = valueFromSideKeyword(*nextArgument, isHorizontal);
</ins><span class="cx">         if (location) {
</span><span class="cx">             if (isHorizontal) {
</span><span class="cx">                 if (endX)
</span><span class="lines">@@ -8511,6 +8545,7 @@
</span><span class="cx">     // [ ellipse || [ &lt;length&gt; | &lt;percentage&gt; ]{2} ] |
</span><span class="cx">     // [ [ circle | ellipse] || &lt;size-keyword&gt; ]
</span><span class="cx">     for (int i = 0; i &lt; 3; ++i) {
</span><ins>+        ValueWithCalculation argumentWithCalculation(*argument);
</ins><span class="cx">         if (argument-&gt;unit == CSSPrimitiveValue::CSS_IDENT) {
</span><span class="cx">             bool badIdent = false;
</span><span class="cx">             switch (argument-&gt;id) {
</span><span class="lines">@@ -8538,18 +8573,19 @@
</span><span class="cx">             argument = args-&gt;next();
</span><span class="cx">             if (!argument)
</span><span class="cx">                 return false;
</span><del>-        } else if (validUnit(*argument, FLength | FPercent)) {
</del><ins>+        } else if (validateUnit(argumentWithCalculation, FLength | FPercent)) {
</ins><span class="cx"> 
</span><span class="cx">             if (sizeValue || horizontalSize)
</span><span class="cx">                 return false;
</span><del>-            horizontalSize = createPrimitiveNumericValue(*argument);
</del><ins>+            horizontalSize = createPrimitiveNumericValue(argumentWithCalculation);
</ins><span class="cx"> 
</span><span class="cx">             argument = args-&gt;next();
</span><span class="cx">             if (!argument)
</span><span class="cx">                 return false;
</span><span class="cx"> 
</span><del>-            if (validUnit(*argument, FLength | FPercent)) {
-                verticalSize = createPrimitiveNumericValue(*argument);
</del><ins>+            ValueWithCalculation vSizeWithCalculation(*argument);
+            if (validateUnit(vSizeWithCalculation, FLength | FPercent)) {
+                verticalSize = createPrimitiveNumericValue(vSizeWithCalculation);
</ins><span class="cx">                 ++i;
</span><span class="cx">                 argument = args-&gt;next();
</span><span class="cx">                 if (!argument)
</span><span class="lines">@@ -8613,38 +8649,39 @@
</span><span class="cx"> 
</span><span class="cx"> bool CSSParser::parseGradientColorStops(CSSParserValueList&amp; valueList, CSSGradientValue&amp; gradient, bool expectComma)
</span><span class="cx"> {
</span><del>-    CSSParserValue* currentValue = valueList.current();
</del><ins>+    CSSParserValue* value = valueList.current();
</ins><span class="cx">     bool previousStopWasMidpoint = true;
</span><span class="cx"> 
</span><span class="cx">     // Now look for color stops.
</span><del>-    while (currentValue) {
</del><ins>+    while (value) {
</ins><span class="cx">         // Look for the comma before the next stop.
</span><span class="cx">         if (expectComma) {
</span><del>-            if (!isComma(currentValue))
</del><ins>+            if (!isComma(value))
</ins><span class="cx">                 return false;
</span><span class="cx"> 
</span><del>-            currentValue = valueList.next();
-            if (!currentValue)
</del><ins>+            value = valueList.next();
+            if (!value)
</ins><span class="cx">                 return false;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         // &lt;color-stop&gt; = &lt;color&gt; [ &lt;percentage&gt; | &lt;length&gt; ]?
</span><span class="cx">         CSSGradientColorStop stop;
</span><del>-        stop.m_color = parseGradientColorOrKeyword(*this, *currentValue);
</del><ins>+        stop.m_color = parseGradientColorOrKeyword(*this, *value);
</ins><span class="cx">         if (!stop.m_color) {
</span><span class="cx">             if (previousStopWasMidpoint) // 2 midpoints in a row is not allowed. This also catches starting with a midpoint.
</span><span class="cx">                 return false;
</span><span class="cx"> 
</span><span class="cx">             stop.isMidpoint = true;
</span><span class="cx">         } else
</span><del>-            currentValue = valueList.next();
</del><ins>+            value = valueList.next();
</ins><span class="cx"> 
</span><span class="cx">         previousStopWasMidpoint = stop.isMidpoint;
</span><span class="cx"> 
</span><del>-        if (currentValue) {
-            if (validUnit(*currentValue, FLength | FPercent)) {
-                stop.m_position = createPrimitiveNumericValue(*currentValue);
-                currentValue = valueList.next();
</del><ins>+        if (value) {
+            ValueWithCalculation valueWithCalculation(*value);
+            if (validateUnit(valueWithCalculation, FLength | FPercent)) {
+                stop.m_position = createPrimitiveNumericValue(valueWithCalculation);
+                value = valueList.next();
</ins><span class="cx">             } else if (stop.isMidpoint)
</span><span class="cx">                 return false;
</span><span class="cx">         }
</span><span class="lines">@@ -8845,14 +8882,15 @@
</span><span class="cx"> 
</span><span class="cx">     CSSParserValue* value = m_valueList-&gt;current();
</span><span class="cx">     while (value) {
</span><ins>+        ValueWithCalculation valueWithCalculation(*value);
</ins><span class="cx">         if (!haveFromImage &amp;&amp; value-&gt;id == CSSValueFromImage) {
</span><span class="cx">             list-&gt;append(cssValuePool().createIdentifierValue(value-&gt;id));
</span><span class="cx">             haveFromImage = true;
</span><span class="cx">         } else if (!haveSnap &amp;&amp; value-&gt;id == CSSValueSnap) {
</span><span class="cx">             list-&gt;append(cssValuePool().createIdentifierValue(value-&gt;id));
</span><span class="cx">             haveSnap = true;
</span><del>-        } else if (!haveResolution &amp;&amp; validUnit(*value, FResolution | FNonNeg) &amp;&amp; value-&gt;fValue &gt; 0) {
-            list-&gt;append(createPrimitiveNumericValue(*value));
</del><ins>+        } else if (!haveResolution &amp;&amp; validateUnit(valueWithCalculation, FResolution | FNonNeg) &amp;&amp; value-&gt;fValue &gt; 0) {
+            list-&gt;append(createPrimitiveNumericValue(valueWithCalculation));
</ins><span class="cx">             haveResolution = true;
</span><span class="cx">         } else
</span><span class="cx">             return nullptr;
</span><span class="lines">@@ -9224,29 +9262,30 @@
</span><span class="cx">     CSSParserValue* argument = args-&gt;current();
</span><span class="cx">     unsigned argNumber = 0;
</span><span class="cx">     while (argument) {
</span><ins>+        ValueWithCalculation argumentWithCalculation(*argument);
</ins><span class="cx">         CSSParser::Units unit = info.unit();
</span><span class="cx"> 
</span><span class="cx">         if (info.type() == WebKitCSSTransformValue::Rotate3DTransformOperation &amp;&amp; argNumber == 3) {
</span><span class="cx">             // 4th param of rotate3d() is an angle rather than a bare number, validate it as such
</span><del>-            if (!validUnit(*argument, FAngle, CSSStrictMode))
</del><ins>+            if (!validateUnit(argumentWithCalculation, FAngle, CSSStrictMode))
</ins><span class="cx">                 return nullptr;
</span><span class="cx">         } else if (info.type() == WebKitCSSTransformValue::Translate3DTransformOperation &amp;&amp; argNumber == 2) {
</span><span class="cx">             // 3rd param of translate3d() cannot be a percentage
</span><del>-            if (!validUnit(*argument, FLength, CSSStrictMode))
</del><ins>+            if (!validateUnit(argumentWithCalculation, FLength, CSSStrictMode))
</ins><span class="cx">                 return nullptr;
</span><span class="cx">         } else if (info.type() == WebKitCSSTransformValue::TranslateZTransformOperation &amp;&amp; !argNumber) {
</span><span class="cx">             // 1st param of translateZ() cannot be a percentage
</span><del>-            if (!validUnit(*argument, FLength, CSSStrictMode))
</del><ins>+            if (!validateUnit(argumentWithCalculation, FLength, CSSStrictMode))
</ins><span class="cx">                 return nullptr;
</span><span class="cx">         } else if (info.type() == WebKitCSSTransformValue::PerspectiveTransformOperation &amp;&amp; !argNumber) {
</span><span class="cx">             // 1st param of perspective() must be a non-negative number (deprecated) or length.
</span><del>-            if (!validUnit(*argument, FNumber | FLength | FNonNeg, CSSStrictMode))
</del><ins>+            if (!validateUnit(argumentWithCalculation, FNumber | FLength | FNonNeg, CSSStrictMode))
</ins><span class="cx">                 return nullptr;
</span><del>-        } else if (!validUnit(*argument, unit, CSSStrictMode))
</del><ins>+        } else if (!validateUnit(argumentWithCalculation, unit, CSSStrictMode))
</ins><span class="cx">             return nullptr;
</span><span class="cx"> 
</span><span class="cx">         // Add the value to the current transform operation.
</span><del>-        transformValue-&gt;append(createPrimitiveNumericValue(*argument));
</del><ins>+        transformValue-&gt;append(createPrimitiveNumericValue(argumentWithCalculation));
</ins><span class="cx"> 
</span><span class="cx">         argument = args-&gt;next();
</span><span class="cx">         if (!argument)
</span><span class="lines">@@ -9316,21 +9355,22 @@
</span><span class="cx">             return nullptr;
</span><span class="cx"> 
</span><span class="cx">         if (args.size()) {
</span><del>-            CSSParserValue&amp; value = *args.current();
-            if (!validUnit(value, FNumber | FPercent | FNonNeg, CSSStrictMode))
</del><ins>+            ValueWithCalculation argumentWithCalculation(*args.current());
+            if (!validateUnit(argumentWithCalculation, FNumber | FPercent | FNonNeg, CSSStrictMode))
</ins><span class="cx">                 return nullptr;
</span><span class="cx">                 
</span><del>-            double amount = value.fValue;
</del><ins>+            // FIXME: This does not handle calculated values.
+            double amount = argumentWithCalculation.value().fValue;
</ins><span class="cx">             
</span><span class="cx">             // Saturate and Contrast allow values over 100%.
</span><span class="cx">             if (filterType != WebKitCSSFilterValue::SaturateFilterOperation
</span><span class="cx">                 &amp;&amp; filterType != WebKitCSSFilterValue::ContrastFilterOperation) {
</span><del>-                double maxAllowed = value.unit == CSSPrimitiveValue::CSS_PERCENTAGE ? 100.0 : 1.0;
</del><ins>+                double maxAllowed = argumentWithCalculation.value().unit == CSSPrimitiveValue::CSS_PERCENTAGE ? 100.0 : 1.0;
</ins><span class="cx">                 if (amount &gt; maxAllowed)
</span><span class="cx">                     return nullptr;
</span><span class="cx">             }
</span><span class="cx"> 
</span><del>-            filterValue-&gt;append(cssValuePool().createValue(amount, static_cast&lt;CSSPrimitiveValue::UnitTypes&gt;(value.unit)));
</del><ins>+            filterValue-&gt;append(cssValuePool().createValue(amount, static_cast&lt;CSSPrimitiveValue::UnitTypes&gt;(argumentWithCalculation.value().unit)));
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -9340,11 +9380,12 @@
</span><span class="cx">             return nullptr;
</span><span class="cx"> 
</span><span class="cx">         if (args.size()) {
</span><del>-            CSSParserValue&amp; value = *args.current();
-            if (!validUnit(value, FNumber | FPercent, CSSStrictMode))
</del><ins>+            ValueWithCalculation argumentWithCalculation(*args.current());
+            if (!validateUnit(argumentWithCalculation, FNumber | FPercent, CSSStrictMode))
</ins><span class="cx">                 return nullptr;
</span><span class="cx"> 
</span><del>-            filterValue-&gt;append(cssValuePool().createValue(value.fValue, static_cast&lt;CSSPrimitiveValue::UnitTypes&gt;(value.unit)));
</del><ins>+            // FIXME: This doesn't handle calculated values.
+            filterValue-&gt;append(cssValuePool().createValue(argumentWithCalculation.value().fValue, static_cast&lt;CSSPrimitiveValue::UnitTypes&gt;(argumentWithCalculation.value().unit)));
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -9354,11 +9395,11 @@
</span><span class="cx">             return nullptr;
</span><span class="cx">         
</span><span class="cx">         if (args.size()) {
</span><del>-            CSSParserValue&amp; argument = *args.current();
-            if (!validUnit(argument, FAngle, CSSStrictMode))
</del><ins>+            ValueWithCalculation argumentWithCalculation(*args.current());
+            if (!validateUnit(argumentWithCalculation, FAngle, CSSStrictMode))
</ins><span class="cx">                 return nullptr;
</span><span class="cx">         
</span><del>-            filterValue-&gt;append(createPrimitiveNumericValue(argument));
</del><ins>+            filterValue-&gt;append(createPrimitiveNumericValue(argumentWithCalculation));
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -9368,11 +9409,11 @@
</span><span class="cx">             return nullptr;
</span><span class="cx">         
</span><span class="cx">         if (args.size()) {
</span><del>-            CSSParserValue&amp; argument = *args.current();
-            if (!validUnit(argument, FLength | FNonNeg, CSSStrictMode))
</del><ins>+            ValueWithCalculation argumentWithCalculation(*args.current());
+            if (!validateUnit(argumentWithCalculation, FLength | FNonNeg, CSSStrictMode))
</ins><span class="cx">                 return nullptr;
</span><span class="cx"> 
</span><del>-            filterValue-&gt;append(createPrimitiveNumericValue(argument));
</del><ins>+            filterValue-&gt;append(createPrimitiveNumericValue(argumentWithCalculation));
</ins><span class="cx">         }
</span><span class="cx">         break;
</span><span class="cx">     }
</span><span class="lines">@@ -9566,8 +9607,9 @@
</span><span class="cx">             break;
</span><span class="cx">         }
</span><span class="cx">         case CSSPropertyWebkitTransformOriginZ: {
</span><del>-            if (validUnit(*m_valueList-&gt;current(), FLength))
-                value = createPrimitiveNumericValue(*m_valueList-&gt;current());
</del><ins>+            ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
+            if (validateUnit(valueWithCalculation, FLength))
+                value = createPrimitiveNumericValue(valueWithCalculation);
</ins><span class="cx">             if (value)
</span><span class="cx">                 m_valueList-&gt;next();
</span><span class="cx">             break;
</span><span class="lines">@@ -9823,8 +9865,9 @@
</span><span class="cx"> 
</span><span class="cx">     CSSParserValue* value = m_valueList-&gt;current();
</span><span class="cx">     while (value) {
</span><del>-        if (!hasLengthOrPercentage &amp;&amp; validUnit(*value, FLength | FPercent)) {
-            list-&gt;append(createPrimitiveNumericValue(*value));
</del><ins>+        ValueWithCalculation valueWithCalculation(*value);
+        if (!hasLengthOrPercentage &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent)) {
+            list-&gt;append(createPrimitiveNumericValue(valueWithCalculation));
</ins><span class="cx">             hasLengthOrPercentage = true;
</span><span class="cx">         }
</span><span class="cx"> #if ENABLE(CSS3_TEXT)
</span><span class="lines">@@ -10000,21 +10043,15 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool CSSParser::parseCalculation(CSSParserValue&amp; value, CalculationPermittedValueRange range)
</del><ins>+RefPtr&lt;CSSCalcValue&gt; CSSParser::parseCalculation(CSSParserValue&amp; value, CalculationPermittedValueRange range)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isCalculation(value));
</span><span class="cx">     
</span><span class="cx">     CSSParserValueList* args = value.function-&gt;args.get();
</span><span class="cx">     if (!args || !args-&gt;size())
</span><del>-        return false;
</del><ins>+        return nullptr;
</ins><span class="cx"> 
</span><del>-    ASSERT(!m_parsedCalculation);
-    m_parsedCalculation = CSSCalcValue::create(value.function-&gt;name, *args, range);
-    
-    if (!m_parsedCalculation)
-        return false;
-    
-    return true;
</del><ins>+    return CSSCalcValue::create(value.function-&gt;name, *args, range);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #define END_TOKEN 0
</span><span class="lines">@@ -12208,11 +12245,12 @@
</span><span class="cx"> 
</span><span class="cx"> bool CSSParser::parseViewportProperty(CSSPropertyID propId, bool important)
</span><span class="cx"> {
</span><del>-    CSSParserValue* value = m_valueList-&gt;current();
-    if (!value)
</del><ins>+    if (!m_valueList-&gt;current())
</ins><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    CSSValueID id = value-&gt;id;
</del><ins>+    ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
+
+    CSSValueID id = valueWithCalculation.value().id;
</ins><span class="cx">     bool validPrimitive = false;
</span><span class="cx"> 
</span><span class="cx">     switch (propId) {
</span><span class="lines">@@ -12223,7 +12261,7 @@
</span><span class="cx">         if (id == CSSValueAuto || id == CSSValueDeviceWidth || id == CSSValueDeviceHeight)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = (!id &amp;&amp; validUnit(*value, FLength | FPercent | FNonNeg));
</del><ins>+            validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg));
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyWidth: // shorthand
</span><span class="cx">         return parseViewportShorthand(propId, CSSPropertyMinWidth, CSSPropertyMaxWidth, important);
</span><span class="lines">@@ -12235,7 +12273,7 @@
</span><span class="cx">         if (id == CSSValueAuto)
</span><span class="cx">             validPrimitive = true;
</span><span class="cx">         else
</span><del>-            validPrimitive = (!id &amp;&amp; validUnit(*value, FNumber | FPercent | FNonNeg));
</del><ins>+            validPrimitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FNumber | FPercent | FNonNeg));
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyUserZoom: // zoom | fixed
</span><span class="cx">         if (id == CSSValueZoom || id == CSSValueFixed)
</span><span class="lines">@@ -12250,7 +12288,7 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr&lt;CSSValue&gt; parsedValue;
</span><span class="cx">     if (validPrimitive) {
</span><del>-        parsedValue = parseValidPrimitive(id, *value);
</del><ins>+        parsedValue = parseValidPrimitive(id, valueWithCalculation);
</ins><span class="cx">         m_valueList-&gt;next();
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSParser.h (177622 => 177623)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSParser.h        2014-12-20 18:28:37 UTC (rev 177622)
+++ trunk/Source/WebCore/css/CSSParser.h        2014-12-21 02:56:23 UTC (rev 177623)
</span><span class="lines">@@ -80,6 +80,27 @@
</span><span class="cx">         GeneralSyntaxError
</span><span class="cx">     };
</span><span class="cx"> 
</span><ins>+    class ValueWithCalculation {
+    public:
+        explicit ValueWithCalculation(CSSParserValue&amp; value)
+            : m_value(value)
+        { }
+
+        CSSParserValue&amp; value() const { return m_value; }
+        operator CSSParserValue&amp;() { return m_value; }
+
+        CSSCalcValue* calculation() const { return m_calculation.get(); }
+        void setCalculation(RefPtr&lt;CSSCalcValue&gt;&amp;&amp; calculation)
+        {
+            isCalculation(m_value);
+            m_calculation = calculation;
+        }
+
+    private:
+        CSSParserValue&amp; m_value;
+        RefPtr&lt;CSSCalcValue&gt; m_calculation;
+    };
+
</ins><span class="cx">     CSSParser(const CSSParserContext&amp;);
</span><span class="cx"> 
</span><span class="cx">     ~CSSParser();
</span><span class="lines">@@ -92,7 +113,7 @@
</span><span class="cx">     static bool parseColor(RGBA32&amp; color, const String&amp;, bool strict = false);
</span><span class="cx">     static bool parseSystemColor(RGBA32&amp; color, const String&amp;, Document*);
</span><span class="cx">     static PassRefPtr&lt;CSSValueList&gt; parseFontFaceValue(const AtomicString&amp;);
</span><del>-    PassRefPtr&lt;CSSPrimitiveValue&gt; parseValidPrimitive(CSSValueID ident, CSSParserValue&amp;);
</del><ins>+    PassRefPtr&lt;CSSPrimitiveValue&gt; parseValidPrimitive(CSSValueID ident, ValueWithCalculation&amp;);
</ins><span class="cx">     bool parseDeclaration(MutableStyleProperties*, const String&amp;, PassRefPtr&lt;CSSRuleSourceData&gt;, StyleSheetContents* contextStyleSheet);
</span><span class="cx">     static Ref&lt;ImmutableStyleProperties&gt; parseInlineStyleDeclaration(const String&amp;, Element*);
</span><span class="cx">     std::unique_ptr&lt;MediaQuery&gt; parseMediaQuery(const String&amp;);
</span><span class="lines">@@ -282,7 +303,7 @@
</span><span class="cx">     PassRefPtr&lt;CSSValue&gt; parseTextIndent();
</span><span class="cx">     
</span><span class="cx">     bool parseLineBoxContain(bool important);
</span><del>-    bool parseCalculation(CSSParserValue&amp;, CalculationPermittedValueRange);
</del><ins>+    RefPtr&lt;CSSCalcValue&gt; parseCalculation(CSSParserValue&amp;, CalculationPermittedValueRange);
</ins><span class="cx"> 
</span><span class="cx">     bool parseFontFeatureTag(CSSValueList&amp;);
</span><span class="cx">     bool parseFontFeatureSettings(bool important);
</span><span class="lines">@@ -404,7 +425,7 @@
</span><span class="cx">     PassRefPtr&lt;StyleRuleBase&gt; createViewportRule();
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><del>-    Ref&lt;CSSPrimitiveValue&gt; createPrimitiveNumericValue(CSSParserValue&amp;);
</del><ins>+    Ref&lt;CSSPrimitiveValue&gt; createPrimitiveNumericValue(ValueWithCalculation&amp;);
</ins><span class="cx">     Ref&lt;CSSPrimitiveValue&gt; createPrimitiveStringValue(CSSParserValue&amp;);
</span><span class="cx"> 
</span><span class="cx">     static URL completeURL(const CSSParserContext&amp;, const String&amp; url);
</span><span class="lines">@@ -498,8 +519,8 @@
</span><span class="cx">     void setupParser(const char* prefix, unsigned prefixLength, const String&amp;, const char* suffix, unsigned suffixLength);
</span><span class="cx">     bool inShorthand() const { return m_inParseShorthand; }
</span><span class="cx"> 
</span><del>-    bool validWidth(CSSParserValue&amp;);
-    bool validHeight(CSSParserValue&amp;);
</del><ins>+    bool validateWidth(ValueWithCalculation&amp;);
+    bool validateHeight(ValueWithCalculation&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void deleteFontFaceOnlyValues();
</span><span class="cx"> 
</span><span class="lines">@@ -578,8 +599,6 @@
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;Vector&lt;std::unique_ptr&lt;CSSParserSelector&gt;&gt;&gt; m_recycledSelectorVector;
</span><span class="cx"> 
</span><del>-    RefPtr&lt;CSSCalcValue&gt; m_parsedCalculation;
-
</del><span class="cx">     std::unique_ptr&lt;RuleSourceDataList&gt; m_supportsRuleDataStack;
</span><span class="cx"> 
</span><span class="cx">     // defines units allowed for a certain property, used in parseUnit
</span><span class="lines">@@ -613,16 +632,16 @@
</span><span class="cx">     bool isLoggingErrors();
</span><span class="cx">     void logError(const String&amp; message, int lineNumber);
</span><span class="cx"> 
</span><del>-    bool validCalculationUnit(CSSParserValue&amp;, Units, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue);
</del><ins>+    bool validateCalculationUnit(ValueWithCalculation&amp;, Units);
</ins><span class="cx"> 
</span><span class="cx">     bool shouldAcceptUnitLessValues(CSSParserValue&amp;, Units, CSSParserMode);
</span><span class="cx"> 
</span><del>-    inline bool validUnit(CSSParserValue&amp; value, Units unitflags, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue) { return validUnit(value, unitflags, m_context.mode, releaseCalc); }
-    bool validUnit(CSSParserValue&amp;, Units, CSSParserMode, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue);
</del><ins>+    inline bool validateUnit(ValueWithCalculation&amp; value, Units unitFlags) { return validateUnit(value, unitFlags, m_context.mode); }
+    bool validateUnit(ValueWithCalculation&amp;, Units, CSSParserMode);
</ins><span class="cx"> 
</span><span class="cx">     bool parseBorderImageQuad(Units, RefPtr&lt;CSSPrimitiveValue&gt;&amp;);
</span><del>-    int colorIntFromValue(CSSParserValue&amp;);
-    double parsedDouble(CSSParserValue&amp;, ReleaseParsedCalcValueCondition releaseCalc = DoNotReleaseParsedCalcValue);
</del><ins>+    int colorIntFromValue(ValueWithCalculation&amp;);
+    double parsedDouble(ValueWithCalculation&amp;);
</ins><span class="cx">     
</span><span class="cx">     friend class TransformOperationInfo;
</span><span class="cx">     friend class FilterOperationInfo;
</span></span></pre></div>
<a id="trunkSourceWebCorecssSVGCSSParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/SVGCSSParser.cpp (177622 => 177623)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/SVGCSSParser.cpp        2014-12-20 18:28:37 UTC (rev 177622)
+++ trunk/Source/WebCore/css/SVGCSSParser.cpp        2014-12-21 02:56:23 UTC (rev 177623)
</span><span class="lines">@@ -35,11 +35,11 @@
</span><span class="cx"> 
</span><span class="cx"> bool CSSParser::parseSVGValue(CSSPropertyID propId, bool important)
</span><span class="cx"> {
</span><del>-    CSSParserValue* value = m_valueList-&gt;current();
-    if (!value)
</del><ins>+    if (!m_valueList-&gt;current())
</ins><span class="cx">         return false;
</span><ins>+    ValueWithCalculation valueWithCalculation(*m_valueList-&gt;current());
</ins><span class="cx"> 
</span><del>-    CSSValueID id = value-&gt;id;
</del><ins>+    CSSValueID id = valueWithCalculation.value().id;
</ins><span class="cx"> 
</span><span class="cx">     bool valid_primitive = false;
</span><span class="cx">     RefPtr&lt;CSSValue&gt; parsedValue;
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx">            id &gt;= CSSValueSuper)
</span><span class="cx">             valid_primitive = true;
</span><span class="cx">         else
</span><del>-            valid_primitive = validUnit(*value, FLength | FPercent, SVGAttributeMode);
</del><ins>+            valid_primitive = validateUnit(valueWithCalculation, FLength | FPercent, SVGAttributeMode);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyDominantBaseline:
</span><span class="lines">@@ -87,8 +87,8 @@
</span><span class="cx">     case CSSPropertyMask:
</span><span class="cx">         if (id == CSSValueNone)
</span><span class="cx">             valid_primitive = true;
</span><del>-        else if (value-&gt;unit == CSSPrimitiveValue::CSS_URI) {
-            parsedValue = CSSPrimitiveValue::create(value-&gt;string, CSSPrimitiveValue::CSS_URI);
</del><ins>+        else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_URI) {
+            parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().string, CSSPrimitiveValue::CSS_URI);
</ins><span class="cx">             if (parsedValue)
</span><span class="cx">                 m_valueList-&gt;next();
</span><span class="cx">         }
</span><span class="lines">@@ -101,7 +101,7 @@
</span><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyStrokeMiterlimit:   // &lt;miterlimit&gt; | inherit
</span><del>-        valid_primitive = validUnit(*value, FNumber | FNonNeg, SVGAttributeMode);
</del><ins>+        valid_primitive = validateUnit(valueWithCalculation, FNumber | FNonNeg, SVGAttributeMode);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyStrokeLinejoin:   // miter | round | bevel | inherit
</span><span class="lines">@@ -118,7 +118,7 @@
</span><span class="cx">     case CSSPropertyFillOpacity:
</span><span class="cx">     case CSSPropertyStopOpacity:
</span><span class="cx">     case CSSPropertyFloodOpacity:
</span><del>-        valid_primitive = (!id &amp;&amp; validUnit(*value, FNumber | FPercent, SVGAttributeMode));
</del><ins>+        valid_primitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FNumber | FPercent, SVGAttributeMode));
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyShapeRendering:
</span><span class="lines">@@ -167,8 +167,8 @@
</span><span class="cx">         FALLTHROUGH;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyGlyphOrientationHorizontal: // &lt;angle&gt; (restricted to _deg_ per SVG 1.1 spec) | inherit
</span><del>-        if (value-&gt;unit == CSSPrimitiveValue::CSS_DEG || value-&gt;unit == CSSPrimitiveValue::CSS_NUMBER) {
-            parsedValue = CSSPrimitiveValue::create(value-&gt;fValue, CSSPrimitiveValue::CSS_DEG);
</del><ins>+        if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_DEG || valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_NUMBER) {
+            parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().fValue, CSSPrimitiveValue::CSS_DEG);
</ins><span class="cx"> 
</span><span class="cx">             if (parsedValue)
</span><span class="cx">                 m_valueList-&gt;next();
</span><span class="lines">@@ -189,16 +189,16 @@
</span><span class="cx">                 parsedValue = SVGPaint::createCurrentColor();
</span><span class="cx">             else if ((id &gt;= CSSValueActiveborder &amp;&amp; id &lt;= CSSValueWindowtext) || id == CSSValueMenu)
</span><span class="cx">                 parsedValue = SVGPaint::createColor(RenderTheme::defaultTheme()-&gt;systemColor(id));
</span><del>-            else if (value-&gt;unit == CSSPrimitiveValue::CSS_URI) {
</del><ins>+            else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_URI) {
</ins><span class="cx">                 RGBA32 c = Color::transparent;
</span><span class="cx">                 if (m_valueList-&gt;next()) {
</span><span class="cx">                     if (parseColorFromValue(*m_valueList-&gt;current(), c))
</span><del>-                        parsedValue = SVGPaint::createURIAndColor(value-&gt;string, c);
</del><ins>+                        parsedValue = SVGPaint::createURIAndColor(valueWithCalculation.value().string, c);
</ins><span class="cx">                     else if (m_valueList-&gt;current()-&gt;id == CSSValueNone)
</span><del>-                        parsedValue = SVGPaint::createURIAndNone(value-&gt;string);
</del><ins>+                        parsedValue = SVGPaint::createURIAndNone(valueWithCalculation.value().string);
</ins><span class="cx">                 }
</span><span class="cx">                 if (!parsedValue)
</span><del>-                    parsedValue = SVGPaint::createURI(value-&gt;string);
</del><ins>+                    parsedValue = SVGPaint::createURI(valueWithCalculation.value().string);
</ins><span class="cx">             } else
</span><span class="cx">                 parsedValue = parseSVGPaint();
</span><span class="cx"> 
</span><span class="lines">@@ -212,7 +212,7 @@
</span><span class="cx">     case CSSPropertyLightingColor:
</span><span class="cx">         if ((id &gt;= CSSValueAqua &amp;&amp; id &lt;= CSSValueWindowtext) ||
</span><span class="cx">            (id &gt;= CSSValueAliceblue &amp;&amp; id &lt;= CSSValueYellowgreen))
</span><del>-            parsedValue = SVGColor::createFromString(value-&gt;string);
</del><ins>+            parsedValue = SVGColor::createFromString(valueWithCalculation.value().string);
</ins><span class="cx">         else if (id == CSSValueCurrentcolor)
</span><span class="cx">             parsedValue = SVGColor::createCurrentColor();
</span><span class="cx">         else // TODO : svgcolor (iccColor)
</span><span class="lines">@@ -236,7 +236,7 @@
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyStrokeWidth:         // &lt;length&gt; | inherit
</span><span class="cx">     case CSSPropertyStrokeDashoffset:
</span><del>-        valid_primitive = validUnit(*value, FLength | FPercent, SVGAttributeMode);
</del><ins>+        valid_primitive = validateUnit(valueWithCalculation, FLength | FPercent, SVGAttributeMode);
</ins><span class="cx">         break;
</span><span class="cx">     case CSSPropertyStrokeDasharray:     // none | &lt;dasharray&gt; | inherit
</span><span class="cx">         if (id == CSSValueNone)
</span><span class="lines">@@ -250,15 +250,15 @@
</span><span class="cx">         if (id == CSSValueAuto || id == CSSValueNormal)
</span><span class="cx">             valid_primitive = true;
</span><span class="cx">         else
</span><del>-            valid_primitive = validUnit(*value, FLength, SVGAttributeMode);
</del><ins>+            valid_primitive = validateUnit(valueWithCalculation, FLength, SVGAttributeMode);
</ins><span class="cx">         break;
</span><span class="cx"> 
</span><span class="cx">     case CSSPropertyClipPath:    // &lt;uri&gt; | none | inherit
</span><span class="cx">     case CSSPropertyFilter:
</span><span class="cx">         if (id == CSSValueNone)
</span><span class="cx">             valid_primitive = true;
</span><del>-        else if (value-&gt;unit == CSSPrimitiveValue::CSS_URI) {
-            parsedValue = CSSPrimitiveValue::create(value-&gt;string, (CSSPrimitiveValue::UnitTypes) value-&gt;unit);
</del><ins>+        else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_URI) {
+            parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().string, (CSSPrimitiveValue::UnitTypes) valueWithCalculation.value().unit);
</ins><span class="cx">             if (parsedValue)
</span><span class="cx">                 m_valueList-&gt;next();
</span><span class="cx">         }
</span><span class="lines">@@ -306,7 +306,7 @@
</span><span class="cx">     case CSSPropertyRy:
</span><span class="cx">     case CSSPropertyX:
</span><span class="cx">     case CSSPropertyY:
</span><del>-        valid_primitive = (!id &amp;&amp; validUnit(*value, FLength | FPercent));
</del><ins>+        valid_primitive = (!id &amp;&amp; validateUnit(valueWithCalculation, FLength | FPercent));
</ins><span class="cx">         break;
</span><span class="cx">     default:
</span><span class="cx">         // If you crash here, it's because you added a css property and are not handling it
</span><span class="lines">@@ -318,14 +318,14 @@
</span><span class="cx">     if (valid_primitive) {
</span><span class="cx">         if (id != 0)
</span><span class="cx">             parsedValue = CSSPrimitiveValue::createIdentifier(id);
</span><del>-        else if (value-&gt;unit == CSSPrimitiveValue::CSS_STRING)
-            parsedValue = CSSPrimitiveValue::create(value-&gt;string, (CSSPrimitiveValue::UnitTypes) value-&gt;unit);
-        else if (value-&gt;unit &gt;= CSSPrimitiveValue::CSS_NUMBER &amp;&amp; value-&gt;unit &lt;= CSSPrimitiveValue::CSS_KHZ)
-            parsedValue = CSSPrimitiveValue::create(value-&gt;fValue, (CSSPrimitiveValue::UnitTypes) value-&gt;unit);
-        else if (value-&gt;unit &gt;= CSSParserValue::Q_EMS)
-            parsedValue = CSSPrimitiveValue::createAllowingMarginQuirk(value-&gt;fValue, CSSPrimitiveValue::CSS_EMS);
-        if (isCalculation(*value))
-            parsedValue = CSSPrimitiveValue::create(m_parsedCalculation.release());
</del><ins>+        else if (valueWithCalculation.value().unit == CSSPrimitiveValue::CSS_STRING)
+            parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().string, (CSSPrimitiveValue::UnitTypes) valueWithCalculation.value().unit);
+        else if (valueWithCalculation.value().unit &gt;= CSSPrimitiveValue::CSS_NUMBER &amp;&amp; valueWithCalculation.value().unit &lt;= CSSPrimitiveValue::CSS_KHZ)
+            parsedValue = CSSPrimitiveValue::create(valueWithCalculation.value().fValue, (CSSPrimitiveValue::UnitTypes) valueWithCalculation.value().unit);
+        else if (valueWithCalculation.value().unit &gt;= CSSParserValue::Q_EMS)
+            parsedValue = CSSPrimitiveValue::createAllowingMarginQuirk(valueWithCalculation.value().fValue, CSSPrimitiveValue::CSS_EMS);
+        if (isCalculation(valueWithCalculation))
+            parsedValue = CSSPrimitiveValue::create(valueWithCalculation.calculation());
</ins><span class="cx">         m_valueList-&gt;next();
</span><span class="cx">     }
</span><span class="cx">     if (!parsedValue || (m_valueList-&gt;current() &amp;&amp; !inShorthand()))
</span><span class="lines">@@ -341,9 +341,11 @@
</span><span class="cx">     CSSParserValue* value = m_valueList-&gt;current();
</span><span class="cx">     bool valid_primitive = true;
</span><span class="cx">     while (value) {
</span><del>-        valid_primitive = validUnit(*value, FLength | FPercent | FNonNeg, SVGAttributeMode);
</del><ins>+        ValueWithCalculation valueWithCalculation(*value);
+        valid_primitive = validateUnit(valueWithCalculation, FLength | FPercent | FNonNeg, SVGAttributeMode);
</ins><span class="cx">         if (!valid_primitive)
</span><span class="cx">             break;
</span><ins>+        // FIXME: This code doesn't handle calculated values.
</ins><span class="cx">         if (value-&gt;id != 0)
</span><span class="cx">             ret-&gt;append(CSSPrimitiveValue::createIdentifier(value-&gt;id));
</span><span class="cx">         else if (value-&gt;unit &gt;= CSSPrimitiveValue::CSS_NUMBER &amp;&amp; value-&gt;unit &lt;= CSSPrimitiveValue::CSS_KHZ)
</span><span class="lines">@@ -353,7 +355,7 @@
</span><span class="cx">             value = m_valueList-&gt;next();
</span><span class="cx">     }
</span><span class="cx">     if (!valid_primitive)
</span><del>-        return 0;
</del><ins>+        return nullptr;
</ins><span class="cx">     return ret.release();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>