<!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>[243336] 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/243336">243336</a></dd>
<dt>Author</dt> <dd>said@apple.com</dd>
<dt>Date</dt> <dd>2019-03-21 15:21:58 -0700 (Thu, 21 Mar 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>Remove the SVG tear off objects for SVGPoint, SVGPointList and SVGAnimatedPointList
https://bugs.webkit.org/show_bug.cgi?id=195905

Source/WebCore:

Patch by Said Abou-Hallawa <said@apple.com> on 2019-03-21
Reviewed by Simon Fraser.

To remove the SVG tear off objects for SVGPoint, SVGPointList and 
SVGAnimatedPointList, these changes are needed:

-- Define SVGPoint to be a superclass of SVGValueProperty<FloatPoint>.

-- Define SVGAnimatedPointList to be a superclass of SVGAnimatedPropertyList<SVGPointList>

-- Add SVGPropertyList which is a superclass of SVGList. Its items are
   defined to RefCounted. It is the base class of SVGValuePropertyList
   and it will be  the base class of SVGPathSegList in a later patch.

-- Add SVGValuePropertyList which is the base class of all the lists whose
   items are backed by a value objects like SVGPoint. The difference between
   SVGPropertyList and SVGValuePropertyList is the former class can store
   a Ref pointer of the base class like SVGPathSeg while the later type
   has to store the same type for all the items.

-- Add SVGAnimatedPropertyList which is the base class for all the animated
   lists. Note that:
   1) SVGElement owns SVGAnimatedPropertyList
   2) SVGAnimatedPropertyList owns m_baseVal whose type is SVGList
   3) m_baseVal owns the items whose type is a superclass of SVGProperty.
   When changing an item, it calls its owner which is an SVGList.
   SVGList calls its owner which is SVGAnimatedPropertyList.
   SVGAnimatedPropertyList calls its owner which SVGElement to commit
   the change. Later SVGAnimatedPropertyList::synchronize() is called 
   which returns the property valueAsString() to update the reflecting
   attribute.

-- New accessor, animator and animation function are added to access
   and animate a member of type SVGAnimatedPropertyList.

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* rendering/svg/SVGPathData.cpp:
(WebCore::pathFromCircleElement):
(WebCore::pathFromEllipseElement):
(WebCore::pathFromLineElement):
(WebCore::pathFromPathElement):
(WebCore::pathFromPolygonElement):
(WebCore::pathFromPolylineElement):
(WebCore::pathFromRectElement):
(WebCore::pathFromGraphicsElement):
* rendering/svg/SVGPathData.h:
The IDL of SVGPolyElement interface requires the following attribute:
    readonly attribute SVGPointList points;
For which we return:
    SVGPointList& points() { return m_points->baseVal(); }
But for all the other properties we return the currentValue(). So to have
the two functions with the same name, the following function is added:
    const SVGPointList& points() const { return m_points->currentValue(); }
This definition requires changing all callers to be const.

* rendering/svg/SVGRenderTreeAsText.cpp:
(WebCore::operator<<):
* svg/SVGAnimatedPointList.cpp: Removed.
* svg/SVGAnimatedPointList.h: Removed.
* svg/SVGAnimatedType.h:
(WebCore::SVGAnimatedType::type const):
This function had a bad design. It was designed to use the index of the
variant as the AnimatedPropertyType. But when some of the types are removed
from SVGValueVariant, this broke things. This fix is temporary till the 
class SVGValueVariant is removed.

* svg/SVGAnimatorFactory.h:
(WebCore::SVGAnimatorFactory::create):
* svg/SVGExternalResourcesRequired.cpp:
* svg/SVGParserUtilities.cpp:
(WebCore::pointsListFromSVGData): Deleted.
* svg/SVGParserUtilities.h:
* svg/SVGPoint.h:
(WebCore::SVGPoint::create):
(WebCore::SVGPoint::clone const):
(WebCore::SVGPoint::x):
(WebCore::SVGPoint::setX):
(WebCore::SVGPoint::y):
(WebCore::SVGPoint::setY):
(WebCore::SVGPoint::matrixTransform const):
(WebCore::SVGPoint::matrixTransform): Deleted.
(WebCore::SVGPoint::SVGPoint): Deleted.
* svg/SVGPoint.idl:
matrixTransform() should not throw an exception.

* svg/SVGPointList.h:
(WebCore::SVGPointList::create):
(WebCore::SVGPointList::parse):
(WebCore::SVGPointList::SVGPointList): Deleted.
Move the parse() and valueAsString() methods to SVGPointList. It is now
a superclass of SVGValuePropertyList. Its items are of type Ref<SVGPoint>.

* svg/SVGPointListValues.cpp: Removed.
* svg/SVGPointListValues.h: Removed.
* svg/SVGPolyElement.cpp:
(WebCore::SVGPolyElement::SVGPolyElement):
(WebCore::SVGPolyElement::parseAttribute):
(WebCore::SVGPolyElement::approximateMemoryCost const):
(WebCore::SVGPolyElement::registerAttributes): Deleted.
(WebCore::SVGPolyElement::points): Deleted.
(WebCore::SVGPolyElement::animatedPoints): Deleted.
* svg/SVGPolyElement.h:
(WebCore::SVGPolyElement::points const):
(WebCore::SVGPolyElement::points):
(WebCore::SVGPolyElement::animatedPoints):
(WebCore::SVGPolyElement::pointList const): Deleted.
(WebCore::SVGPolyElement::attributeRegistry): Deleted.
* svg/SVGSVGElement.cpp:
(WebCore::SVGSVGElement::setCurrentTranslate):
(WebCore::SVGSVGElement::currentTranslate): Deleted.
* svg/SVGSVGElement.h:
* svg/SVGSVGElement.idl:
Define currentTranslate property to be of type Ref<SVGPoint>. When requesting
it just return a reference to it.

* svg/SVGValue.h:
* svg/properties/SVGAnimatedPropertyAccessorImpl.h:
* svg/properties/SVGAnimatedPropertyAnimatorImpl.h:
* svg/properties/SVGAnimatedPropertyImpl.h:
* svg/properties/SVGAnimatedPropertyList.h: Added.
Define the accessor, the animator and the animated type of SVGPointList.

(WebCore::SVGAnimatedPropertyList::create):
(WebCore::SVGAnimatedPropertyList::~SVGAnimatedPropertyList):
(WebCore::SVGAnimatedPropertyList::baseVal const):
(WebCore::SVGAnimatedPropertyList::baseVal):
(WebCore::SVGAnimatedPropertyList::animVal const):
(WebCore::SVGAnimatedPropertyList::animVal):
(WebCore::SVGAnimatedPropertyList::currentValue const):
(WebCore::SVGAnimatedPropertyList::SVGAnimatedPropertyList):
(WebCore::SVGAnimatedPropertyList::ensureAnimVal):
* svg/properties/SVGAnimationAdditiveListFunction.h: Added.
(WebCore::SVGAnimationAdditiveListFunction::SVGAnimationAdditiveListFunction):
(WebCore::SVGAnimationAdditiveListFunction::toAtEndOfDuration const):
(WebCore::SVGAnimationAdditiveListFunction::adjustAnimatedList):
* svg/properties/SVGAnimationAdditiveListFunctionImpl.h: Added.
(WebCore::SVGAnimationPointListFunction::progress):
Define the animation function for animating SVGPointList.

* svg/properties/SVGAttributeRegistry.h:
* svg/properties/SVGPropertyList.h: Added.
(WebCore::SVGPropertyList::SVGPropertyList):
(WebCore::SVGPropertyList::~SVGPropertyList):
* svg/properties/SVGPropertyOwnerRegistry.h:
(WebCore::SVGPropertyOwnerRegistry::registerProperty):
* svg/properties/SVGValuePropertyList.h: Added.
(WebCore::SVGValuePropertyList::operator=):
(WebCore::SVGValuePropertyList::operator Vector<typename PropertyType::ValueType> const):
(WebCore::SVGValuePropertyList::resize):
(WebCore::SVGValuePropertyList::SVGValuePropertyList):

LayoutTests:

Reviewed by Simon Fraser.

* svg/dom/SVGPointList-basics-expected.txt:
* svg/dom/SVGPointList-basics.xhtml:
This change is required because SVGPointList will be following the SVG2
specs regarding adding new items to the list. 

