<!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>[175197] trunk</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/175197">175197</a></dd>
<dt>Author</dt> <dd>zalan@apple.com</dd>
<dt>Date</dt> <dd>2014-10-24 19:37:41 -0700 (Fri, 24 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Clamp wordSpacing percentage value.
https://bugs.webkit.org/show_bug.cgi?id=129350.

Patch by Said Abou-Hallawa &lt;sabouhallawa@apple.com&gt; on 2014-10-24
Reviewed by Zalan Bujtas.

Source/WebCore:

When the CSS wordSpacing property is percentage, its value has to be within the
pre-defined min/max values for the CSS length type. This is done the same way
the wordSpacing of type &lt;length&gt; is handled.

Tests: css3/infinite-word-spacing.html.

Move the definitions of minValueForCssLength and maxValueForCssLength from the
.cpp file to the .h file.
* css/CSSPrimitiveValue.cpp:
* css/CSSPrimitiveValue.h:

Clamp the wordSpacing value to minValueForCssLength and maxValueForCssLength when
its type is percentage.
* css/DeprecatedStyleBuilder.cpp:
(WebCore::ApplyPropertyWordSpacing::applyValue):

LayoutTests:

Make sure that setting the CSS style wordSpacing property to very huge percentage
value and blending this value with other values for animating key frames does
not assert or crash. The expectation is to have this huge value to be clamped to
the pre-defined min/max values for the CSS length type. So when blending the clamped
value with other wordSpacing values, the result can't be NaN. This should be very
similar to the case when it is set to a huge &lt;length&gt; value.

* css3/infinite-word-spacing-expected.txt: Added.
* css3/infinite-word-spacing.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorecssCSSPrimitiveValuecpp">trunk/Source/WebCore/css/CSSPrimitiveValue.cpp</a></li>
<li><a href="#trunkSourceWebCorecssCSSPrimitiveValueh">trunk/Source/WebCore/css/CSSPrimitiveValue.h</a></li>
<li><a href="#trunkSourceWebCorecssDeprecatedStyleBuildercpp">trunk/Source/WebCore/css/DeprecatedStyleBuilder.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestscss3infinitewordspacingexpectedtxt">trunk/LayoutTests/css3/infinite-word-spacing-expected.txt</a></li>
<li><a href="#trunkLayoutTestscss3infinitewordspacinghtml">trunk/LayoutTests/css3/infinite-word-spacing.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (175196 => 175197)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-10-25 02:15:31 UTC (rev 175196)
+++ trunk/LayoutTests/ChangeLog        2014-10-25 02:37:41 UTC (rev 175197)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2014-10-24  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        Clamp wordSpacing percentage value.
+        https://bugs.webkit.org/show_bug.cgi?id=129350.
+
+        Reviewed by Zalan Bujtas.
+
+        Make sure that setting the CSS style wordSpacing property to very huge percentage
+        value and blending this value with other values for animating key frames does
+        not assert or crash. The expectation is to have this huge value to be clamped to
+        the pre-defined min/max values for the CSS length type. So when blending the clamped
+        value with other wordSpacing values, the result can't be NaN. This should be very
+        similar to the case when it is set to a huge &lt;length&gt; value.
+
+        * css3/infinite-word-spacing-expected.txt: Added.
+        * css3/infinite-word-spacing.html: Added.
+
</ins><span class="cx"> 2014-10-24  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Update Yosemite results for fast/block/float/overhanging-tall-block.html for
</span></span></pre></div>
<a id="trunkLayoutTestscss3infinitewordspacingexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/css3/infinite-word-spacing-expected.txt (0 => 175197)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/css3/infinite-word-spacing-expected.txt                                (rev 0)
+++ trunk/LayoutTests/css3/infinite-word-spacing-expected.txt        2014-10-25 02:37:41 UTC (rev 175197)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+PASS if no assert or crash in debug.
</ins></span></pre></div>
<a id="trunkLayoutTestscss3infinitewordspacinghtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/css3/infinite-word-spacing.html (0 => 175197)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/css3/infinite-word-spacing.html                                (rev 0)
+++ trunk/LayoutTests/css3/infinite-word-spacing.html        2014-10-25 02:37:41 UTC (rev 175197)
</span><span class="lines">@@ -0,0 +1,36 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+  &lt;style&gt;
+    h1 {
+        -webkit-animation-name: spacing;
+        -webkit-animation-duration: 1s;
+    }
+    @-webkit-keyframes spacing {
+      0%  {
+        word-spacing: normal
+      }
+      20%  {
+        word-spacing: 11111111111111111111111111111111111111111111111111%
+      }
+      40%  {
+        word-spacing: 1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111%
+      }
+      60%  {
+        word-spacing: 200%
+      }
+      80%  {
+        word-spacing: 300%
+      }
+      100% { }
+    }
+  &lt;/style&gt;
+&lt;/head&gt;
+&lt;script&gt;
+if (window.testRunner)
+  testRunner.dumpAsText();
+&lt;/script&gt;
+&lt;body&gt;
+&lt;h1&gt;PASS if no assert or crash in debug.&lt;/h1&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (175196 => 175197)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-10-25 02:15:31 UTC (rev 175196)
+++ trunk/Source/WebCore/ChangeLog        2014-10-25 02:37:41 UTC (rev 175197)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2014-10-24  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
+
+        Clamp wordSpacing percentage value.
+        https://bugs.webkit.org/show_bug.cgi?id=129350.
+
+        Reviewed by Zalan Bujtas.
+
+        When the CSS wordSpacing property is percentage, its value has to be within the
+        pre-defined min/max values for the CSS length type. This is done the same way
+        the wordSpacing of type &lt;length&gt; is handled.
+
+        Tests: css3/infinite-word-spacing.html.
+
+        Move the definitions of minValueForCssLength and maxValueForCssLength from the
+        .cpp file to the .h file.
+        * css/CSSPrimitiveValue.cpp:
+        * css/CSSPrimitiveValue.h:
+
+        Clamp the wordSpacing value to minValueForCssLength and maxValueForCssLength when
+        its type is percentage.
+        * css/DeprecatedStyleBuilder.cpp:
+        (WebCore::ApplyPropertyWordSpacing::applyValue):
+
</ins><span class="cx"> 2014-10-24  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Mac] Use modern loops in ResourceRequestCocoa.mm
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSPrimitiveValuecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.cpp (175196 => 175197)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSPrimitiveValue.cpp        2014-10-25 02:15:31 UTC (rev 175196)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.cpp        2014-10-25 02:37:41 UTC (rev 175197)
</span><span class="lines">@@ -33,7 +33,6 @@
</span><span class="cx"> #include &quot;Counter.h&quot;
</span><span class="cx"> #include &quot;ExceptionCode.h&quot;
</span><span class="cx"> #include &quot;Font.h&quot;
</span><del>-#include &quot;LayoutUnit.h&quot;
</del><span class="cx"> #include &quot;Node.h&quot;
</span><span class="cx"> #include &quot;Pair.h&quot;
</span><span class="cx"> #include &quot;RGBColor.h&quot;
</span><span class="lines">@@ -59,11 +58,6 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-// Max/min values for CSS, needs to slightly smaller/larger than the true max/min values to allow for rounding without overflowing.
-// Subtract two (rather than one) to allow for values to be converted to float and back without exceeding the LayoutUnit::max.
-const int maxValueForCssLength = intMaxForLayoutUnit - 2;
-const int minValueForCssLength = intMinForLayoutUnit + 2;
-
</del><span class="cx"> static inline bool isValidCSSUnitTypeForDoubleConversion(CSSPrimitiveValue::UnitTypes unitType)
</span><span class="cx"> {
</span><span class="cx">     switch (unitType) {
</span></span></pre></div>
<a id="trunkSourceWebCorecssCSSPrimitiveValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/CSSPrimitiveValue.h (175196 => 175197)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/CSSPrimitiveValue.h        2014-10-25 02:15:31 UTC (rev 175196)
+++ trunk/Source/WebCore/css/CSSPrimitiveValue.h        2014-10-25 02:37:41 UTC (rev 175197)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #include &quot;CSSValue.h&quot;
</span><span class="cx"> #include &quot;CSSValueKeywords.h&quot;
</span><span class="cx"> #include &quot;Color.h&quot;
</span><ins>+#include &quot;LayoutUnit.h&quot;
</ins><span class="cx"> #include &lt;wtf/Forward.h&gt;
</span><span class="cx"> #include &lt;wtf/MathExtras.h&gt;
</span><span class="cx"> #include &lt;wtf/PassRefPtr.h&gt;
</span><span class="lines">@@ -50,6 +51,11 @@
</span><span class="cx"> struct Length;
</span><span class="cx"> struct LengthSize;
</span><span class="cx"> 
</span><ins>+// Max/min values for CSS, needs to slightly smaller/larger than the true max/min values to allow for rounding without overflowing.
+// Subtract two (rather than one) to allow for values to be converted to float and back without exceeding the LayoutUnit::max.
+const int maxValueForCssLength = intMaxForLayoutUnit - 2;
+const int minValueForCssLength = intMinForLayoutUnit + 2;
+
</ins><span class="cx"> // Dimension calculations are imprecise, often resulting in values of e.g.
</span><span class="cx"> // 44.99998. We need to go ahead and round if we're really close to the next
</span><span class="cx"> // integer value.
</span></span></pre></div>
<a id="trunkSourceWebCorecssDeprecatedStyleBuildercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/css/DeprecatedStyleBuilder.cpp (175196 => 175197)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/css/DeprecatedStyleBuilder.cpp        2014-10-25 02:15:31 UTC (rev 175196)
+++ trunk/Source/WebCore/css/DeprecatedStyleBuilder.cpp        2014-10-25 02:37:41 UTC (rev 175197)
</span><span class="lines">@@ -1496,7 +1496,7 @@
</span><span class="cx">         else if (primitiveValue.isLength()) {
</span><span class="cx">             wordSpacing = primitiveValue.computeLength&lt;Length&gt;(csstoLengthConversionDataWithTextZoomFactor(*styleResolver));
</span><span class="cx">         } else if (primitiveValue.isPercentage())
</span><del>-            wordSpacing = Length(primitiveValue.getDoubleValue(), Percent);
</del><ins>+            wordSpacing = Length(clampTo&lt;float&gt;(primitiveValue.getDoubleValue(), minValueForCssLength, maxValueForCssLength), Percent);
</ins><span class="cx">         else if (primitiveValue.isNumber())
</span><span class="cx">             wordSpacing = Length(primitiveValue.getDoubleValue(), Fixed);
</span><span class="cx">         else
</span></span></pre>
</div>
</div>

</body>
</html>