<!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>[182159] 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/182159">182159</a></dd>
<dt>Author</dt> <dd>yoon@igalia.com</dd>
<dt>Date</dt> <dd>2015-03-30 15:59:58 -0700 (Mon, 30 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[Threaded Compositor] Crash when animation changes frequently.
https://bugs.webkit.org/show_bug.cgi?id=143213

Reviewed by Simon Fraser.

CompositingCoordinator copies CoordinatedGraphicsLayerState when
flushing GraphicsLayer changes, and ThreadedCoordinatedCompositor passes
it to compositing thread.

To ensure thread-safety, we need to provide copy constructor to copy
Animation object in TextureMapperAnimation instead of referencing it.

Since TimingFunction and TransformOperation used by KeyframeValueList are
not ThreadSafeRefCounted, these should be cloned also.

No new tests needed.

* platform/graphics/GraphicsLayer.h:
(WebCore::AnimationValue::AnimationValue):
(WebCore::FloatAnimationValue::FloatAnimationValue):
(WebCore::TransformAnimationValue::TransformAnimationValue):
(WebCore::FilterAnimationValue::FilterAnimationValue):
Adds deep copy constructor.

* platform/graphics/texmap/TextureMapperAnimation.cpp:
(WebCore::TextureMapperAnimation::TextureMapperAnimation):
Because the name of the animation can be AtomicString, we need to create
isolated version of string to ensure thread safty.

* platform/graphics/texmap/TextureMapperAnimation.h:
* platform/graphics/transforms/IdentityTransformOperation.h:
* platform/graphics/transforms/Matrix3DTransformOperation.h:
* platform/graphics/transforms/MatrixTransformOperation.h:
* platform/graphics/transforms/PerspectiveTransformOperation.h:
* platform/graphics/transforms/RotateTransformOperation.h:
* platform/graphics/transforms/ScaleTransformOperation.h:
* platform/graphics/transforms/SkewTransformOperation.h:
* platform/graphics/transforms/TransformOperation.h:
* platform/graphics/transforms/TranslateTransformOperation.h:
Adds TransformOperation::clone() for threadsafety.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicsGraphicsLayerh">trunk/Source/WebCore/platform/graphics/GraphicsLayer.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapTextureMapperAnimationcpp">trunk/Source/WebCore/platform/graphics/texmap/TextureMapperAnimation.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstexmapTextureMapperAnimationh">trunk/Source/WebCore/platform/graphics/texmap/TextureMapperAnimation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsIdentityTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/IdentityTransformOperation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsMatrix3DTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsMatrixTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/MatrixTransformOperation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsPerspectiveTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsRotateTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsScaleTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsSkewTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/SkewTransformOperation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgraphicstransformsTranslateTransformOperationh">trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/ChangeLog        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -1,3 +1,46 @@
</span><ins>+2015-03-30  Gwang Yoon Hwang  &lt;yoon@igalia.com&gt;
+
+        [Threaded Compositor] Crash when animation changes frequently.
+        https://bugs.webkit.org/show_bug.cgi?id=143213
+
+        Reviewed by Simon Fraser.
+
+        CompositingCoordinator copies CoordinatedGraphicsLayerState when
+        flushing GraphicsLayer changes, and ThreadedCoordinatedCompositor passes
+        it to compositing thread.
+
+        To ensure thread-safety, we need to provide copy constructor to copy
+        Animation object in TextureMapperAnimation instead of referencing it.
+
+        Since TimingFunction and TransformOperation used by KeyframeValueList are
+        not ThreadSafeRefCounted, these should be cloned also.
+
+        No new tests needed.
+
+        * platform/graphics/GraphicsLayer.h:
+        (WebCore::AnimationValue::AnimationValue):
+        (WebCore::FloatAnimationValue::FloatAnimationValue):
+        (WebCore::TransformAnimationValue::TransformAnimationValue):
+        (WebCore::FilterAnimationValue::FilterAnimationValue):
+        Adds deep copy constructor.
+
+        * platform/graphics/texmap/TextureMapperAnimation.cpp:
+        (WebCore::TextureMapperAnimation::TextureMapperAnimation):
+        Because the name of the animation can be AtomicString, we need to create
+        isolated version of string to ensure thread safty.
+
+        * platform/graphics/texmap/TextureMapperAnimation.h:
+        * platform/graphics/transforms/IdentityTransformOperation.h:
+        * platform/graphics/transforms/Matrix3DTransformOperation.h:
+        * platform/graphics/transforms/MatrixTransformOperation.h:
+        * platform/graphics/transforms/PerspectiveTransformOperation.h:
+        * platform/graphics/transforms/RotateTransformOperation.h:
+        * platform/graphics/transforms/ScaleTransformOperation.h:
+        * platform/graphics/transforms/SkewTransformOperation.h:
+        * platform/graphics/transforms/TransformOperation.h:
+        * platform/graphics/transforms/TranslateTransformOperation.h:
+        Adds TransformOperation::clone() for threadsafety.
+
</ins><span class="cx"> 2015-03-30  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Cached &quot;Expires&quot; header is not updated upon successful resource revalidation
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicsGraphicsLayerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/GraphicsLayer.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/GraphicsLayer.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/GraphicsLayer.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -75,6 +75,12 @@
</span><span class="cx">     {
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    AnimationValue(const AnimationValue&amp; other)
+        : m_keyTime(other.m_keyTime)
+        , m_timingFunction(other.m_timingFunction ? other.m_timingFunction-&gt;clone() : nullptr)
+    {
+    }
+
</ins><span class="cx"> private:
</span><span class="cx">     double m_keyTime;
</span><span class="cx">     RefPtr&lt;TimingFunction&gt; m_timingFunction;
</span><span class="lines">@@ -95,6 +101,12 @@
</span><span class="cx">         return std::make_unique&lt;FloatAnimationValue&gt;(*this);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    FloatAnimationValue(const FloatAnimationValue&amp; other)
+        : AnimationValue(other)
+        , m_value(other.m_value)
+    {
+    }
+
</ins><span class="cx">     float value() const { return m_value; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -116,6 +128,13 @@
</span><span class="cx">         return std::make_unique&lt;TransformAnimationValue&gt;(*this);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    TransformAnimationValue(const TransformAnimationValue&amp; other)
+        : AnimationValue(other)
+    {
+        for (size_t i = 0; i &lt; other.m_value.operations().size(); ++i)
+            m_value.operations().append(other.m_value.operations()[i]-&gt;clone());
+    }
+
</ins><span class="cx">     const TransformOperations&amp; value() const { return m_value; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -137,6 +156,13 @@
</span><span class="cx">         return std::make_unique&lt;FilterAnimationValue&gt;(*this);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    FilterAnimationValue(const FilterAnimationValue&amp; other)
+        : AnimationValue(other)
+    {
+        for (size_t i = 0; i &lt; other.m_value.operations().size(); ++i)
+            m_value.operations().append(other.m_value.operations()[i]-&gt;clone());
+    }
+
</ins><span class="cx">     const FilterOperations&amp; value() const { return m_value; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapTextureMapperAnimationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/TextureMapperAnimation.cpp (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/TextureMapperAnimation.cpp        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/texmap/TextureMapperAnimation.cpp        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -213,7 +213,7 @@
</span><span class="cx">     : m_keyframes(keyframes)
</span><span class="cx">     , m_boxSize(boxSize)
</span><span class="cx">     , m_animation(Animation::create(*animation))
</span><del>-    , m_name(name)
</del><ins>+    , m_name(name.isSafeToSendToAnotherThread() ? name : name.isolatedCopy())
</ins><span class="cx">     , m_listsMatch(listsMatch)
</span><span class="cx">     , m_startTime(startTime)
</span><span class="cx">     , m_pauseTime(0)
</span><span class="lines">@@ -223,6 +223,20 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+TextureMapperAnimation::TextureMapperAnimation(const TextureMapperAnimation&amp; other)
+    : m_keyframes(other.keyframes())
+    , m_boxSize(other.boxSize())
+    , m_animation(Animation::create(*other.animation()))
+    , m_name(other.name().isSafeToSendToAnotherThread() ? other.name() : other.name().isolatedCopy())
+    , m_listsMatch(other.listsMatch())
+    , m_startTime(other.startTime())
+    , m_pauseTime(other.pauseTime())
+    , m_totalRunningTime(other.m_totalRunningTime)
+    , m_lastRefreshedTime(other.m_lastRefreshedTime)
+    , m_state(other.state())
+{
+}
+
</ins><span class="cx"> void TextureMapperAnimation::applyInternal(Client* client, const AnimationValue&amp; from, const AnimationValue&amp; to, float progress)
</span><span class="cx"> {
</span><span class="cx">     switch (m_keyframes.property()) {
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstexmapTextureMapperAnimationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/texmap/TextureMapperAnimation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/texmap/TextureMapperAnimation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/texmap/TextureMapperAnimation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -41,6 +41,7 @@
</span><span class="cx">         : m_keyframes(AnimatedPropertyInvalid)
</span><span class="cx">     { }
</span><span class="cx">     TextureMapperAnimation(const String&amp;, const KeyframeValueList&amp;, const FloatSize&amp;, const Animation*, double, bool);
</span><ins>+    TextureMapperAnimation(const TextureMapperAnimation&amp;);
</ins><span class="cx">     void apply(Client*);
</span><span class="cx">     void pause(double);
</span><span class="cx">     void resume();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsIdentityTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/IdentityTransformOperation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/IdentityTransformOperation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/transforms/IdentityTransformOperation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -35,7 +35,12 @@
</span><span class="cx">     {
</span><span class="cx">         return adoptRef(new IdentityTransformOperation());
</span><span class="cx">     }
</span><del>-        
</del><ins>+
+    virtual PassRefPtr&lt;TransformOperation&gt; clone() const override
+    {
+        return create();
+    }
+
</ins><span class="cx"> private:
</span><span class="cx">     virtual bool isIdentity() const override { return true; }
</span><span class="cx">     virtual OperationType type() const override { return IDENTITY; }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsMatrix3DTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/transforms/Matrix3DTransformOperation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -37,6 +37,11 @@
</span><span class="cx">         return adoptRef(new Matrix3DTransformOperation(matrix));
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    virtual PassRefPtr&lt;TransformOperation&gt; clone() const override
+    {
+        return adoptRef(new Matrix3DTransformOperation(m_matrix));
+    }
+
</ins><span class="cx">     TransformationMatrix matrix() const {return m_matrix; }
</span><span class="cx"> 
</span><span class="cx"> private:    
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsMatrixTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/MatrixTransformOperation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/MatrixTransformOperation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/transforms/MatrixTransformOperation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -42,6 +42,11 @@
</span><span class="cx">         return adoptRef(new MatrixTransformOperation(t));
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    virtual PassRefPtr&lt;TransformOperation&gt; clone() const override
+    {
+        return adoptRef(new MatrixTransformOperation(matrix()));
+    }
+
</ins><span class="cx">     TransformationMatrix matrix() const { return TransformationMatrix(m_a, m_b, m_c, m_d, m_e, m_f); }
</span><span class="cx"> 
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsPerspectiveTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/transforms/PerspectiveTransformOperation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -39,6 +39,11 @@
</span><span class="cx">         return adoptRef(new PerspectiveTransformOperation(p));
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    virtual PassRefPtr&lt;TransformOperation&gt; clone() const override
+    {
+        return adoptRef(new PerspectiveTransformOperation(m_p));
+    }
+
</ins><span class="cx">     Length perspective() const { return m_p; }
</span><span class="cx">     
</span><span class="cx"> private:
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsRotateTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/transforms/RotateTransformOperation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -41,6 +41,11 @@
</span><span class="cx">         return adoptRef(new RotateTransformOperation(x, y, z, angle, type));
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    virtual PassRefPtr&lt;TransformOperation&gt; clone() const override
+    {
+        return adoptRef(new RotateTransformOperation(m_x, m_y, m_z, m_angle, m_type));
+    }
+
</ins><span class="cx">     double x() const { return m_x; }
</span><span class="cx">     double y() const { return m_y; }
</span><span class="cx">     double z() const { return m_z; }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsScaleTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/transforms/ScaleTransformOperation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -41,6 +41,11 @@
</span><span class="cx">         return adoptRef(new ScaleTransformOperation(sx, sy, sz, type));
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    virtual PassRefPtr&lt;TransformOperation&gt; clone() const override
+    {
+        return adoptRef(new ScaleTransformOperation(m_x, m_y, m_z, m_type));
+    }
+
</ins><span class="cx">     double x() const { return m_x; }
</span><span class="cx">     double y() const { return m_y; }
</span><span class="cx">     double z() const { return m_z; }
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsSkewTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/SkewTransformOperation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/SkewTransformOperation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/transforms/SkewTransformOperation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -36,6 +36,11 @@
</span><span class="cx">         return adoptRef(new SkewTransformOperation(angleX, angleY, type));
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    virtual PassRefPtr&lt;TransformOperation&gt; clone() const override
+    {
+        return adoptRef(new SkewTransformOperation(m_angleX, m_angleY, m_type));
+    }
+
</ins><span class="cx">     double angleX() const { return m_angleX; }
</span><span class="cx">     double angleY() const { return m_angleY; }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/transforms/TransformOperation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -54,6 +54,8 @@
</span><span class="cx"> 
</span><span class="cx">     virtual ~TransformOperation() { }
</span><span class="cx"> 
</span><ins>+    virtual PassRefPtr&lt;TransformOperation&gt; clone() const = 0;
+
</ins><span class="cx">     virtual bool operator==(const TransformOperation&amp;) const = 0;
</span><span class="cx">     bool operator!=(const TransformOperation&amp; o) const { return !(*this == o); }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgraphicstransformsTranslateTransformOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.h (182158 => 182159)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.h        2015-03-30 22:58:22 UTC (rev 182158)
+++ trunk/Source/WebCore/platform/graphics/transforms/TranslateTransformOperation.h        2015-03-30 22:59:58 UTC (rev 182159)
</span><span class="lines">@@ -43,6 +43,11 @@
</span><span class="cx">         return adoptRef(new TranslateTransformOperation(tx, ty, tz, type));
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    virtual PassRefPtr&lt;TransformOperation&gt; clone() const override
+    {
+        return adoptRef(new TranslateTransformOperation(m_x, m_y, m_z, m_type));
+    }
+
</ins><span class="cx">     double x(const FloatSize&amp; borderBoxSize) const { return floatValueForLength(m_x, borderBoxSize.width()); }
</span><span class="cx">     double y(const FloatSize&amp; borderBoxSize) const { return floatValueForLength(m_y, borderBoxSize.height()); }
</span><span class="cx">     double z(const FloatSize&amp;) const { return floatValueForLength(m_z, 1); }
</span></span></pre>
</div>
</div>

</body>
</html>