See https://www.w3.org/TR/SVG/types.html#TermListInterface.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGPointListbasicsexpectedtxt">trunk/LayoutTests/svg/dom/SVGPointList-basics-expected.txt</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGPointListbasicsxhtml">trunk/LayoutTests/svg/dom/SVGPointList-basics.xhtml</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreSourcestxt">trunk/Source/WebCore/Sources.txt</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgSVGPathDatacpp">trunk/Source/WebCore/rendering/svg/SVGPathData.cpp</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgSVGPathDatah">trunk/Source/WebCore/rendering/svg/SVGPathData.h</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgSVGRenderTreeAsTextcpp">trunk/Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedTypeh">trunk/Source/WebCore/svg/SVGAnimatedType.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatorFactoryh">trunk/Source/WebCore/svg/SVGAnimatorFactory.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGParserUtilitiescpp">trunk/Source/WebCore/svg/SVGParserUtilities.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGParserUtilitiesh">trunk/Source/WebCore/svg/SVGParserUtilities.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPointh">trunk/Source/WebCore/svg/SVGPoint.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPointidl">trunk/Source/WebCore/svg/SVGPoint.idl</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPointListh">trunk/Source/WebCore/svg/SVGPointList.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPolyElementcpp">trunk/Source/WebCore/svg/SVGPolyElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPolyElementh">trunk/Source/WebCore/svg/SVGPolyElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGSVGElementcpp">trunk/Source/WebCore/svg/SVGSVGElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGSVGElementh">trunk/Source/WebCore/svg/SVGSVGElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGSVGElementidl">trunk/Source/WebCore/svg/SVGSVGElement.idl</a></li>
<li><a href="#trunkSourceWebCoresvgSVGValueh">trunk/Source/WebCore/svg/SVGValue.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAccessorImplh">trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAnimatorImplh">trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyImplh">trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAttributeRegistryh">trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGPropertyOwnerRegistryh">trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyListh">trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyList.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveListFunctionh">trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunction.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveListFunctionImplh">trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunctionImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGPropertyListh">trunk/Source/WebCore/svg/properties/SVGPropertyList.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGValuePropertyListh">trunk/Source/WebCore/svg/properties/SVGValuePropertyList.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedPointListcpp">trunk/Source/WebCore/svg/SVGAnimatedPointList.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedPointListh">trunk/Source/WebCore/svg/SVGAnimatedPointList.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPointListValuescpp">trunk/Source/WebCore/svg/SVGPointListValues.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPointListValuesh">trunk/Source/WebCore/svg/SVGPointListValues.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/LayoutTests/ChangeLog 2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2019-03-21  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
+        Remove the SVG tear off objects for SVGPoint, SVGPointList and SVGAnimatedPointList
+        https://bugs.webkit.org/show_bug.cgi?id=195905
+
+        Reviewed by Simon Fraser.
+
+        * svg/dom/SVGPointList-basics-expected.txt:
+        * svg/dom/SVGPointList-basics.xhtml:
+        This change is required because SVGPointList will be following the SVG2
+        specs regarding adding new items to the list. 
+
+        See https://www.w3.org/TR/SVG/types.html#TermListInterface.
+
</ins><span class="cx"> 2019-03-21  Zalan Bujtas  <zalan@apple.com>
</span><span class="cx"> 
</span><span class="cx">         Do not insert the first-letter anonymous container until after we've constructed the first-letter renderer.
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGPointListbasicsexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGPointList-basics-expected.txt (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGPointList-basics-expected.txt       2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/LayoutTests/svg/dom/SVGPointList-basics-expected.txt  2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx"> PASS poly1.points.insertItemBefore(poly1) threw exception TypeError: Not enough arguments.
</span><span class="cx"> PASS poly1.points.insertItemBefore(null) threw exception TypeError: Not enough arguments.
</span><span class="cx"> PASS dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), 'aString')) is "x=100 y=0"
</span><ins>+PASS dumpPoint(poly1.points.removeItem(2, 'aString')) is "x=100 y=0"
</ins><span class="cx"> PASS poly1.points.numberOfItems is 4
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(0)) is "x=100 y=0"
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(1)) is "x=0 y=0"
</span><span class="lines">@@ -52,6 +53,7 @@
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(3)) is "x=0 y=100"
</span><span class="cx"> PASS poly1.getAttribute('points').formatPointsAttribute() is "100 0 0 0 100 100 0 100"
</span><span class="cx"> PASS dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), poly1)) is "x=0 y=0"
</span><ins>+PASS dumpPoint(poly1.points.removeItem(2, 'aString')) is "x=0 y=0"
</ins><span class="cx"> PASS poly1.points.numberOfItems is 4
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(0)) is "x=0 y=0"
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(1)) is "x=100 y=0"
</span><span class="lines">@@ -59,6 +61,7 @@
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(3)) is "x=0 y=100"
</span><span class="cx"> PASS poly1.getAttribute('points').formatPointsAttribute() is "0 0 100 0 100 100 0 100"
</span><span class="cx"> PASS dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), null)) is "x=100 y=0"
</span><ins>+PASS dumpPoint(poly1.points.removeItem(2, 'aString')) is "x=100 y=0"
</ins><span class="cx"> PASS poly1.points.numberOfItems is 4
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(0)) is "x=100 y=0"
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(1)) is "x=0 y=0"
</span><span class="lines">@@ -65,6 +68,7 @@
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(2)) is "x=100 y=100"
</span><span class="cx"> PASS poly1.getAttribute('points').formatPointsAttribute() is "100 0 0 0 100 100 0 100"
</span><span class="cx"> PASS dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), 0)) is "x=0 y=0"
</span><ins>+PASS dumpPoint(poly1.points.removeItem(2, 'aString')) is "x=0 y=0"
</ins><span class="cx"> PASS poly1.points.numberOfItems is 4
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(0)) is "x=0 y=0"
</span><span class="cx"> PASS dumpPoint(poly1.points.getItem(1)) is "x=100 y=0"
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGPointListbasicsxhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGPointList-basics.xhtml (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGPointList-basics.xhtml      2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/LayoutTests/svg/dom/SVGPointList-basics.xhtml 2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -77,6 +77,7 @@
</span><span class="cx">     shouldThrow("poly1.points.insertItemBefore(null)");
</span><span class="cx"> 
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), 'aString'))", "x=100 y=0");
</span><ins>+    shouldBeEqualToString("dumpPoint(poly1.points.removeItem(2, 'aString'))", "x=100 y=0");
</ins><span class="cx">     shouldBe("poly1.points.numberOfItems", "4");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=100 y=0");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=0 y=0");
</span><span class="lines">@@ -83,8 +84,9 @@
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=100 y=100");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(3))", "x=0 y=100");
</span><span class="cx">     shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "100 0 0 0 100 100 0 100");
</span><del>-    
</del><ins>+
</ins><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), poly1))", "x=0 y=0");
</span><ins>+    shouldBeEqualToString("dumpPoint(poly1.points.removeItem(2, 'aString'))", "x=0 y=0");
</ins><span class="cx">     shouldBe("poly1.points.numberOfItems", "4");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
</span><span class="lines">@@ -93,13 +95,15 @@
</span><span class="cx">     shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "0 0 100 0 100 100 0 100");
</span><span class="cx"> 
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), null))", "x=100 y=0");
</span><ins>+    shouldBeEqualToString("dumpPoint(poly1.points.removeItem(2, 'aString'))", "x=100 y=0");
</ins><span class="cx">     shouldBe("poly1.points.numberOfItems", "4");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=100 y=0");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=0 y=0");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(2))", "x=100 y=100");
</span><span class="cx">     shouldBeEqualToString("poly1.getAttribute('points').formatPointsAttribute()", "100 0 0 0 100 100 0 100");
</span><del>-    
</del><ins>+
</ins><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.insertItemBefore(poly1.points.getItem(1), 0))", "x=0 y=0");
</span><ins>+    shouldBeEqualToString("dumpPoint(poly1.points.removeItem(2, 'aString'))", "x=0 y=0");
</ins><span class="cx">     shouldBe("poly1.points.numberOfItems", "4");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(0))", "x=0 y=0");
</span><span class="cx">     shouldBeEqualToString("dumpPoint(poly1.points.getItem(1))", "x=100 y=0");
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/ChangeLog      2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,5 +1,161 @@
</span><span class="cx"> 2019-03-21  Said Abou-Hallawa  <said@apple.com>
</span><span class="cx"> 
</span><ins>+        Remove the SVG tear off objects for SVGPoint, SVGPointList and SVGAnimatedPointList
+        https://bugs.webkit.org/show_bug.cgi?id=195905
+
+        Reviewed by Simon Fraser.
+
+        To remove the SVG tear off objects for SVGPoint, SVGPointList and 
+        SVGAnimatedPointList, these changes are needed:
+
+        -- Define SVGPoint to be a superclass of SVGValueProperty<FloatPoint>.
+
+        -- Define SVGAnimatedPointList to be a superclass of SVGAnimatedPropertyList<SVGPointList>
+
+        -- Add SVGPropertyList which is a superclass of SVGList. Its items are
+           defined to RefCounted. It is the base class of SVGValuePropertyList
+           and it will be  the base class of SVGPathSegList in a later patch.
+
+        -- Add SVGValuePropertyList which is the base class of all the lists whose
+           items are backed by a value objects like SVGPoint. The difference between
+           SVGPropertyList and SVGValuePropertyList is the former class can store
+           a Ref pointer of the base class like SVGPathSeg while the later type
+           has to store the same type for all the items.
+
+        -- Add SVGAnimatedPropertyList which is the base class for all the animated
+           lists. Note that:
+           1) SVGElement owns SVGAnimatedPropertyList
+           2) SVGAnimatedPropertyList owns m_baseVal whose type is SVGList
+           3) m_baseVal owns the items whose type is a superclass of SVGProperty.
+           When changing an item, it calls its owner which is an SVGList.
+           SVGList calls its owner which is SVGAnimatedPropertyList.
+           SVGAnimatedPropertyList calls its owner which SVGElement to commit
+           the change. Later SVGAnimatedPropertyList::synchronize() is called 
+           which returns the property valueAsString() to update the reflecting
+           attribute.
+
+        -- New accessor, animator and animation function are added to access
+           and animate a member of type SVGAnimatedPropertyList.
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * rendering/svg/SVGPathData.cpp:
+        (WebCore::pathFromCircleElement):
+        (WebCore::pathFromEllipseElement):
+        (WebCore::pathFromLineElement):
+        (WebCore::pathFromPathElement):
+        (WebCore::pathFromPolygonElement):
+        (WebCore::pathFromPolylineElement):
+        (WebCore::pathFromRectElement):
+        (WebCore::pathFromGraphicsElement):
+        * rendering/svg/SVGPathData.h:
+        The IDL of SVGPolyElement interface requires the following attribute:
+            readonly attribute SVGPointList points;
+        For which we return:
+            SVGPointList& points() { return m_points->baseVal(); }
+        But for all the other properties we return the currentValue(). So to have
+        the two functions with the same name, the following function is added:
+            const SVGPointList& points() const { return m_points->currentValue(); }
+        This definition requires changing all callers to be const.
+
+        * rendering/svg/SVGRenderTreeAsText.cpp:
+        (WebCore::operator<<):
+        * svg/SVGAnimatedPointList.cpp: Removed.
+        * svg/SVGAnimatedPointList.h: Removed.
+        * svg/SVGAnimatedType.h:
+        (WebCore::SVGAnimatedType::type const):
+        This function had a bad design. It was designed to use the index of the
+        variant as the AnimatedPropertyType. But when some of the types are removed
+        from SVGValueVariant, this broke things. This fix is temporary till the 
+        class SVGValueVariant is removed.
+
+        * svg/SVGAnimatorFactory.h:
+        (WebCore::SVGAnimatorFactory::create):
+        * svg/SVGExternalResourcesRequired.cpp:
+        * svg/SVGParserUtilities.cpp:
+        (WebCore::pointsListFromSVGData): Deleted.
+        * svg/SVGParserUtilities.h:
+        * svg/SVGPoint.h:
+        (WebCore::SVGPoint::create):
+        (WebCore::SVGPoint::clone const):
+        (WebCore::SVGPoint::x):
+        (WebCore::SVGPoint::setX):
+        (WebCore::SVGPoint::y):
+        (WebCore::SVGPoint::setY):
+        (WebCore::SVGPoint::matrixTransform const):
+        (WebCore::SVGPoint::matrixTransform): Deleted.
+        (WebCore::SVGPoint::SVGPoint): Deleted.
+        * svg/SVGPoint.idl:
+        matrixTransform() should not throw an exception.
+
+        * svg/SVGPointList.h:
+        (WebCore::SVGPointList::create):
+        (WebCore::SVGPointList::parse):
+        (WebCore::SVGPointList::SVGPointList): Deleted.
+        Move the parse() and valueAsString() methods to SVGPointList. It is now
+        a superclass of SVGValuePropertyList. Its items are of type Ref<SVGPoint>.
+
+        * svg/SVGPointListValues.cpp: Removed.
+        * svg/SVGPointListValues.h: Removed.
+        * svg/SVGPolyElement.cpp:
+        (WebCore::SVGPolyElement::SVGPolyElement):
+        (WebCore::SVGPolyElement::parseAttribute):
+        (WebCore::SVGPolyElement::approximateMemoryCost const):
+        (WebCore::SVGPolyElement::registerAttributes): Deleted.
+        (WebCore::SVGPolyElement::points): Deleted.
+        (WebCore::SVGPolyElement::animatedPoints): Deleted.
+        * svg/SVGPolyElement.h:
+        (WebCore::SVGPolyElement::points const):
+        (WebCore::SVGPolyElement::points):
+        (WebCore::SVGPolyElement::animatedPoints):
+        (WebCore::SVGPolyElement::pointList const): Deleted.
+        (WebCore::SVGPolyElement::attributeRegistry): Deleted.
+        * svg/SVGSVGElement.cpp:
+        (WebCore::SVGSVGElement::setCurrentTranslate):
+        (WebCore::SVGSVGElement::currentTranslate): Deleted.
+        * svg/SVGSVGElement.h:
+        * svg/SVGSVGElement.idl:
+        Define currentTranslate property to be of type Ref<SVGPoint>. When requesting
+        it just return a reference to it.
+
+        * svg/SVGValue.h:
+        * svg/properties/SVGAnimatedPropertyAccessorImpl.h:
+        * svg/properties/SVGAnimatedPropertyAnimatorImpl.h:
+        * svg/properties/SVGAnimatedPropertyImpl.h:
+        * svg/properties/SVGAnimatedPropertyList.h: Added.
+        Define the accessor, the animator and the animated type of SVGPointList.
+
+        (WebCore::SVGAnimatedPropertyList::create):
+        (WebCore::SVGAnimatedPropertyList::~SVGAnimatedPropertyList):
+        (WebCore::SVGAnimatedPropertyList::baseVal const):
+        (WebCore::SVGAnimatedPropertyList::baseVal):
+        (WebCore::SVGAnimatedPropertyList::animVal const):
+        (WebCore::SVGAnimatedPropertyList::animVal):
+        (WebCore::SVGAnimatedPropertyList::currentValue const):
+        (WebCore::SVGAnimatedPropertyList::SVGAnimatedPropertyList):
+        (WebCore::SVGAnimatedPropertyList::ensureAnimVal):
+        * svg/properties/SVGAnimationAdditiveListFunction.h: Added.
+        (WebCore::SVGAnimationAdditiveListFunction::SVGAnimationAdditiveListFunction):
+        (WebCore::SVGAnimationAdditiveListFunction::toAtEndOfDuration const):
+        (WebCore::SVGAnimationAdditiveListFunction::adjustAnimatedList):
+        * svg/properties/SVGAnimationAdditiveListFunctionImpl.h: Added.
+        (WebCore::SVGAnimationPointListFunction::progress):
+        Define the animation function for animating SVGPointList.
+
+        * svg/properties/SVGAttributeRegistry.h:
+        * svg/properties/SVGPropertyList.h: Added.
+        (WebCore::SVGPropertyList::SVGPropertyList):
+        (WebCore::SVGPropertyList::~SVGPropertyList):
+        * svg/properties/SVGPropertyOwnerRegistry.h:
+        (WebCore::SVGPropertyOwnerRegistry::registerProperty):
+        * svg/properties/SVGValuePropertyList.h: Added.
+        (WebCore::SVGValuePropertyList::operator=):
+        (WebCore::SVGValuePropertyList::operator Vector<typename PropertyType::ValueType> const):
+        (WebCore::SVGValuePropertyList::resize):
+        (WebCore::SVGValuePropertyList::SVGValuePropertyList):
+
+2019-03-21  Said Abou-Hallawa  <said@apple.com>
+
</ins><span class="cx">         Remove the SVG property tear off objects for SVGAnimatedString
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=196065
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreSourcestxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Sources.txt (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Sources.txt 2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/Sources.txt    2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -2275,7 +2275,6 @@
</span><span class="cx"> svg/SVGAnimatedLengthList.cpp
</span><span class="cx"> svg/SVGAnimatedNumberList.cpp
</span><span class="cx"> svg/SVGAnimatedPath.cpp
</span><del>-svg/SVGAnimatedPointList.cpp
</del><span class="cx"> svg/SVGAnimatedTransformList.cpp
</span><span class="cx"> svg/SVGAnimatedTypeAnimator.cpp
</span><span class="cx"> svg/SVGAnimationElement.cpp
</span><span class="lines">@@ -2367,7 +2366,6 @@
</span><span class="cx"> svg/SVGPathTraversalStateBuilder.cpp
</span><span class="cx"> svg/SVGPathUtilities.cpp
</span><span class="cx"> svg/SVGPatternElement.cpp
</span><del>-svg/SVGPointListValues.cpp
</del><span class="cx"> svg/SVGPolyElement.cpp
</span><span class="cx"> svg/SVGPolygonElement.cpp
</span><span class="cx"> svg/SVGPolylineElement.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj   2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj      2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1221,7 +1221,6 @@
</span><span class="cx">          439D334413A6911C00C20F4F /* SVGAnimatedTypeAnimator.h in Headers */ = {isa = PBXBuildFile; fileRef = 439D334113A6911C00C20F4F /* SVGAnimatedTypeAnimator.h */; };
</span><span class="cx">          439D334513A6911C00C20F4F /* SVGAnimatorFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = 439D334213A6911C00C20F4F /* SVGAnimatorFactory.h */; };
</span><span class="cx">          43B85ED418CBEC5200E31AF4 /* SelectorPseudoClassAndCompatibilityElementMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 43B85ED218CBEC5200E31AF4 /* SelectorPseudoClassAndCompatibilityElementMap.cpp */; };
</span><del>-               43B9336913B261B1004584BF /* SVGAnimatedPointList.h in Headers */ = {isa = PBXBuildFile; fileRef = 43B9336713B261B1004584BF /* SVGAnimatedPointList.h */; };
</del><span class="cx">           43C092BC12D9E4EE00A989C3 /* RenderSVGForeignObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 43C092BA12D9E4EE00A989C3 /* RenderSVGForeignObject.h */; };
</span><span class="cx">          43EDD67F1B485DBF00640E75 /* CombinedFiltersAlphabet.h in Headers */ = {isa = PBXBuildFile; fileRef = 43EDD67D1B485DBF00640E75 /* CombinedFiltersAlphabet.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          4415292E0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4415292C0E1AE8A000C4A2D0 /* HTMLPlugInImageElement.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -7667,8 +7666,6 @@
</span><span class="cx">          43B85ED218CBEC5200E31AF4 /* SelectorPseudoClassAndCompatibilityElementMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SelectorPseudoClassAndCompatibilityElementMap.cpp; path = DerivedSources/WebCore/SelectorPseudoClassAndCompatibilityElementMap.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
</span><span class="cx">          43B85ED318CBEC5200E31AF4 /* SelectorPseudoClassAndCompatibilityElementMap.gperf */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = SelectorPseudoClassAndCompatibilityElementMap.gperf; path = DerivedSources/WebCore/SelectorPseudoClassAndCompatibilityElementMap.gperf; sourceTree = BUILT_PRODUCTS_DIR; };
</span><span class="cx">          43B85ED618CBEC9700E31AF4 /* SelectorPseudoClassAndCompatibilityElementMap.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SelectorPseudoClassAndCompatibilityElementMap.in; sourceTree = "<group>"; };
</span><del>-               43B9336713B261B1004584BF /* SVGAnimatedPointList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPointList.h; sourceTree = "<group>"; };
-               43B9336813B261B1004584BF /* SVGAnimatedPointList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedPointList.cpp; sourceTree = "<group>"; };
</del><span class="cx">           43C092B912D9E4EE00A989C3 /* RenderSVGForeignObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGForeignObject.cpp; sourceTree = "<group>"; };
</span><span class="cx">          43C092BA12D9E4EE00A989C3 /* RenderSVGForeignObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSVGForeignObject.h; sourceTree = "<group>"; };
</span><span class="cx">          43D2597613C816F400608559 /* ImageBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageBuffer.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -9522,6 +9519,11 @@
</span><span class="cx">          7266F0152241C09800833975 /* SVGPrimitivePropertyAnimator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGPrimitivePropertyAnimator.h; sourceTree = "<group>"; };
</span><span class="cx">          7266F0162241C0FE00833975 /* SVGPropertyAnimator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGPropertyAnimator.h; sourceTree = "<group>"; };
</span><span class="cx">          7266F01822429CFD00833975 /* SVGAnimationAdditiveValueFunctionImpl.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimationAdditiveValueFunctionImpl.cpp; sourceTree = "<group>"; };
</span><ins>+               7266F02522430F8C00833975 /* SVGValuePropertyList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGValuePropertyList.h; sourceTree = "<group>"; };
+               7266F0272243109200833975 /* SVGPropertyList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGPropertyList.h; sourceTree = "<group>"; };
+               7266F0282243120300833975 /* SVGAnimationAdditiveListFunctionImpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimationAdditiveListFunctionImpl.h; sourceTree = "<group>"; };
+               7266F029224312B100833975 /* SVGAnimationAdditiveListFunction.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimationAdditiveListFunction.h; sourceTree = "<group>"; };
+               7266F02A2243149B00833975 /* SVGAnimatedPropertyList.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPropertyList.h; sourceTree = "<group>"; };
</ins><span class="cx">           727AFED11A2EA6A0000442E8 /* EXTsRGB.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = EXTsRGB.cpp; sourceTree = "<group>"; };
</span><span class="cx">          727AFED21A2EA6A0000442E8 /* EXTsRGB.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = EXTsRGB.h; sourceTree = "<group>"; };
</span><span class="cx">          727AFED31A2EA6A0000442E8 /* EXTsRGB.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EXTsRGB.idl; sourceTree = "<group>"; };
</span><span class="lines">@@ -9736,8 +9738,6 @@
</span><span class="cx">          7C39C3631DDA864900FEFB29 /* SVGLengthListValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGLengthListValues.h; sourceTree = "<group>"; };
</span><span class="cx">          7C39C3681DDB86D300FEFB29 /* SVGNumberListValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGNumberListValues.cpp; sourceTree = "<group>"; };
</span><span class="cx">          7C39C3691DDB86D300FEFB29 /* SVGNumberListValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGNumberListValues.h; sourceTree = "<group>"; };
</span><del>-               7C39C36A1DDB871C00FEFB29 /* SVGPointListValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPointListValues.cpp; sourceTree = "<group>"; };
-               7C39C36B1DDB871C00FEFB29 /* SVGPointListValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPointListValues.h; sourceTree = "<group>"; };
</del><span class="cx">           7C39C36C1DDB8BB000FEFB29 /* SVGTransformListValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGTransformListValues.cpp; sourceTree = "<group>"; };
</span><span class="cx">          7C39C36D1DDB8BB000FEFB29 /* SVGTransformListValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTransformListValues.h; sourceTree = "<group>"; };
</span><span class="cx">          7C39C36E1DDBA3E000FEFB29 /* SVGPathSegListValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegListValues.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -16219,6 +16219,7 @@
</span><span class="cx">                          55EE5356223B29F700FBA944 /* SVGAnimatedPropertyAnimatorImpl.h */,
</span><span class="cx">                          088A0DFD126EF1DB00978F7A /* SVGAnimatedPropertyDescription.h */,
</span><span class="cx">                          55EE535C223B2A0D00FBA944 /* SVGAnimatedPropertyImpl.h */,
</span><ins>+                               7266F02A2243149B00833975 /* SVGAnimatedPropertyList.h */,
</ins><span class="cx">                           55BE025E223B29C40032F08A /* SVGAnimatedPropertyPairAccessor.h */,
</span><span class="cx">                          55EE535D223B2A0D00FBA944 /* SVGAnimatedPropertyPairAccessorImpl.h */,
</span><span class="cx">                          55EE535F223B2A0F00FBA944 /* SVGAnimatedPropertyPairAnimator.h */,
</span><span class="lines">@@ -16229,6 +16230,8 @@
</span><span class="cx">                          085A15921289A8DD002710E3 /* SVGAnimatedTransformListPropertyTearOff.h */,
</span><span class="cx">                          721443452240C8BA00F12FF7 /* SVGAnimatedValueProperty.h */,
</span><span class="cx">                          55BE025F223B29C50032F08A /* SVGAnimationAdditiveFunction.h */,
</span><ins>+                               7266F029224312B100833975 /* SVGAnimationAdditiveListFunction.h */,
+                               7266F0282243120300833975 /* SVGAnimationAdditiveListFunctionImpl.h */,
</ins><span class="cx">                           55EE535E223B2A0E00FBA944 /* SVGAnimationAdditiveValueFunction.h */,
</span><span class="cx">                          7266F01822429CFD00833975 /* SVGAnimationAdditiveValueFunctionImpl.cpp */,
</span><span class="cx">                          55BE0259223B29C10032F08A /* SVGAnimationAdditiveValueFunctionImpl.h */,
</span><span class="lines">@@ -16260,6 +16263,7 @@
</span><span class="cx">                          55DCC5272240750B00C26E32 /* SVGPropertyAccessorImpl.h */,
</span><span class="cx">                          7266F0162241C0FE00833975 /* SVGPropertyAnimator.h */,
</span><span class="cx">                          7266F0132241BCE200833975 /* SVGPropertyAnimatorFactory.h */,
</span><ins>+                               7266F0272243109200833975 /* SVGPropertyList.h */,
</ins><span class="cx">                           55EE5360223B2A2100FBA944 /* SVGPropertyOwner.h */,
</span><span class="cx">                          55BE025C223B29C30032F08A /* SVGPropertyOwnerRegistry.h */,
</span><span class="cx">                          55BE0257223B29C00032F08A /* SVGPropertyRegistry.h */,
</span><span class="lines">@@ -16267,6 +16271,7 @@
</span><span class="cx">                          088A0E03126EF1DB00978F7A /* SVGPropertyTraits.h */,
</span><span class="cx">                          0813A4E91284132600992511 /* SVGStaticPropertyTearOff.h */,
</span><span class="cx">                          721443462240CAD200F12FF7 /* SVGValueProperty.h */,
</span><ins>+                               7266F02522430F8C00833975 /* SVGValuePropertyList.h */,
</ins><span class="cx">                   );
</span><span class="cx">                  path = properties;
</span><span class="cx">                  sourceTree = "<group>";
</span><span class="lines">@@ -24146,8 +24151,6 @@
</span><span class="cx">                          B22277ED0D00BF1F0071B782 /* SVGAnimatedNumberList.idl */,
</span><span class="cx">                          0863951313B5FE5700BB344D /* SVGAnimatedPath.cpp */,
</span><span class="cx">                          0863951413B5FE5700BB344D /* SVGAnimatedPath.h */,
</span><del>-                               43B9336813B261B1004584BF /* SVGAnimatedPointList.cpp */,
-                               43B9336713B261B1004584BF /* SVGAnimatedPointList.h */,
</del><span class="cx">                           B22277F40D00BF1F0071B782 /* SVGAnimatedPreserveAspectRatio.idl */,
</span><span class="cx">                          B22277F50D00BF1F0071B782 /* SVGAnimatedRect.idl */,
</span><span class="cx">                          B22277F60D00BF1F0071B782 /* SVGAnimatedString.idl */,
</span><span class="lines">@@ -24480,8 +24483,6 @@
</span><span class="cx">                          B22278F40D00BF210071B782 /* SVGPoint.idl */,
</span><span class="cx">                          B22278F60D00BF210071B782 /* SVGPointList.h */,
</span><span class="cx">                          B22278F70D00BF210071B782 /* SVGPointList.idl */,
</span><del>-                               7C39C36A1DDB871C00FEFB29 /* SVGPointListValues.cpp */,
-                               7C39C36B1DDB871C00FEFB29 /* SVGPointListValues.h */,
</del><span class="cx">                           B22278F80D00BF210071B782 /* SVGPolyElement.cpp */,
</span><span class="cx">                          B22278F90D00BF210071B782 /* SVGPolyElement.h */,
</span><span class="cx">                          B22278FA0D00BF210071B782 /* SVGPolygonElement.cpp */,
</span><span class="lines">@@ -31923,7 +31924,6 @@
</span><span class="cx">                          08B35B17127B6A88005314DD /* SVGAnimatedNumberList.h in Headers */,
</span><span class="cx">                          0863951613B5FE5700BB344D /* SVGAnimatedPath.h in Headers */,
</span><span class="cx">                          089A8E07128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h in Headers */,
</span><del>-                               43B9336913B261B1004584BF /* SVGAnimatedPointList.h in Headers */,
</del><span class="cx">                           088A0E06126EF1DB00978F7A /* SVGAnimatedPropertyDescription.h in Headers */,
</span><span class="cx">                          088A0E08126EF1DB00978F7A /* SVGAnimatedPropertyTearOff.h in Headers */,
</span><span class="cx">                          55FA7FFF21110E6E005AEFE7 /* SVGAnimatedPropertyType.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgSVGPathDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/SVGPathData.cpp (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/SVGPathData.cpp       2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/rendering/svg/SVGPathData.cpp  2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-static Path pathFromCircleElement(SVGElement& element)
</del><ins>+static Path pathFromCircleElement(const SVGElement& element)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(is<SVGCircleElement>(element));
</span><span class="cx"> 
</span><span class="lines">@@ -59,7 +59,7 @@
</span><span class="cx">     return path;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static Path pathFromEllipseElement(SVGElement& element)
</del><ins>+static Path pathFromEllipseElement(const SVGElement& element)
</ins><span class="cx"> {
</span><span class="cx">     RenderElement* renderer = element.renderer();
</span><span class="cx">     if (!renderer)
</span><span class="lines">@@ -82,7 +82,7 @@
</span><span class="cx">     return path;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static Path pathFromLineElement(SVGElement& element)
</del><ins>+static Path pathFromLineElement(const SVGElement& element)
</ins><span class="cx"> {
</span><span class="cx">     Path path;
</span><span class="cx">     const auto& line = downcast<SVGLineElement>(element);
</span><span class="lines">@@ -93,44 +93,44 @@
</span><span class="cx">     return path;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static Path pathFromPathElement(SVGElement& element)
</del><ins>+static Path pathFromPathElement(const SVGElement& element)
</ins><span class="cx"> {
</span><span class="cx">     return downcast<SVGPathElement>(element).pathForByteStream();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static Path pathFromPolygonElement(SVGElement& element)
</del><ins>+static Path pathFromPolygonElement(const SVGElement& element)
</ins><span class="cx"> {
</span><del>-    auto& points = downcast<SVGPolygonElement>(element).animatedPoints()->values();
</del><ins>+    auto& points = downcast<SVGPolygonElement>(element).points().items();
</ins><span class="cx">     if (points.isEmpty())
</span><span class="cx">         return { };
</span><span class="cx"> 
</span><span class="cx">     Path path;
</span><del>-    path.moveTo(points.first());
</del><ins>+    path.moveTo(points.first()->value());
</ins><span class="cx"> 
</span><span class="cx">     unsigned size = points.size();
</span><span class="cx">     for (unsigned i = 1; i < size; ++i)
</span><del>-        path.addLineTo(points.at(i));
</del><ins>+        path.addLineTo(points.at(i)->value());
</ins><span class="cx"> 
</span><span class="cx">     path.closeSubpath();
</span><span class="cx">     return path;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static Path pathFromPolylineElement(SVGElement& element)
</del><ins>+static Path pathFromPolylineElement(const SVGElement& element)
</ins><span class="cx"> {
</span><del>-    auto& points = downcast<SVGPolylineElement>(element).animatedPoints()->values();
</del><ins>+    auto& points = downcast<SVGPolylineElement>(element).points().items();
</ins><span class="cx">     if (points.isEmpty())
</span><span class="cx">         return { };
</span><span class="cx"> 
</span><span class="cx">     Path path;
</span><del>-    path.moveTo(points.first());
</del><ins>+    path.moveTo(points.first()->value());
</ins><span class="cx"> 
</span><span class="cx">     unsigned size = points.size();
</span><span class="cx">     for (unsigned i = 1; i < size; ++i)
</span><del>-        path.addLineTo(points.at(i));
</del><ins>+        path.addLineTo(points.at(i)->value());
</ins><span class="cx">     return path;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static Path pathFromRectElement(SVGElement& element)
</del><ins>+static Path pathFromRectElement(const SVGElement& element)
</ins><span class="cx"> {
</span><span class="cx">     RenderElement* renderer = element.renderer();
</span><span class="cx">     if (!renderer)
</span><span class="lines">@@ -169,11 +169,11 @@
</span><span class="cx">     return path;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Path pathFromGraphicsElement(SVGElement* element)
</del><ins>+Path pathFromGraphicsElement(const SVGElement* element)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(element);
</span><span class="cx"> 
</span><del>-    typedef Path (*PathFromFunction)(SVGElement&);
</del><ins>+    typedef Path (*PathFromFunction)(const SVGElement&);
</ins><span class="cx">     static HashMap<AtomicStringImpl*, PathFromFunction>* map = 0;
</span><span class="cx">     if (!map) {
</span><span class="cx">         map = new HashMap<AtomicStringImpl*, PathFromFunction>;
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgSVGPathDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/SVGPathData.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/SVGPathData.h 2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/rendering/svg/SVGPathData.h    2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -24,6 +24,6 @@
</span><span class="cx"> class SVGElement;
</span><span class="cx"> class Path;
</span><span class="cx"> 
</span><del>-Path pathFromGraphicsElement(SVGElement*);
</del><ins>+Path pathFromGraphicsElement(const SVGElement*);
</ins><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgSVGRenderTreeAsTextcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp       2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp  2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -271,7 +271,7 @@
</span><span class="cx">         writeNameValuePair(ts, "r", element.r().value(lengthContext));
</span><span class="cx">     } else if (is<SVGPolyElement>(svgElement)) {
</span><span class="cx">         const SVGPolyElement& element = downcast<SVGPolyElement>(svgElement);
</span><del>-        writeNameAndQuotedValue(ts, "points", element.pointList().valueAsString());
</del><ins>+        writeNameAndQuotedValue(ts, "points", element.points().valueAsString());
</ins><span class="cx">     } else if (is<SVGPathElement>(svgElement)) {
</span><span class="cx">         const SVGPathElement& element = downcast<SVGPathElement>(svgElement);
</span><span class="cx">         String pathString;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedPointListcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedPointList.cpp (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedPointList.cpp        2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGAnimatedPointList.cpp   2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,116 +0,0 @@
</span><del>-/*
- * Copyright (C) Research In Motion Limited 2011, 2012. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include "SVGAnimatedPointList.h"
-
-#include "SVGAnimateElementBase.h"
-#include "SVGParserUtilities.h"
-#include "SVGPoint.h"
-#include "SVGPointListValues.h"
-
-namespace WebCore {
-
-SVGAnimatedPointListAnimator::SVGAnimatedPointListAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement)
-    : SVGAnimatedTypeAnimator(AnimatedPoints, animationElement, contextElement)
-{
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedPointListAnimator::constructFromString(const String& string)
-{
-    return SVGAnimatedType::create(SVGPropertyTraits<SVGPointListValues>::fromString(string));
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedPointListAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    return constructFromBaseValue<SVGAnimatedPointList>(animatedTypes);
-}
-
-void SVGAnimatedPointListAnimator::stopAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    stopAnimValAnimationForType<SVGAnimatedPointList>(animatedTypes);
-}
-
-void SVGAnimatedPointListAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGAnimatedType& type)
-{
-    resetFromBaseValue<SVGAnimatedPointList>(animatedTypes, type);
-}
-
-void SVGAnimatedPointListAnimator::animValWillChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValWillChangeForType<SVGAnimatedPointList>(animatedTypes);
-}
-
-void SVGAnimatedPointListAnimator::animValDidChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValDidChangeForType<SVGAnimatedPointList>(animatedTypes);
-}
-
-void SVGAnimatedPointListAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnimatedType* to)
-{
-    ASSERT(from->type() == AnimatedPoints);
-    ASSERT(from->type() == to->type());
-
-    const auto& fromPointList = from->as<SVGPointListValues>();
-    auto& toPointList = to->as<SVGPointListValues>();
-
-    unsigned fromPointListSize = fromPointList.size();
-    if (!fromPointListSize || fromPointListSize != toPointList.size())
-        return;
-
-    for (unsigned i = 0; i < fromPointListSize; ++i)
-        toPointList[i] += fromPointList[i];
-}
-
-void SVGAnimatedPointListAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType* toAtEndOfDuration, SVGAnimatedType* animated)
-{
-    ASSERT(m_animationElement);
-
-    const auto& fromPointList = (m_animationElement->animationMode() == AnimationMode::To ? animated : from)->as<SVGPointListValues>();
-    const auto& toPointList = to->as<SVGPointListValues>();
-    const auto& toAtEndOfDurationPointList = toAtEndOfDuration->as<SVGPointListValues>();
-    auto& animatedPointList = animated->as<SVGPointListValues>();
-    if (!m_animationElement->adjustFromToListValues<SVGPointListValues>(fromPointList, toPointList, animatedPointList, percentage))
-        return;
-
-    unsigned fromPointListSize = fromPointList.size();
-    unsigned toPointListSize = toPointList.size();
-    unsigned toAtEndOfDurationSize = toAtEndOfDurationPointList.size();
-
-    for (unsigned i = 0; i < toPointListSize; ++i) {
-        FloatPoint effectiveFrom;
-        if (fromPointListSize)
-            effectiveFrom = fromPointList[i];
-        FloatPoint effectiveToAtEnd = i < toAtEndOfDurationSize ? toAtEndOfDurationPointList[i] : FloatPoint();
-
-        float animatedX = animatedPointList[i].x();
-        float animatedY = animatedPointList[i].y();
-        m_animationElement->animateAdditiveNumber(percentage, repeatCount, effectiveFrom.x(), toPointList[i].x(), effectiveToAtEnd.x(), animatedX);
-        m_animationElement->animateAdditiveNumber(percentage, repeatCount, effectiveFrom.y(), toPointList[i].y(), effectiveToAtEnd.y(), animatedY);
-        animatedPointList[i] = FloatPoint(animatedX, animatedY);
-    }
-}
-
-float SVGAnimatedPointListAnimator::calculateDistance(const String&, const String&)
-{
-    // FIXME: Distance calculation is not possible for SVGPointListValues right now. We need the distance of for every single value.
-    return -1;
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedPointListh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedPointList.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedPointList.h  2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGAnimatedPointList.h     2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,55 +0,0 @@
</span><del>-/*
- * Copyright (C) Research In Motion Limited 2011. All rights reserved.
- * Copyright (C) 2018 Apple Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGAnimatedListPropertyTearOff.h"
-#include "SVGAnimatedTypeAnimator.h"
-#include "SVGAttribute.h"
-#include "SVGAttributeAccessor.h"
-#include "SVGPointList.h"
-
-namespace WebCore {
-
-class SVGAnimationElement;
-
-using SVGAnimatedPointList = SVGAnimatedListPropertyTearOff<SVGPointListValues>;
-using SVGAnimatedPointListAttribute = SVGAnimatedAttributeList<SVGAnimatedPointList>;
-
-template<typename OwnerType>
-using SVGAnimatedPointListAttributeAccessor = SVGAnimatedAttributeAccessor<OwnerType, SVGAnimatedPointListAttribute, AnimatedPoints>;
-
-class SVGAnimatedPointListAnimator final : public SVGAnimatedTypeAnimator {
-public:
-    SVGAnimatedPointListAnimator(SVGAnimationElement*, SVGElement*);
-
-    std::unique_ptr<SVGAnimatedType> constructFromString(const String&) override;
-    std::unique_ptr<SVGAnimatedType> startAnimValAnimation(const SVGElementAnimatedPropertyList&) override;
-    void stopAnimValAnimation(const SVGElementAnimatedPropertyList&) override;
-    void resetAnimValToBaseVal(const SVGElementAnimatedPropertyList&, SVGAnimatedType&) override;
-    void animValWillChange(const SVGElementAnimatedPropertyList&) override;
-    void animValDidChange(const SVGElementAnimatedPropertyList&) override;
-
-    void addAnimatedTypes(SVGAnimatedType*, SVGAnimatedType*) override;
-    void calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType*, SVGAnimatedType*, SVGAnimatedType*, SVGAnimatedType*) override;
-    float calculateDistance(const String& fromString, const String& toString) override;
-};
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimatedType.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedType.h       2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGAnimatedType.h  2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -110,8 +110,18 @@
</span><span class="cx"> 
</span><span class="cx">     AnimatedPropertyType type() const
</span><span class="cx">     {
</span><del>-        ASSERT(m_value.index() >= AnimatedPropertyTypeMin && m_value.index() < AnimatedPropertyTypeMax);
-        return static_cast<AnimatedPropertyType>(m_value.index());
</del><ins>+        static AnimatedPropertyType animatedTypes[] = {
+            AnimatedAngle,
+            AnimatedEnumeration,
+            AnimatedLength,
+            AnimatedLengthList,
+            AnimatedNumberList,
+            AnimatedPath,
+            AnimatedTransformList
+        };
+
+        ASSERT(static_cast<size_t>(m_value.index()) < sizeof(animatedTypes) / sizeof(animatedTypes[0]));
+        return animatedTypes[m_value.index()];
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     String valueAsString() const
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatorFactoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimatorFactory.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatorFactory.h    2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGAnimatorFactory.h       2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx"> #include "SVGAnimatedLengthList.h"
</span><span class="cx"> #include "SVGAnimatedNumberList.h"
</span><span class="cx"> #include "SVGAnimatedPath.h"
</span><del>-#include "SVGAnimatedPointList.h"
</del><span class="cx"> #include "SVGAnimatedTransformList.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -46,6 +45,7 @@
</span><span class="cx">         case AnimatedIntegerOptionalInteger:
</span><span class="cx">         case AnimatedNumber:
</span><span class="cx">         case AnimatedNumberOptionalNumber:
</span><ins>+        case AnimatedPoints:
</ins><span class="cx">         case AnimatedPreserveAspectRatio:
</span><span class="cx">         case AnimatedRect:
</span><span class="cx">         case AnimatedString:
</span><span class="lines">@@ -63,8 +63,6 @@
</span><span class="cx">             return std::make_unique<SVGAnimatedNumberListAnimator>(animationElement, contextElement);
</span><span class="cx">         case AnimatedPath:
</span><span class="cx">             return std::make_unique<SVGAnimatedPathAnimator>(animationElement, contextElement);
</span><del>-        case AnimatedPoints:
-            return std::make_unique<SVGAnimatedPointListAnimator>(animationElement, contextElement);
</del><span class="cx">         case AnimatedTransformList:
</span><span class="cx">             return std::make_unique<SVGAnimatedTransformListAnimator>(animationElement, contextElement);
</span><span class="cx">         case AnimatedUnknown:
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGParserUtilitiescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGParserUtilities.cpp (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGParserUtilities.cpp  2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGParserUtilities.cpp     2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include "Document.h"
</span><span class="cx"> #include "FloatRect.h"
</span><del>-#include "SVGPointListValues.h"
</del><span class="cx"> #include <limits>
</span><span class="cx"> #include <wtf/ASCIICType.h>
</span><span class="cx"> #include <wtf/text/StringView.h>
</span><span class="lines">@@ -260,40 +259,6 @@
</span><span class="cx">     return valid;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool pointsListFromSVGData(SVGPointListValues& pointsList, const String& points)
-{
-    if (points.isEmpty())
-        return true;
-    auto upconvertedCharacters = StringView(points).upconvertedCharacters();
-    const UChar* cur = upconvertedCharacters;
-    const UChar* end = cur + points.length();
-
-    skipOptionalSVGSpaces(cur, end);
-
-    bool delimParsed = false;
-    while (cur < end) {
-        delimParsed = false;
-        float xPos = 0.0f;
-        if (!parseNumber(cur, end, xPos))
-           return false;
-
-        float yPos = 0.0f;
-        if (!parseNumber(cur, end, yPos, false))
-            return false;
-
-        skipOptionalSVGSpaces(cur, end);
-
-        if (cur < end && *cur == ',') {
-            delimParsed = true;
-            cur++;
-        }
-        skipOptionalSVGSpaces(cur, end);
-
-        pointsList.append(FloatPoint(xPos, yPos));
-    }
-    return cur == end && !delimParsed;
-}
-
</del><span class="cx"> bool parseGlyphName(const String& input, HashSet<String>& values)
</span><span class="cx"> {
</span><span class="cx">     // FIXME: Parsing error detection is missing.
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGParserUtilitiesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGParserUtilities.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGParserUtilities.h    2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGParserUtilities.h       2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -32,7 +32,6 @@
</span><span class="cx"> 
</span><span class="cx"> class FloatPoint;
</span><span class="cx"> class FloatRect;
</span><del>-class SVGPointListValues;
</del><span class="cx"> 
</span><span class="cx"> template <typename CharacterType>
</span><span class="cx"> bool parseSVGNumber(CharacterType* ptr, size_t length, double& number);
</span><span class="lines">@@ -82,7 +81,6 @@
</span><span class="cx">     return ptr < end;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool pointsListFromSVGData(SVGPointListValues&, const String& points);
</del><span class="cx"> Vector<String> parseDelimitedString(const String& input, const char seperator);
</span><span class="cx"> bool parseKerningUnicodeString(const String& input, UnicodeRanges&, HashSet<String>& stringList);
</span><span class="cx"> bool parseGlyphName(const String& input, HashSet<String>& values);
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPointh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPoint.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPoint.h      2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGPoint.h 2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2013 Samsung Electronics. All rights reserved.
</span><del>- * Copyright (C) 2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -28,87 +28,70 @@
</span><span class="cx"> 
</span><span class="cx"> #include "FloatPoint.h"
</span><span class="cx"> #include "SVGMatrix.h"
</span><del>-#include "SVGPropertyTearOff.h"
</del><ins>+#include "SVGValueProperty.h"
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class SVGPoint : public SVGPropertyTearOff<FloatPoint> {
</del><ins>+class SVGPoint : public SVGValueProperty<FloatPoint> {
+    using Base = SVGValueProperty<FloatPoint>;
+    using Base::Base;
+    using Base::m_value;
+
</ins><span class="cx"> public:
</span><del>-    static Ref<SVGPoint> create(SVGLegacyAnimatedProperty& animatedProperty, SVGPropertyRole role, FloatPoint& value)
</del><ins>+    static Ref<SVGPoint> create(const FloatPoint& value = { })
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new SVGPoint(animatedProperty, role, value));
</del><ins>+        return adoptRef(*new SVGPoint(value));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static Ref<SVGPoint> create(const FloatPoint& initialValue = { })
</del><ins>+    template<typename T>
+    static ExceptionOr<Ref<SVGPoint>> create(ExceptionOr<T>&& value)
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new SVGPoint(initialValue));
</del><ins>+        if (value.hasException())
+            return value.releaseException();
+        return adoptRef(*new SVGPoint(value.releaseReturnValue()));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template<typename T> static ExceptionOr<Ref<SVGPoint>> create(ExceptionOr<T>&& initialValue)
</del><ins>+    Ref<SVGPoint> clone() const
</ins><span class="cx">     {
</span><del>-        if (initialValue.hasException())
-            return initialValue.releaseException();
-        return create(initialValue.releaseReturnValue());
</del><ins>+        return SVGPoint::create(m_value);
</ins><span class="cx">     }
</span><ins>+    
+    float x() { return m_value.x(); }
</ins><span class="cx"> 
</span><del>-    float x()
</del><ins>+    ExceptionOr<void> setX(float x)
</ins><span class="cx">     {
</span><del>-        return propertyReference().x();
-    }
-
-    ExceptionOr<void> setX(float xValue)
-    {
</del><span class="cx">         if (isReadOnly())
</span><span class="cx">             return Exception { NoModificationAllowedError };
</span><span class="cx"> 
</span><del>-        propertyReference().setX(xValue);
</del><ins>+        m_value.setX(x);
</ins><span class="cx">         commitChange();
</span><span class="cx"> 
</span><span class="cx">         return { };
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    float y()
-    {
-        return propertyReference().y();
-    }
</del><ins>+    float y() { return m_value.y(); }
</ins><span class="cx"> 
</span><del>-    ExceptionOr<void> setY(float xValue)
</del><ins>+    ExceptionOr<void> setY(float y)
</ins><span class="cx">     {
</span><span class="cx">         if (isReadOnly())
</span><span class="cx">             return Exception { NoModificationAllowedError };
</span><span class="cx"> 
</span><del>-        propertyReference().setY(xValue);
</del><ins>+        m_value.setY(y);
</ins><span class="cx">         commitChange();
</span><del>-
</del><span class="cx">         return { };
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    ExceptionOr<Ref<SVGPoint>> matrixTransform(SVGMatrix& matrix)
</del><ins>+    Ref<SVGPoint> matrixTransform(SVGMatrix& matrix) const
</ins><span class="cx">     {
</span><del>-        if (isReadOnly())
-            return Exception { NoModificationAllowedError };
-
-        auto newPoint = propertyReference().matrixTransform(matrix.propertyReference());
-        commitChange();
-
-        return SVGPoint::create(newPoint);
</del><ins>+        auto newPoint = m_value.matrixTransform(matrix.propertyReference());
+        return adoptRef(*new SVGPoint(newPoint));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-protected:
-    SVGPoint(SVGLegacyAnimatedProperty& animatedProperty, SVGPropertyRole role, FloatPoint& value)
-        : SVGPropertyTearOff<FloatPoint>(&animatedProperty, role, value)
</del><ins>+private:
+    String valueAsString() const override
</ins><span class="cx">     {
</span><ins>+        return SVGPropertyTraits<FloatPoint>::toString(m_value);
</ins><span class="cx">     }
</span><del>-
-    SVGPoint(SVGPropertyRole role, FloatPoint& value)
-        : SVGPropertyTearOff<FloatPoint>(nullptr, role, value)
-    {
-    }
-
-    explicit SVGPoint(const FloatPoint& initialValue)
-        : SVGPropertyTearOff<FloatPoint>(initialValue)
-    {
-    }
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPointidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPoint.idl (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPoint.idl    2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGPoint.idl       2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -26,6 +26,6 @@
</span><span class="cx">     attribute unrestricted float x;
</span><span class="cx">     attribute unrestricted float y;
</span><span class="cx"> 
</span><del>-    [MayThrowException, NewObject] SVGPoint matrixTransform(SVGMatrix matrix);
</del><ins>+    [NewObject] SVGPoint matrixTransform(SVGMatrix matrix);
</ins><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPointListh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPointList.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPointList.h  2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGPointList.h     2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -25,28 +25,81 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGAnimatedListPropertyTearOff.h"
-#include "SVGListPropertyTearOff.h"
</del><span class="cx"> #include "SVGPoint.h"
</span><del>-#include "SVGPointListValues.h"
</del><ins>+#include "SVGValuePropertyList.h"
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class SVGPointList : public SVGListPropertyTearOff<SVGPointListValues> {
</del><ins>+class SVGPointList : public SVGValuePropertyList<SVGPoint> {
+    using Base = SVGValuePropertyList<SVGPoint>;
+    using Base::Base;
+
</ins><span class="cx"> public:
</span><del>-    using AnimatedListPropertyTearOff = SVGAnimatedListPropertyTearOff<SVGPointListValues>;
-    using ListWrapperCache = AnimatedListPropertyTearOff::ListWrapperCache;
</del><ins>+    static Ref<SVGPointList> create()
+    {
+        return adoptRef(*new SVGPointList());
+    }
</ins><span class="cx"> 
</span><del>-    static Ref<SVGPointList> create(AnimatedListPropertyTearOff& animatedProperty, SVGPropertyRole role, SVGPointListValues& values, ListWrapperCache& wrappers)
</del><ins>+    static Ref<SVGPointList> create(SVGPropertyOwner* owner, SVGPropertyAccess access)
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new SVGPointList(animatedProperty, role, values, wrappers));
</del><ins>+        return adoptRef(*new SVGPointList(owner, access));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-private:
-    SVGPointList(AnimatedListPropertyTearOff& animatedProperty, SVGPropertyRole role, SVGPointListValues& values, ListWrapperCache& wrappers)
-        : SVGListPropertyTearOff<SVGPointListValues>(animatedProperty, role, values, wrappers)
</del><ins>+    static Ref<SVGPointList> create(const SVGPointList& other, SVGPropertyAccess access)
</ins><span class="cx">     {
</span><ins>+        return adoptRef(*new SVGPointList(other, access));
</ins><span class="cx">     }
</span><ins>+
+    bool parse(const String& value)
+    {
+        clearItems();
+
+        auto upconvertedCharacters = StringView(value).upconvertedCharacters();
+        const UChar* cur = upconvertedCharacters;
+        const UChar* end = cur + value.length();
+
+        skipOptionalSVGSpaces(cur, end);
+
+        bool delimParsed = false;
+        while (cur < end) {
+            delimParsed = false;
+            float xPos = 0.0f;
+            if (!parseNumber(cur, end, xPos))
+                return false;
+
+            float yPos = 0.0f;
+            if (!parseNumber(cur, end, yPos, false))
+                return false;
+
+            skipOptionalSVGSpaces(cur, end);
+
+            if (cur < end && *cur == ',') {
+                delimParsed = true;
+                cur++;
+            }
+            skipOptionalSVGSpaces(cur, end);
+
+            append(SVGPoint::create({ xPos, yPos }));
+        }
+
+        return !delimParsed;
+    }
+
+    String valueAsString() const override
+    {
+        StringBuilder builder;
+
+        for (const auto& point : m_items) {
+            if (builder.length())
+                builder.append(' ');
+
+            builder.appendNumber(point->x());
+            builder.append(' ');
+            builder.appendNumber(point->y());
+        }
+
+        return builder.toString();
+    }
</ins><span class="cx"> };
</span><span class="cx"> 
</span><del>-} // namespace WebCore
</del><ins>+}
</ins></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPointListValuescpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGPointListValues.cpp (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPointListValues.cpp  2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGPointListValues.cpp     2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,47 +0,0 @@
</span><del>-/*
- * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include "SVGPointListValues.h"
-
-#include <wtf/text/StringBuilder.h>
-#include <wtf/text/WTFString.h>
-
-namespace WebCore {
-
-String SVGPointListValues::valueAsString() const
-{
-    StringBuilder builder;
-
-    unsigned size = this->size();
-    for (unsigned i = 0; i < size; ++i) {
-        if (i > 0)
-            builder.append(' '); // FIXME: Shouldn't we use commas to seperate?
-
-        const auto& point = at(i);
-        builder.appendFixedPrecisionNumber(point.x());
-        builder.append(' ');
-        builder.appendFixedPrecisionNumber(point.y());
-    }
-
-    return builder.toString();
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPointListValuesh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGPointListValues.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPointListValues.h    2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGPointListValues.h       2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,55 +0,0 @@
</span><del>-/*
- * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
- * Copyright (C) 2018 Apple Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "FloatPoint.h"
-#include "SVGPropertyTraits.h"
-#include <wtf/Vector.h>
-
-namespace WebCore {
-
-class SVGPoint;
-class SVGPointList;
-
-class SVGPointListValues final : public Vector<FloatPoint> {
-public:
-    String valueAsString() const;
-};
-
-template<>
-struct SVGPropertyTraits<SVGPointListValues> {
-    static SVGPointListValues initialValue() { return { }; }
-    static SVGPointListValues fromString(const String& string)
-    {
-        SVGPointListValues list;
-        pointsListFromSVGData(list, string);
-        return list;
-    }
-    static Optional<SVGPointListValues> parse(const QualifiedName&, const String&) { ASSERT_NOT_REACHED(); return { }; }
-    static String toString(const SVGPointListValues& list) { return list.valueAsString(); }
-
-    using ListItemType = FloatPoint;
-    using ListItemTearOff = SVGPoint;
-    using ListPropertyTearOff = SVGPointList;
-};
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPolyElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPolyElement.cpp (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPolyElement.cpp      2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGPolyElement.cpp 2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
</span><del>- * Copyright (C) 2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -37,28 +37,17 @@
</span><span class="cx">     : SVGGeometryElement(tagName, document)
</span><span class="cx">     , SVGExternalResourcesRequired(this)
</span><span class="cx"> {
</span><del>-    registerAttributes();
</del><ins>+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::pointsAttr, &SVGPolyElement::m_points>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGPolyElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::pointsAttr, &SVGPolyElement::m_points>();
-}
-
</del><span class="cx"> void SVGPolyElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (name == SVGNames::pointsAttr) {
</span><del>-        SVGPointListValues newList;
-        if (!pointsListFromSVGData(newList, value))
</del><ins>+        if (!m_points->baseVal()->parse(value))
</ins><span class="cx">             document().accessSVGExtensions().reportError("Problem parsing points=\"" + value + "\"");
</span><del>-
-        if (auto wrapper = static_pointer_cast<SVGAnimatedPointList>(lookupAnimatedProperty(m_points)))
-            wrapper->detachListWrappers(newList.size());
-
-        m_points.setValue(WTFMove(newList));
</del><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -81,21 +70,9 @@
</span><span class="cx">     SVGExternalResourcesRequired::svgAttributeChanged(attrName);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref<SVGPointList> SVGPolyElement::points()
-{
-    m_points.setShouldSynchronize(true);
-    return static_pointer_cast<SVGAnimatedPointList>(lookupOrCreateAnimatedProperty(m_points))->baseVal();
-}
-
-Ref<SVGPointList> SVGPolyElement::animatedPoints()
-{
-    m_points.setShouldSynchronize(true);
-    return static_pointer_cast<SVGAnimatedPointList>(lookupOrCreateAnimatedProperty(m_points))->animVal();
-}
-
</del><span class="cx"> size_t SVGPolyElement::approximateMemoryCost() const
</span><span class="cx"> {
</span><del>-    size_t pointsCost = pointList().size() * sizeof(FloatPoint);
</del><ins>+    size_t pointsCost = m_points->baseVal()->items().size() * sizeof(FloatPoint);
</ins><span class="cx">     // We need to account for the memory which is allocated by the RenderSVGPath::m_path.
</span><span class="cx">     return sizeof(*this) + (renderer() ? pointsCost * 2 + sizeof(RenderSVGPath) : pointsCost);
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPolyElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPolyElement.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPolyElement.h        2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGPolyElement.h   2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -21,7 +21,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGAnimatedPointList.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGeometryElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="lines">@@ -31,10 +30,10 @@
</span><span class="cx"> class SVGPolyElement : public SVGGeometryElement, public SVGExternalResourcesRequired {
</span><span class="cx">     WTF_MAKE_ISO_ALLOCATED(SVGPolyElement);
</span><span class="cx"> public:
</span><del>-    Ref<SVGPointList> points();
-    Ref<SVGPointList> animatedPoints();
</del><ins>+    const SVGPointList& points() const { return m_points->currentValue(); }
</ins><span class="cx"> 
</span><del>-    const SVGPointListValues& pointList() const { return m_points.value(); }
</del><ins>+    SVGPointList& points() { return m_points->baseVal(); }
+    SVGPointList& animatedPoints() { return *m_points->animVal(); }
</ins><span class="cx"> 
</span><span class="cx">     size_t approximateMemoryCost() const override;
</span><span class="cx"> 
</span><span class="lines">@@ -43,8 +42,6 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGPolyElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</span><del>-    static AttributeOwnerProxy::AttributeRegistry& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
-    static void registerAttributes();
</del><span class="cx">     const SVGAttributeOwnerProxy& attributeOwnerProxy() const final { return m_attributeOwnerProxy; }
</span><span class="cx"> 
</span><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGPolyElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</span><span class="lines">@@ -63,7 +60,7 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedPointListAttribute m_points;
</del><ins>+    Ref<SVGAnimatedPointList> m_points { SVGAnimatedPointList::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGSVGElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGSVGElement.cpp (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGSVGElement.cpp       2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGSVGElement.cpp  2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -171,16 +171,11 @@
</span><span class="cx">         frame->setPageZoomFactor(scale);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref<SVGPoint> SVGSVGElement::currentTranslate()
-{
-    return SVGStaticPropertyTearOff<SVGSVGElement, SVGPoint>::create(*this, m_currentTranslate, &SVGSVGElement::updateCurrentTranslate);
-}
-
</del><span class="cx"> void SVGSVGElement::setCurrentTranslate(const FloatPoint& translation)
</span><span class="cx"> {
</span><del>-    if (m_currentTranslate == translation)
</del><ins>+    if (m_currentTranslate->value() == translation)
</ins><span class="cx">         return;
</span><del>-    m_currentTranslate = translation;
</del><ins>+    m_currentTranslate->setValue(translation);
</ins><span class="cx">     updateCurrentTranslate();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGSVGElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGSVGElement.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGSVGElement.h 2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGSVGElement.h    2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2007, 2010 Rob Buis <buis@kde.org>
</span><del>- * Copyright (C) 2015-2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -61,8 +61,8 @@
</span><span class="cx">     float currentScale() const;
</span><span class="cx">     void setCurrentScale(float);
</span><span class="cx"> 
</span><del>-    Ref<SVGPoint> currentTranslate();
-    FloatPoint currentTranslateValue() { return m_currentTranslate; }
</del><ins>+    SVGPoint& currentTranslate() { return m_currentTranslate; }
+    FloatPoint currentTranslateValue() const { return m_currentTranslate->value(); }
</ins><span class="cx"> 
</span><span class="cx">     unsigned suspendRedraw(unsigned maxWaitMilliseconds);
</span><span class="cx">     void unsuspendRedraw(unsigned suspendHandleId);
</span><span class="lines">@@ -106,7 +106,7 @@
</span><span class="cx">     SMILTimeContainer& timeContainer() { return m_timeContainer.get(); }
</span><span class="cx"> 
</span><span class="cx">     void setCurrentTranslate(const FloatPoint&); // Used to pan.
</span><del>-    void updateCurrentTranslate(); // Used from DOM bindings to create an SVGStaticPropertyTearOff for currentTranslate.
</del><ins>+    void updateCurrentTranslate();
</ins><span class="cx"> 
</span><span class="cx">     bool hasIntrinsicWidth() const;
</span><span class="cx">     bool hasIntrinsicHeight() const;
</span><span class="lines">@@ -169,10 +169,11 @@
</span><span class="cx"> 
</span><span class="cx">     bool m_useCurrentView { false };
</span><span class="cx">     Ref<SMILTimeContainer> m_timeContainer;
</span><del>-    FloatPoint m_currentTranslate;
</del><span class="cx">     RefPtr<SVGViewSpec> m_viewSpec;
</span><span class="cx">     String m_currentViewFragmentIdentifier;
</span><span class="cx"> 
</span><ins>+    Ref<SVGPoint> m_currentTranslate { SVGPoint::create() };
+
</ins><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     SVGAnimatedLengthAttribute m_x { LengthModeWidth };
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGSVGElementidl"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGSVGElement.idl (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGSVGElement.idl       2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGSVGElement.idl  2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -42,7 +42,7 @@
</span><span class="cx">     readonly attribute boolean useCurrentView;
</span><span class="cx">     readonly attribute SVGViewSpec currentView;
</span><span class="cx">     attribute unrestricted float currentScale;
</span><del>-    [NewObject] readonly attribute SVGPoint currentTranslate;
</del><ins>+    readonly attribute SVGPoint currentTranslate;
</ins><span class="cx"> 
</span><span class="cx">     unsigned long suspendRedraw(optional unsigned long maxWaitMilliseconds = 0);
</span><span class="cx">     void unsuspendRedraw(optional unsigned long suspendHandleId = 0);
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGValue.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGValue.h      2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/SVGValue.h 2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -33,7 +33,6 @@
</span><span class="cx"> #include "SVGMarkerTypes.h"
</span><span class="cx"> #include "SVGNumberListValues.h"
</span><span class="cx"> #include "SVGPathByteStream.h"
</span><del>-#include "SVGPointListValues.h"
</del><span class="cx"> #include "SVGPreserveAspectRatioValue.h"
</span><span class="cx"> #include "SVGPropertyTraits.h"
</span><span class="cx"> #include "SVGTransformListValues.h"
</span><span class="lines">@@ -44,21 +43,11 @@
</span><span class="cx"> 
</span><span class="cx"> using SVGValueVariant = Variant<
</span><span class="cx">     std::pair<SVGAngleValue, unsigned>*,
</span><del>-    bool*,
-    Color*,
</del><span class="cx">     unsigned*,
</span><del>-    int*,
-    std::pair<int, int>*,
</del><span class="cx">     SVGLengthValue*,
</span><span class="cx">     SVGLengthListValues*,
</span><del>-    float*,
</del><span class="cx">     SVGNumberListValues*,
</span><del>-    std::pair<float, float>*,
</del><span class="cx">     SVGPathByteStream*,
</span><del>-    SVGPointListValues*,
-    SVGPreserveAspectRatioValue*,
-    FloatRect*,
-    String*,
</del><span class="cx">     SVGTransformListValues*
</span><span class="cx"> >;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAccessorImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h    2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h       2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -99,6 +99,28 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template<typename OwnerType>
</span><ins>+class SVGAnimatedPointListAccessor final : public SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedPointList> {
+    using Base = SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedPointList>;
+    using Base::property;
+
+public:
+    using Base::Base;
+    template<Ref<SVGAnimatedPointList> OwnerType::*property>
+    constexpr static const SVGMemberAccessor<OwnerType>& singleton() { return Base::template singleton<SVGAnimatedPointListAccessor, property>(); }
+
+private:
+    std::unique_ptr<SVGAttributeAnimator> createAnimator(OwnerType& owner, const QualifiedName& attributeName, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive) const final
+    {
+        return SVGAnimatedPointListAnimator::create(attributeName, property(owner), animationMode, calcMode, isAccumulated, isAdditive);
+    }
+
+    void appendAnimatedInstance(OwnerType& owner, SVGAttributeAnimator& animator) const final
+    {
+        static_cast<SVGAnimatedPointListAnimator&>(animator).appendAnimatedInstance(property(owner));
+    }
+};
+    
+template<typename OwnerType>
</ins><span class="cx"> class SVGAnimatedPreserveAspectRatioAccessor final : public SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedPreserveAspectRatio> {
</span><span class="cx">     using Base = SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedPreserveAspectRatio>;
</span><span class="cx">     using Base::property;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAnimatorImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h    2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h       2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -27,6 +27,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include "SVGAnimatedPropertyAnimator.h"
</span><span class="cx"> #include "SVGAnimatedPropertyImpl.h"
</span><ins>+#include "SVGAnimationAdditiveListFunctionImpl.h"
</ins><span class="cx"> #include "SVGAnimationAdditiveValueFunctionImpl.h"
</span><span class="cx"> #include "SVGAnimationDiscreteFunctionImpl.h"
</span><span class="cx"> 
</span><span class="lines">@@ -95,6 +96,23 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class SVGAnimatedPointListAnimator final : public SVGAnimatedPropertyAnimator<SVGAnimatedPointList, SVGAnimationPointListFunction> {
+    using Base = SVGAnimatedPropertyAnimator<SVGAnimatedPointList, SVGAnimationPointListFunction>;
+    using Base::Base;
+    
+public:
+    static auto create(const QualifiedName& attributeName, Ref<SVGAnimatedPointList>& animated, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
+    {
+        return std::unique_ptr<SVGAnimatedPointListAnimator>(new SVGAnimatedPointListAnimator(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive));
+    }
+    
+private:
+    void progress(SVGElement* targetElement, float percentage, unsigned repeatCount) final
+    {
+        m_function.progress(targetElement, percentage, repeatCount, m_animated->animVal());
+    }
+};
+
</ins><span class="cx"> class SVGAnimatedPreserveAspectRatioAnimator final : public SVGAnimatedPropertyAnimator<SVGAnimatedPreserveAspectRatio, SVGAnimationPreserveAspectRatioFunction> {
</span><span class="cx">     using Base = SVGAnimatedPropertyAnimator<SVGAnimatedPreserveAspectRatio, SVGAnimationPreserveAspectRatioFunction>;
</span><span class="cx">     using Base::Base;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h    2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h       2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -30,10 +30,11 @@
</span><span class="cx"> #include "SVGAnimatedLength.h"
</span><span class="cx"> #include "SVGAnimatedLengthList.h"
</span><span class="cx"> #include "SVGAnimatedNumberList.h"
</span><del>-#include "SVGAnimatedPointList.h"
</del><span class="cx"> #include "SVGAnimatedPrimitiveProperty.h"
</span><ins>+#include "SVGAnimatedPropertyList.h"
</ins><span class="cx"> #include "SVGAnimatedTransformList.h"
</span><span class="cx"> #include "SVGAnimatedValueProperty.h"
</span><ins>+#include "SVGPointList.h"
</ins><span class="cx"> #include "SVGPreserveAspectRatio.h"
</span><span class="cx"> #include "SVGRect.h"
</span><span class="cx"> 
</span><span class="lines">@@ -47,4 +48,6 @@
</span><span class="cx"> using SVGAnimatedRect = SVGAnimatedValueProperty<SVGRect>;
</span><span class="cx"> using SVGAnimatedPreserveAspectRatio = SVGAnimatedValueProperty<SVGPreserveAspectRatio>;
</span><span class="cx"> 
</span><ins>+using SVGAnimatedPointList = SVGAnimatedPropertyList<SVGPointList>;
+
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyListh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyList.h (0 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyList.h                            (rev 0)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyList.h       2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -0,0 +1,139 @@
</span><ins>+/*
+ * Copyright (C) 2019 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGAnimatedProperty.h"
+
+namespace WebCore {
+
+template<typename ListType>
+class SVGAnimatedPropertyList : public SVGAnimatedProperty {
+public:
+    template<typename... Arguments>
+    static Ref<SVGAnimatedPropertyList> create(SVGElement* contextElement, Arguments&&... arguments)
+    {
+        return adoptRef(*new SVGAnimatedPropertyList(contextElement, std::forward<Arguments>(arguments)...));
+    }
+
+    ~SVGAnimatedPropertyList()
+    {
+        m_baseVal->detach();
+        if (m_animVal)
+            m_animVal->detach();
+    }
+
+    // Used by the DOM.
+    const Ref<ListType>& baseVal() const { return m_baseVal; }
+
+    // Used by SVGElement::parseAttribute().
+    Ref<ListType>& baseVal() { return m_baseVal; }
+
+    // Used by the DOM.
+    const RefPtr<ListType>& animVal() const { return const_cast<SVGAnimatedPropertyList*>(this)->ensureAnimVal(); }
+
+    // Called by SVGAnimatedPropertyAnimator to pass the animVal to the SVGAnimationFunction::progress.
+    RefPtr<ListType>& animVal() { return ensureAnimVal(); }
+
+    // Used when committing a change from the SVGAnimatedProperty to the attribute.
+    String baseValAsString() const override { return m_baseVal->valueAsString(); }
+
+    // Used to apply the SVGAnimator change to the target element.
+    String animValAsString() const override
+    {
+        ASSERT(isAnimating());
+        return m_animVal->valueAsString();
+    }
+
+    // Managing the relationship with the owner.
+    void setDirty() override { m_baseVal->setDirty(); }
+    bool isDirty() const override { return m_baseVal->isDirty(); }
+    Optional<String> synchronize() override { return m_baseVal->synchronize(); }
+
+    // Used by RenderSVGElements and DumpRenderTree.
+    const ListType& currentValue() const
+    {
+        ASSERT_IMPLIES(isAnimating(), m_animVal);
+        return isAnimating() ? *m_animVal : m_baseVal.get();
+    }
+
+    // Controlling the animation.
+    void startAnimation() override
+    {
+        if (m_animVal)
+            *m_animVal = m_baseVal;
+        else
+            ensureAnimVal();
+        SVGAnimatedProperty::startAnimation();
+    }
+
+    void stopAnimation() override
+    {
+        if (m_animVal)
+            *m_animVal = m_baseVal;
+        SVGAnimatedProperty::stopAnimation();
+    }
+
+    // Controlling the instance animation.
+    void instanceStartAnimation(SVGAnimatedProperty& animated) override
+    {
+        m_animVal = static_cast<SVGAnimatedPropertyList&>(animated).animVal();
+        SVGAnimatedProperty::instanceStartAnimation(animated);
+    }
+
+    void instanceStopAnimation() override
+    {
+        m_animVal = nullptr;
+        SVGAnimatedProperty::instanceStopAnimation();
+    }
+
+protected:
+    template<typename... Arguments>
+    SVGAnimatedPropertyList(SVGElement* contextElement, Arguments&&... arguments)
+        : SVGAnimatedProperty(contextElement)
+        , m_baseVal(ListType::create(this, SVGPropertyAccess::ReadWrite, std::forward<Arguments>(arguments)...))
+    {
+    }
+
+    RefPtr<ListType>& ensureAnimVal()
+    {
+        if (!m_animVal)
+            m_animVal = ListType::create(m_baseVal, SVGPropertyAccess::ReadOnly);
+        return m_animVal;
+    }
+
+    // Called when m_baseVal changes or an item in m_baseVal changes.
+    void commitPropertyChange(SVGProperty* property) override
+    {
+        if (m_animVal)
+            *m_animVal = m_baseVal;
+        SVGAnimatedProperty::commitPropertyChange(property);
+    }
+
+    Ref<ListType> m_baseVal;
+    mutable RefPtr<ListType> m_animVal;
+};
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveListFunctionh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunction.h (0 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunction.h                           (rev 0)
+++ trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunction.h      2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -0,0 +1,70 @@
</span><ins>+/*
+ * Copyright (C) 2019 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGAnimationAdditiveFunction.h"
+
+namespace WebCore {
+
+template<typename ListType>
+class SVGAnimationAdditiveListFunction : public SVGAnimationAdditiveFunction {
+public:
+    template<typename... Arguments>
+    SVGAnimationAdditiveListFunction(AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive, Arguments&&... arguments)
+        : SVGAnimationAdditiveFunction(animationMode, calcMode, isAccumulated, isAdditive)
+        , m_from(ListType::create(std::forward<Arguments>(arguments)...))
+        , m_to(ListType::create(std::forward<Arguments>(arguments)...))
+        , m_toAtEndOfDuration(ListType::create(std::forward<Arguments>(arguments)...))
+    {
+    }
+
+protected:
+    const Ref<ListType>& toAtEndOfDuration() const { return !m_toAtEndOfDuration->isEmpty() ? m_toAtEndOfDuration : m_to; }
+
+    bool adjustAnimatedList(AnimationMode animationMode, float percentage, RefPtr<ListType>& animated, bool resizeAnimatedIfNeeded = true)
+    {
+        if (!m_to->numberOfItems())
+            return false;
+
+        if (m_from->numberOfItems() && m_from->size() != m_to->size()) {
+            if (percentage >= 0.5)
+                *animated = m_to;
+            else if (animationMode != AnimationMode::To)
+                *animated = m_from;
+            return false;
+        }
+
+        if (resizeAnimatedIfNeeded && animated->size() < m_to->size())
+            animated->resize(m_to->size());
+        return true;
+    }
+
+    Ref<ListType> m_from;
+    Ref<ListType> m_to;
+    Ref<ListType> m_toAtEndOfDuration;
+};
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveListFunctionImplh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunctionImpl.h (0 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunctionImpl.h                               (rev 0)
+++ trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunctionImpl.h  2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -0,0 +1,88 @@
</span><ins>+/*
+ * Copyright (C) 2019 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGAnimationAdditiveListFunction.h"
+#include "SVGPointList.h"
+
+namespace WebCore {
+
+class SVGElement;
+
+class SVGAnimationPointListFunction : public SVGAnimationAdditiveListFunction<SVGPointList> {
+public:
+    using Base = SVGAnimationAdditiveListFunction<SVGPointList>;
+    using Base::Base;
+
+    void setFromAndToValues(SVGElement*, const String& from, const String& to) override
+    {
+        m_from->parse(from);
+        m_to->parse(to);
+    }
+
+    void setToAtEndOfDurationValue(const String& toAtEndOfDuration) override
+    {
+        m_toAtEndOfDuration->parse(toAtEndOfDuration);
+    }
+
+    void progress(SVGElement*, float percentage, unsigned repeatCount, RefPtr<SVGPointList>& animated)
+    {
+        if (!adjustAnimatedList(m_animationMode, percentage, animated))
+            return;
+
+        const Vector<Ref<SVGPoint>>& fromItems = m_animationMode == AnimationMode::To ? animated->items() : m_from->items();
+        const Vector<Ref<SVGPoint>>& toItems = m_to->items();
+        const Vector<Ref<SVGPoint>>& toAtEndOfDurationItems = toAtEndOfDuration()->items();
+        Vector<Ref<SVGPoint>>& animatedItems = animated->items();
+
+        for (unsigned i = 0; i < toItems.size(); ++i) {
+            FloatPoint from = i < fromItems.size() ? fromItems[i]->value() : FloatPoint();
+            FloatPoint to = toItems[i]->value();
+            FloatPoint toAtEndOfDuration = i < toAtEndOfDurationItems.size() ? toAtEndOfDurationItems[i]->value() : FloatPoint();
+            FloatPoint& animated = animatedItems[i]->value();
+
+            float animatedX = Base::progress(percentage, repeatCount, from.x(), to.x(), toAtEndOfDuration.x(), animated.x());
+            float animatedY = Base::progress(percentage, repeatCount, from.y(), to.y(), toAtEndOfDuration.y(), animated.y());
+
+            animated = { animatedX, animatedY };
+        }
+    }
+
+private:
+    void addFromAndToValues(SVGElement*) override
+    {
+        const Vector<Ref<SVGPoint>>& fromItems = m_from->items();
+        Vector<Ref<SVGPoint>>& toItems = m_to->items();
+
+        if (!fromItems.size() || fromItems.size() != toItems.size())
+            return;
+
+        for (unsigned i = 0; i < fromItems.size(); ++i)
+            toItems[i]->setValue(fromItems[i]->value() + toItems[i]->value());
+    }
+};
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAttributeRegistryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h       2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h  2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -29,7 +29,6 @@
</span><span class="cx"> #include "SVGAnimatedLength.h"
</span><span class="cx"> #include "SVGAnimatedLengthList.h"
</span><span class="cx"> #include "SVGAnimatedNumberList.h"
</span><del>-#include "SVGAnimatedPointList.h"
</del><span class="cx"> #include "SVGAnimatedTransformList.h"
</span><span class="cx"> #include "SVGAttributeAccessor.h"
</span><span class="cx"> #include "SVGLegacyAnimatedProperty.h"
</span><span class="lines">@@ -78,12 +77,6 @@
</span><span class="cx">         registerAttribute(SVGAnimatedNumberListAttributeAccessor<OwnerType>::template singleton<attributeName, attribute>());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, SVGAnimatedPointListAttribute OwnerType::*attribute>
-    void registerAttribute()
-    {
-        registerAttribute(SVGAnimatedPointListAttributeAccessor<OwnerType>::template singleton<attributeName, attribute>());
-    }
-
</del><span class="cx">     template<const LazyNeverDestroyed<const QualifiedName>& attributeName, SVGAnimatedTransformListAttribute OwnerType::*attribute>
</span><span class="cx">     void registerAttribute()
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGPropertyListh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/svg/properties/SVGPropertyList.h (0 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGPropertyList.h                            (rev 0)
+++ trunk/Source/WebCore/svg/properties/SVGPropertyList.h       2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -0,0 +1,137 @@
</span><ins>+/*
+ * Copyright (C) 2018-2019 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGList.h"
+
+namespace WebCore {
+
+template<typename PropertyType>
+class SVGPropertyList : public SVGList<Ref<PropertyType>>, public SVGPropertyOwner {
+public:
+    using BaseList = SVGList<Ref<PropertyType>>;
+    using BaseList::isEmpty;
+    using BaseList::size;
+    using BaseList::append;
+
+protected:
+    using SVGPropertyOwner::SVGPropertyOwner;
+    using BaseList::m_items;
+    using BaseList::m_access;
+    using BaseList::m_owner;
+
+    SVGPropertyList(SVGPropertyOwner* owner = nullptr, SVGPropertyAccess access = SVGPropertyAccess::ReadWrite)
+        : BaseList(owner, access)
+    {
+    }
+
+    ~SVGPropertyList()
+    {
+        // Detach the items from the list before it is deleted.
+        detachItems();
+    }
+
+    void detachItems() override
+    {
+        for (auto& item : m_items)
+            item->detach();
+    }
+
+    SVGPropertyOwner* owner() const override { return m_owner; }
+
+    void commitPropertyChange(SVGProperty*) override
+    {
+        if (owner())
+            owner()->commitPropertyChange(this);
+    }
+
+    Ref<PropertyType> at(unsigned index) const override
+    {
+        ASSERT(index < size());
+        return m_items.at(index).copyRef();
+    }
+
+    Ref<PropertyType> insert(unsigned index, Ref<PropertyType>&& newItem) override
+    {
+        ASSERT(index <= size());
+
+        // Spec: if newItem is not a detached object, then set newItem to be
+        // a clone object of newItem.
+        if (newItem->isAttached())
+            newItem = newItem->clone();
+
+        // Spec: Attach newItem to the list object.
+        newItem->attach(this, m_access);
+        m_items.insert(index, WTFMove(newItem));
+        return at(index);
+    }
+
+    Ref<PropertyType> replace(unsigned index, Ref<PropertyType>&& newItem) override
+    {
+        ASSERT(index < size());
+        Ref<PropertyType>& item = m_items[index];
+
+        // Spec: Detach item.
+        item->detach();
+
+        // Spec: if newItem is not a detached object, then set newItem to be
+        // a clone object of newItem.
+        if (newItem->isAttached())
+            item = newItem->clone();
+        else
+            item = WTFMove(newItem);
+
+        // Spec: Attach newItem to the list object.
+        item->attach(this, m_access);
+        return at(index);
+    }
+
+    Ref<PropertyType> remove(unsigned index) override
+    {
+        ASSERT(index < size());
+        Ref<PropertyType> item = at(index);
+
+        // Spec: Detach item.
+        item->detach();
+        m_items.remove(index);
+        return WTFMove(item);
+    }
+
+    Ref<PropertyType> append(Ref<PropertyType>&& newItem) override
+    {
+        // Spec: if newItem is not a detached object, then set newItem to be
+        // a clone object of newItem.
+        if (newItem->isAttached())
+            newItem = newItem->clone();
+
+        // Spec: Attach newItem to the list object.
+        newItem->attach(this, m_access);
+        m_items.append(WTFMove(newItem));
+        return at(size() - 1);
+    }
+};
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGPropertyOwnerRegistryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h (243335 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h   2019-03-21 22:04:56 UTC (rev 243335)
+++ trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h      2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -67,6 +67,12 @@
</span><span class="cx">         registerProperty(attributeName, SVGAnimatedNumberAccessor<OwnerType>::template singleton<property>());
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedPointList> OwnerType::*property>
+    static void registerProperty()
+    {
+        registerProperty(attributeName, SVGAnimatedPointListAccessor<OwnerType>::template singleton<property>());
+    }
+
</ins><span class="cx">     template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedPreserveAspectRatio> OwnerType::*property>
</span><span class="cx">     static void registerProperty()
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGValuePropertyListh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/svg/properties/SVGValuePropertyList.h (0 => 243336)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGValuePropertyList.h                               (rev 0)
+++ trunk/Source/WebCore/svg/properties/SVGValuePropertyList.h  2019-03-21 22:21:58 UTC (rev 243336)
</span><span class="lines">@@ -0,0 +1,89 @@
</span><ins>+/*
+ * Copyright (C) 2018-2019 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGPropertyList.h"
+
+namespace WebCore {
+
+template<typename PropertyType>
+class SVGValuePropertyList : public SVGPropertyList<PropertyType> {
+public:
+    using Base = SVGPropertyList<PropertyType>;
+    using Base::clearItems;
+    using Base::items;
+    using Base::size;
+
+    SVGValuePropertyList& operator=(const SVGValuePropertyList& other)
+    {
+        clearItems();
+        for (const auto& item : other.items())
+            append(PropertyType::create(item->value()));
+        return *this;
+    }
+
+    // This casting operator returns a Vector of the underlying ValueType,
+    // for example Vector<float> from SVGNumberList.
+    operator Vector<typename PropertyType::ValueType>() const
+    {
+        Vector<typename PropertyType::ValueType> values;
+        for (const auto& item : items())
+            values.append(item->value());
+        return values;
+    }
+
+    void resize(size_t newSize)
+    {
+        // Add new items.
+        while (size() < newSize)
+            append(PropertyType::create());
+
+        // Remove existing items.
+        while (size() > newSize)
+            remove(size() - 1);
+    }
+
+protected:
+    using Base::append;
+    using Base::remove;
+
+    // Base and default constructor. Do not use "using Base::Base" because of Windows and GTK ports.
+    SVGValuePropertyList(SVGPropertyOwner* owner = nullptr, SVGPropertyAccess access = SVGPropertyAccess::ReadWrite)
+        : Base(owner, access)
+    {
+    }
+
+    // Used by SVGAnimatedPropertyList when creating it animVal from baseVal.
+    SVGValuePropertyList(const SVGValuePropertyList& other, SVGPropertyAccess access = SVGPropertyAccess::ReadWrite)
+        : Base(other.owner(), access)
+    {
+        // Clone all items.
+        for (const auto& item : other.items())
+            append(PropertyType::create(item->value()));
+    }
+};
+
+}
</ins></span></pre>
</div>
</div>

</body>
</html>