<!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>[243266] trunk/Source/WebCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/243266">243266</a></dd>
<dt>Author</dt> <dd>said@apple.com</dd>
<dt>Date</dt> <dd>2019-03-20 17:35:50 -0700 (Wed, 20 Mar 2019)</dd>
</dl>

<h3>Log Message</h3>
<pre>DumpRenderTree crashes under WebAnimation::isRelevant when running imported/mozilla/css-transitions/test_document-get-animations.html in GuardMalloc
https://bugs.webkit.org/show_bug.cgi?id=196028
<rdar://problem/46842707>

Patch by Antoine Quint <graouts@apple.com> on 2019-03-20
Reviewed by Dean Jackson.

Instead of keeping a ListHashSet of raw pointers, we are now using a Vector of WeakPtrs.

* animation/AnimationTimeline.cpp:
(WebCore::AnimationTimeline::forgetAnimation):
(WebCore::AnimationTimeline::animationTimingDidChange):
(WebCore::AnimationTimeline::cancelDeclarativeAnimation):
* animation/AnimationTimeline.h:
* animation/DocumentTimeline.cpp:
(WebCore::DocumentTimeline::getAnimations const):</pre>

<h3>Modified Paths</h3>
<ul>
<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="#trunkSourceWebCoresvgSVGAnimatedLengthcpp">trunk/Source/WebCore/svg/SVGAnimatedLength.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedLengthListcpp">trunk/Source/WebCore/svg/SVGAnimatedLengthList.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedNumberListcpp">trunk/Source/WebCore/svg/SVGAnimatedNumberList.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedTransformListcpp">trunk/Source/WebCore/svg/SVGAnimatedTransformList.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatorFactoryh">trunk/Source/WebCore/svg/SVGAnimatorFactory.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGComponentTransferFunctionElementcpp">trunk/Source/WebCore/svg/SVGComponentTransferFunctionElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGComponentTransferFunctionElementh">trunk/Source/WebCore/svg/SVGComponentTransferFunctionElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFECompositeElementcpp">trunk/Source/WebCore/svg/SVGFECompositeElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFECompositeElementh">trunk/Source/WebCore/svg/SVGFECompositeElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEConvolveMatrixElementcpp">trunk/Source/WebCore/svg/SVGFEConvolveMatrixElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEConvolveMatrixElementh">trunk/Source/WebCore/svg/SVGFEConvolveMatrixElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEDiffuseLightingElementcpp">trunk/Source/WebCore/svg/SVGFEDiffuseLightingElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEDiffuseLightingElementh">trunk/Source/WebCore/svg/SVGFEDiffuseLightingElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEDisplacementMapElementcpp">trunk/Source/WebCore/svg/SVGFEDisplacementMapElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEDisplacementMapElementh">trunk/Source/WebCore/svg/SVGFEDisplacementMapElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEDropShadowElementcpp">trunk/Source/WebCore/svg/SVGFEDropShadowElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEDropShadowElementh">trunk/Source/WebCore/svg/SVGFEDropShadowElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEGaussianBlurElementcpp">trunk/Source/WebCore/svg/SVGFEGaussianBlurElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEGaussianBlurElementh">trunk/Source/WebCore/svg/SVGFEGaussianBlurElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFELightElementcpp">trunk/Source/WebCore/svg/SVGFELightElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFELightElementh">trunk/Source/WebCore/svg/SVGFELightElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEMorphologyElementcpp">trunk/Source/WebCore/svg/SVGFEMorphologyElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEMorphologyElementh">trunk/Source/WebCore/svg/SVGFEMorphologyElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEOffsetElementcpp">trunk/Source/WebCore/svg/SVGFEOffsetElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFEOffsetElementh">trunk/Source/WebCore/svg/SVGFEOffsetElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFESpecularLightingElementcpp">trunk/Source/WebCore/svg/SVGFESpecularLightingElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFESpecularLightingElementh">trunk/Source/WebCore/svg/SVGFESpecularLightingElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFETurbulenceElementcpp">trunk/Source/WebCore/svg/SVGFETurbulenceElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFETurbulenceElementh">trunk/Source/WebCore/svg/SVGFETurbulenceElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGGeometryElementcpp">trunk/Source/WebCore/svg/SVGGeometryElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGGeometryElementh">trunk/Source/WebCore/svg/SVGGeometryElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPathElementh">trunk/Source/WebCore/svg/SVGPathElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPathSegListValuescpp">trunk/Source/WebCore/svg/SVGPathSegListValues.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGStopElementcpp">trunk/Source/WebCore/svg/SVGStopElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGStopElementh">trunk/Source/WebCore/svg/SVGStopElement.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="#trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyPairAccessorImplh">trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyPairAccessorImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyPairAnimatorImplh">trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyPairAnimatorImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveValueFunctionImplh">trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveValueFunctionImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAttributeRegistryh">trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGPrimitivePropertyAnimatorImplh">trunk/Source/WebCore/svg/properties/SVGPrimitivePropertyAnimatorImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGPropertyAnimatorFactoryh">trunk/Source/WebCore/svg/properties/SVGPropertyAnimatorFactory.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGPropertyOwnerRegistryh">trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedNumbercpp">trunk/Source/WebCore/svg/SVGAnimatedNumber.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedNumberh">trunk/Source/WebCore/svg/SVGAnimatedNumber.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedNumberOptionalNumbercpp">trunk/Source/WebCore/svg/SVGAnimatedNumberOptionalNumber.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedNumberOptionalNumberh">trunk/Source/WebCore/svg/SVGAnimatedNumberOptionalNumber.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/ChangeLog      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -18,6 +18,189 @@
</span><span class="cx"> 
</span><span class="cx"> 2019-03-20  Said Abou-Hallawa  <sabouhallawa@apple.com>
</span><span class="cx"> 
</span><ins>+        Remove the SVG property tear off objects for SVGAnimatedNumber
+        https://bugs.webkit.org/show_bug.cgi?id=196037
+
+        Reviewed by Simon Fraser.
+
+        -- Define SVGAnimatedNumber to be SVGAnimatedPrimitiveProperty<float>.
+
+        -- Add SVGAnimatedNumberAccessor to associate an attribute name with a 
+           pointer to an SVGAnimatedNumber. Given a pointer to an SVGElement,
+           this accessor will and create an animator for the animated property.
+
+        -- Add SVGAnimatedNumberPairAccessor to associate an attribute name
+           with a pair of pointers to SVGAnimatedNumbers. Given a pointer to an
+           SVGElement, this accessor will and create an animator for these
+           animated properties.
+
+        -- Add SVGAnimatedNumberAnimator to animated an SVGAnimatedNumber.
+
+        -- Add SVGAnimatedNumberPairAnimator to animated a pair of SVGAnimatedNumbers.
+
+        -- Add SVGAnimationNumberFunction which will be responsible for progressing
+           a float over a period of time.
+
+        -- Define SVGNumberAnimator to be SVGPrimitivePropertyAnimator<float,
+           SVGAnimationNumberFunction>. SVGNumberAnimator will be responsible 
+           for animating attributes with no reflecting animated properties, e.g.
+           "fill-opacity".
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * svg/SVGAnimatedLength.cpp:
+        * svg/SVGAnimatedLengthList.cpp:
+        * svg/SVGAnimatedNumber.cpp: Removed.
+        * svg/SVGAnimatedNumber.h: Removed.
+        * svg/SVGAnimatedNumberList.cpp:
+        * svg/SVGAnimatedNumberOptionalNumber.cpp: Removed.
+        * svg/SVGAnimatedNumberOptionalNumber.h: Removed.
+        * svg/SVGAnimatedTransformList.cpp:
+        * svg/SVGAnimatorFactory.h:
+        (WebCore::SVGAnimatorFactory::create):
+        * svg/SVGComponentTransferFunctionElement.cpp:
+        (WebCore::SVGComponentTransferFunctionElement::SVGComponentTransferFunctionElement):
+        (WebCore::SVGComponentTransferFunctionElement::registerAttributes):
+        (WebCore::SVGComponentTransferFunctionElement::parseAttribute):
+        * svg/SVGComponentTransferFunctionElement.h:
+        (WebCore::SVGComponentTransferFunctionElement::slope const):
+        (WebCore::SVGComponentTransferFunctionElement::intercept const):
+        (WebCore::SVGComponentTransferFunctionElement::amplitude const):
+        (WebCore::SVGComponentTransferFunctionElement::exponent const):
+        (WebCore::SVGComponentTransferFunctionElement::offset const):
+        (WebCore::SVGComponentTransferFunctionElement::slopeAnimated):
+        (WebCore::SVGComponentTransferFunctionElement::interceptAnimated):
+        (WebCore::SVGComponentTransferFunctionElement::amplitudeAnimated):
+        (WebCore::SVGComponentTransferFunctionElement::exponentAnimated):
+        (WebCore::SVGComponentTransferFunctionElement::offsetAnimated):
+        * svg/SVGFECompositeElement.cpp:
+        (WebCore::SVGFECompositeElement::SVGFECompositeElement):
+        (WebCore::SVGFECompositeElement::registerAttributes):
+        (WebCore::SVGFECompositeElement::parseAttribute):
+        * svg/SVGFECompositeElement.h:
+        * svg/SVGFEConvolveMatrixElement.cpp:
+        (WebCore::SVGFEConvolveMatrixElement::SVGFEConvolveMatrixElement):
+        (WebCore::SVGFEConvolveMatrixElement::registerAttributes):
+        (WebCore::SVGFEConvolveMatrixElement::parseAttribute):
+        (WebCore::SVGFEConvolveMatrixElement::setKernelUnitLength):
+        (WebCore::SVGFEConvolveMatrixElement::kernelUnitLengthXIdentifier): Deleted.
+        (WebCore::SVGFEConvolveMatrixElement::kernelUnitLengthYIdentifier): Deleted.
+        * svg/SVGFEConvolveMatrixElement.h:
+        * svg/SVGFEDiffuseLightingElement.cpp:
+        (WebCore::SVGFEDiffuseLightingElement::SVGFEDiffuseLightingElement):
+        (WebCore::SVGFEDiffuseLightingElement::registerAttributes):
+        (WebCore::SVGFEDiffuseLightingElement::parseAttribute):
+        (WebCore::SVGFEDiffuseLightingElement::kernelUnitLengthXIdentifier): Deleted.
+        (WebCore::SVGFEDiffuseLightingElement::kernelUnitLengthYIdentifier): Deleted.
+        * svg/SVGFEDiffuseLightingElement.h:
+        * svg/SVGFEDisplacementMapElement.cpp:
+        (WebCore::SVGFEDisplacementMapElement::SVGFEDisplacementMapElement):
+        (WebCore::SVGFEDisplacementMapElement::registerAttributes):
+        (WebCore::SVGFEDisplacementMapElement::parseAttribute):
+        * svg/SVGFEDisplacementMapElement.h:
+        * svg/SVGFEDropShadowElement.cpp:
+        (WebCore::SVGFEDropShadowElement::SVGFEDropShadowElement):
+        (WebCore::SVGFEDropShadowElement::setStdDeviation):
+        (WebCore::SVGFEDropShadowElement::registerAttributes):
+        (WebCore::SVGFEDropShadowElement::parseAttribute):
+        (WebCore::SVGFEDropShadowElement::stdDeviationXIdentifier): Deleted.
+        (WebCore::SVGFEDropShadowElement::stdDeviationYIdentifier): Deleted.
+        * svg/SVGFEDropShadowElement.h:
+        * svg/SVGFEGaussianBlurElement.cpp:
+        (WebCore::SVGFEGaussianBlurElement::SVGFEGaussianBlurElement):
+        (WebCore::SVGFEGaussianBlurElement::setStdDeviation):
+        (WebCore::SVGFEGaussianBlurElement::registerAttributes):
+        (WebCore::SVGFEGaussianBlurElement::parseAttribute):
+        (WebCore::SVGFEGaussianBlurElement::stdDeviationXIdentifier): Deleted.
+        (WebCore::SVGFEGaussianBlurElement::stdDeviationYIdentifier): Deleted.
+        * svg/SVGFEGaussianBlurElement.h:
+        * svg/SVGFELightElement.cpp:
+        (WebCore::SVGFELightElement::SVGFELightElement):
+        (WebCore::SVGFELightElement::parseAttribute):
+        (WebCore::SVGFELightElement::svgAttributeChanged):
+        (WebCore::SVGFELightElement::registerAttributes): Deleted.
+        * svg/SVGFELightElement.h:
+        (WebCore::SVGFELightElement::azimuth const):
+        (WebCore::SVGFELightElement::elevation const):
+        (WebCore::SVGFELightElement::x const):
+        (WebCore::SVGFELightElement::y const):
+        (WebCore::SVGFELightElement::z const):
+        (WebCore::SVGFELightElement::pointsAtX const):
+        (WebCore::SVGFELightElement::pointsAtY const):
+        (WebCore::SVGFELightElement::pointsAtZ const):
+        (WebCore::SVGFELightElement::specularExponent const):
+        (WebCore::SVGFELightElement::limitingConeAngle const):
+        (WebCore::SVGFELightElement::azimuthAnimated):
+        (WebCore::SVGFELightElement::elevationAnimated):
+        (WebCore::SVGFELightElement::xAnimated):
+        (WebCore::SVGFELightElement::yAnimated):
+        (WebCore::SVGFELightElement::zAnimated):
+        (WebCore::SVGFELightElement::pointsAtXAnimated):
+        (WebCore::SVGFELightElement::pointsAtYAnimated):
+        (WebCore::SVGFELightElement::pointsAtZAnimated):
+        (WebCore::SVGFELightElement::specularExponentAnimated):
+        (WebCore::SVGFELightElement::limitingConeAngleAnimated):
+        (WebCore::SVGFELightElement::attributeRegistry): Deleted.
+        (WebCore::SVGFELightElement::isKnownAttribute): Deleted.
+        * svg/SVGFEMorphologyElement.cpp:
+        (WebCore::SVGFEMorphologyElement::SVGFEMorphologyElement):
+        (WebCore::SVGFEMorphologyElement::setRadius):
+        (WebCore::SVGFEMorphologyElement::registerAttributes):
+        (WebCore::SVGFEMorphologyElement::parseAttribute):
+        (WebCore::SVGFEMorphologyElement::radiusXIdentifier): Deleted.
+        (WebCore::SVGFEMorphologyElement::radiusYIdentifier): Deleted.
+        * svg/SVGFEMorphologyElement.h:
+        * svg/SVGFEOffsetElement.cpp:
+        (WebCore::SVGFEOffsetElement::SVGFEOffsetElement):
+        (WebCore::SVGFEOffsetElement::registerAttributes):
+        (WebCore::SVGFEOffsetElement::parseAttribute):
+        * svg/SVGFEOffsetElement.h:
+        * svg/SVGFESpecularLightingElement.cpp:
+        (WebCore::SVGFESpecularLightingElement::SVGFESpecularLightingElement):
+        (WebCore::SVGFESpecularLightingElement::registerAttributes):
+        (WebCore::SVGFESpecularLightingElement::parseAttribute):
+        (WebCore::SVGFESpecularLightingElement::kernelUnitLengthXIdentifier): Deleted.
+        (WebCore::SVGFESpecularLightingElement::kernelUnitLengthYIdentifier): Deleted.
+        * svg/SVGFESpecularLightingElement.h:
+        * svg/SVGFETurbulenceElement.cpp:
+        (WebCore::SVGFETurbulenceElement::SVGFETurbulenceElement):
+        (WebCore::SVGFETurbulenceElement::registerAttributes):
+        (WebCore::SVGFETurbulenceElement::parseAttribute):
+        (WebCore::SVGFETurbulenceElement::baseFrequencyXIdentifier): Deleted.
+        (WebCore::SVGFETurbulenceElement::baseFrequencyYIdentifier): Deleted.
+        * svg/SVGFETurbulenceElement.h:
+        * svg/SVGGeometryElement.cpp:
+        (WebCore::SVGGeometryElement::SVGGeometryElement):
+        (WebCore::SVGGeometryElement::parseAttribute):
+        (WebCore::SVGGeometryElement::registerAttributes): Deleted.
+        * svg/SVGGeometryElement.h:
+        (WebCore::SVGGeometryElement::pathLength const):
+        (WebCore::SVGGeometryElement::pathLengthAnimated):
+        (WebCore::SVGGeometryElement::attributeRegistry): Deleted.
+        (WebCore::SVGGeometryElement::isKnownAttribute): Deleted.
+        * svg/SVGPathElement.h:
+        * svg/SVGStopElement.cpp:
+        (WebCore::SVGStopElement::SVGStopElement):
+        (WebCore::SVGStopElement::parseAttribute):
+        (WebCore::SVGStopElement::registerAttributes): Deleted.
+        * svg/SVGStopElement.h:
+        * svg/properties/SVGAnimatedPropertyAccessorImpl.h:
+        * svg/properties/SVGAnimatedPropertyAnimatorImpl.h:
+        * svg/properties/SVGAnimatedPropertyImpl.h:
+        * svg/properties/SVGAnimatedPropertyPairAccessorImpl.h:
+        * svg/properties/SVGAnimatedPropertyPairAnimatorImpl.h:
+        * svg/properties/SVGAnimationAdditiveValueFunctionImpl.h:
+        (WebCore::SVGAnimationNumberFunction::progress):
+        * svg/properties/SVGAttributeRegistry.h:
+        * svg/properties/SVGPrimitivePropertyAnimatorImpl.h:
+        * svg/properties/SVGPropertyAnimatorCreator.h:
+        (WebCore::SVGPropertyAnimatorCreator::createNumberAnimator):
+        (WebCore::SVGPropertyAnimatorCreator::attributeAnimatorCreator):
+        * svg/properties/SVGPropertyOwnerRegistry.h:
+        (WebCore::SVGPropertyOwnerRegistry::registerProperty):
+
+2019-03-20  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
</ins><span class="cx">         Remove the SVG tear off objects for SVGColorAnimator
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=196025
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreSourcestxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Sources.txt (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Sources.txt 2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/Sources.txt    2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -2273,9 +2273,7 @@
</span><span class="cx"> svg/SVGAnimatedEnumeration.cpp
</span><span class="cx"> svg/SVGAnimatedLength.cpp
</span><span class="cx"> svg/SVGAnimatedLengthList.cpp
</span><del>-svg/SVGAnimatedNumber.cpp
</del><span class="cx"> svg/SVGAnimatedNumberList.cpp
</span><del>-svg/SVGAnimatedNumberOptionalNumber.cpp
</del><span class="cx"> svg/SVGAnimatedPath.cpp
</span><span class="cx"> svg/SVGAnimatedPointList.cpp
</span><span class="cx"> svg/SVGAnimatedString.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -280,7 +280,6 @@
</span><span class="cx">          089582560E857A7E00F82C83 /* ImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 089582540E857A7E00F82C83 /* ImageLoader.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          089A8E07128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h in Headers */ = {isa = PBXBuildFile; fileRef = 089A8E06128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h */; };
</span><span class="cx">          08A484780E5272C500C3FE76 /* ScriptElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 08A484760E5272C500C3FE76 /* ScriptElement.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><del>-               08B35B13127B6A7C005314DD /* SVGAnimatedNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 08B35B12127B6A7C005314DD /* SVGAnimatedNumber.h */; };
</del><span class="cx">           08B35B17127B6A88005314DD /* SVGAnimatedNumberList.h in Headers */ = {isa = PBXBuildFile; fileRef = 08B35B16127B6A88005314DD /* SVGAnimatedNumberList.h */; };
</span><span class="cx">          08C7A2C710DC7462002D368B /* SVGNames.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 656581E909D1508D000E61D7 /* SVGNames.h */; };
</span><span class="cx">          08C9251A0FCC7C4A00480DEC /* FilterEffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 08C925180FCC7C4A00480DEC /* FilterEffect.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -1175,7 +1174,6 @@
</span><span class="cx">          427DA71D13735DFA007C57FB /* JSServiceWorkerInternals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 427DA71B13735DFA007C57FB /* JSServiceWorkerInternals.cpp */; };
</span><span class="cx">          427DA71E13735DFA007C57FB /* JSServiceWorkerInternals.h in Headers */ = {isa = PBXBuildFile; fileRef = 427DA71C13735DFA007C57FB /* JSServiceWorkerInternals.h */; };
</span><span class="cx">          43107BE218CC19DE00CC18E8 /* SelectorPseudoTypeMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 43107BE118CC19DE00CC18E8 /* SelectorPseudoTypeMap.h */; };
</span><del>-               431A2F9C13B6F2B0007791E4 /* SVGAnimatedNumberOptionalNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 431A2F9A13B6F2B0007791E4 /* SVGAnimatedNumberOptionalNumber.h */; };
</del><span class="cx">           432D3FE818A8658400D7DC03 /* SelectorCheckerTestFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 432D3FE718A8658400D7DC03 /* SelectorCheckerTestFunctions.h */; };
</span><span class="cx">          4358E87D1360A2EE00E4748C /* JSSVGFEDropShadowElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 4358E87B1360A2EE00E4748C /* JSSVGFEDropShadowElement.h */; };
</span><span class="cx">          4358E8811360A31700E4748C /* FEDropShadow.h in Headers */ = {isa = PBXBuildFile; fileRef = 4358E87F1360A31700E4748C /* FEDropShadow.h */; };
</span><span class="lines">@@ -5659,7 +5657,6 @@
</span><span class="cx">          089A8E06128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPathSegListPropertyTearOff.h; sourceTree = "<group>"; };
</span><span class="cx">          08A484750E5272C500C3FE76 /* ScriptElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptElement.cpp; sourceTree = "<group>"; };
</span><span class="cx">          08A484760E5272C500C3FE76 /* ScriptElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptElement.h; sourceTree = "<group>"; };
</span><del>-               08B35B12127B6A7C005314DD /* SVGAnimatedNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedNumber.h; sourceTree = "<group>"; };
</del><span class="cx">           08B35B16127B6A88005314DD /* SVGAnimatedNumberList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedNumberList.h; sourceTree = "<group>"; };
</span><span class="cx">          08C925170FCC7C4A00480DEC /* FilterEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FilterEffect.cpp; sourceTree = "<group>"; };
</span><span class="cx">          08C925180FCC7C4A00480DEC /* FilterEffect.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FilterEffect.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -7573,8 +7570,6 @@
</span><span class="cx">          427DA71B13735DFA007C57FB /* JSServiceWorkerInternals.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSServiceWorkerInternals.cpp; sourceTree = "<group>"; };
</span><span class="cx">          427DA71C13735DFA007C57FB /* JSServiceWorkerInternals.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSServiceWorkerInternals.h; sourceTree = "<group>"; };
</span><span class="cx">          43107BE118CC19DE00CC18E8 /* SelectorPseudoTypeMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectorPseudoTypeMap.h; sourceTree = "<group>"; };
</span><del>-               431A2F9A13B6F2B0007791E4 /* SVGAnimatedNumberOptionalNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedNumberOptionalNumber.h; sourceTree = "<group>"; };
-               431A2F9B13B6F2B0007791E4 /* SVGAnimatedNumberOptionalNumber.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedNumberOptionalNumber.cpp; sourceTree = "<group>"; };
</del><span class="cx">           431A2FD613B7707A007791E4 /* SVGAnimatedLengthList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedLengthList.cpp; sourceTree = "<group>"; };
</span><span class="cx">          432D3FE718A8658400D7DC03 /* SelectorCheckerTestFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectorCheckerTestFunctions.h; sourceTree = "<group>"; };
</span><span class="cx">          4331AC7713B6870000A9E5AE /* SVGAnimatedNumberList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedNumberList.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -7669,7 +7664,6 @@
</span><span class="cx">          439D334013A6911C00C20F4F /* SVGAnimatedType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedType.h; sourceTree = "<group>"; };
</span><span class="cx">          439D334113A6911C00C20F4F /* SVGAnimatedTypeAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedTypeAnimator.h; sourceTree = "<group>"; };
</span><span class="cx">          439D334213A6911C00C20F4F /* SVGAnimatorFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatorFactory.h; sourceTree = "<group>"; };
</span><del>-               43A0F0B013AC7D6D00A5F0A7 /* SVGAnimatedNumber.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedNumber.cpp; sourceTree = "<group>"; };
</del><span class="cx">           43A6266613B3D11000AC94B8 /* SVGAnimatedString.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedString.cpp; sourceTree = "<group>"; };
</span><span class="cx">          43B85ED018CBEACE00E31AF4 /* makeSelectorPseudoClassAndCompatibilityElementMap.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = makeSelectorPseudoClassAndCompatibilityElementMap.py; sourceTree = "<group>"; };
</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="lines">@@ -24146,14 +24140,10 @@
</span><span class="cx">                          431A2FD613B7707A007791E4 /* SVGAnimatedLengthList.cpp */,
</span><span class="cx">                          089021AC126EF5E90092D5EA /* SVGAnimatedLengthList.h */,
</span><span class="cx">                          B22277EB0D00BF1F0071B782 /* SVGAnimatedLengthList.idl */,
</span><del>-                               43A0F0B013AC7D6D00A5F0A7 /* SVGAnimatedNumber.cpp */,
-                               08B35B12127B6A7C005314DD /* SVGAnimatedNumber.h */,
</del><span class="cx">                           B22277EC0D00BF1F0071B782 /* SVGAnimatedNumber.idl */,
</span><span class="cx">                          4331AC7713B6870000A9E5AE /* SVGAnimatedNumberList.cpp */,
</span><span class="cx">                          08B35B16127B6A88005314DD /* SVGAnimatedNumberList.h */,
</span><span class="cx">                          B22277ED0D00BF1F0071B782 /* SVGAnimatedNumberList.idl */,
</span><del>-                               431A2F9B13B6F2B0007791E4 /* SVGAnimatedNumberOptionalNumber.cpp */,
-                               431A2F9A13B6F2B0007791E4 /* SVGAnimatedNumberOptionalNumber.h */,
</del><span class="cx">                           0863951313B5FE5700BB344D /* SVGAnimatedPath.cpp */,
</span><span class="cx">                          0863951413B5FE5700BB344D /* SVGAnimatedPath.h */,
</span><span class="cx">                          43B9336813B261B1004584BF /* SVGAnimatedPointList.cpp */,
</span><span class="lines">@@ -31931,9 +31921,7 @@
</span><span class="cx">                          089021A9126EF5DE0092D5EA /* SVGAnimatedLength.h in Headers */,
</span><span class="cx">                          089021AD126EF5E90092D5EA /* SVGAnimatedLengthList.h in Headers */,
</span><span class="cx">                          088A0E04126EF1DB00978F7A /* SVGAnimatedListPropertyTearOff.h in Headers */,
</span><del>-                               08B35B13127B6A7C005314DD /* SVGAnimatedNumber.h in Headers */,
</del><span class="cx">                           08B35B17127B6A88005314DD /* SVGAnimatedNumberList.h in Headers */,
</span><del>-                               431A2F9C13B6F2B0007791E4 /* SVGAnimatedNumberOptionalNumber.h in Headers */,
</del><span class="cx">                           0863951613B5FE5700BB344D /* SVGAnimatedPath.h in Headers */,
</span><span class="cx">                          089A8E07128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h in Headers */,
</span><span class="cx">                          43B9336913B261B1004584BF /* SVGAnimatedPointList.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedLengthcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimatedLength.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedLength.cpp   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGAnimatedLength.cpp      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -22,7 +22,6 @@
</span><span class="cx"> #include "SVGAnimatedLength.h"
</span><span class="cx"> 
</span><span class="cx"> #include "SVGAnimateElementBase.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedLengthListcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimatedLengthList.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedLengthList.cpp       2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGAnimatedLengthList.cpp  2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -21,7 +21,6 @@
</span><span class="cx"> #include "SVGAnimatedLengthList.h"
</span><span class="cx"> 
</span><span class="cx"> #include "SVGAnimateElementBase.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedNumbercpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedNumber.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedNumber.cpp   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGAnimatedNumber.cpp      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,104 +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.
- */
-
-#include "config.h"
-#include "SVGAnimatedNumber.h"
-
-#include "SVGAnimateElementBase.h"
-#include "SVGParserUtilities.h"
-
-namespace WebCore {
-
-SVGAnimatedNumberAnimator::SVGAnimatedNumberAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement)
-    : SVGAnimatedTypeAnimator(AnimatedNumber, animationElement, contextElement)
-{
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberAnimator::constructFromString(const String& string)
-{
-    return SVGAnimatedType::create(SVGPropertyTraits<float>::fromString(string));
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    return constructFromBaseValue<SVGAnimatedNumber>(animatedTypes);
-}
-
-void SVGAnimatedNumberAnimator::stopAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    stopAnimValAnimationForType<SVGAnimatedNumber>(animatedTypes);
-}
-
-void SVGAnimatedNumberAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGAnimatedType& type)
-{
-    resetFromBaseValue<SVGAnimatedNumber>(animatedTypes, type);
-}
-
-void SVGAnimatedNumberAnimator::animValWillChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValWillChangeForType<SVGAnimatedNumber>(animatedTypes);
-}
-
-void SVGAnimatedNumberAnimator::animValDidChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValDidChangeForType<SVGAnimatedNumber>(animatedTypes);
-}
-
-void SVGAnimatedNumberAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnimatedType* to)
-{
-    ASSERT(from->type() == AnimatedNumber);
-    ASSERT(from->type() == to->type());
-
-    to->as<float>() += from->as<float>();
-}
-
-static float parseNumberFromString(SVGAnimationElement*, const String& string)
-{
-    return SVGPropertyTraits<float>::fromString(string);
-}
-
-void SVGAnimatedNumberAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType* toAtEndOfDuration, SVGAnimatedType* animated)
-{
-    ASSERT(m_animationElement);
-    ASSERT(m_contextElement);
-
-    auto fromNumber = (m_animationElement->animationMode() == AnimationMode::To ? animated : from)->as<float>();
-    auto toNumber = to->as<float>();
-    const auto toAtEndOfDurationNumber = toAtEndOfDuration->as<float>();
-    auto& animatedNumber = animated->as<float>();
-
-    // Apply CSS inheritance rules.
-    m_animationElement->adjustForInheritance<float>(parseNumberFromString, m_animationElement->fromPropertyValueType(), fromNumber, m_contextElement);
-    m_animationElement->adjustForInheritance<float>(parseNumberFromString, m_animationElement->toPropertyValueType(), toNumber, m_contextElement);
-
-    m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromNumber, toNumber, toAtEndOfDurationNumber, animatedNumber);
-}
-
-float SVGAnimatedNumberAnimator::calculateDistance(const String& fromString, const String& toString)
-{
-    ASSERT(m_contextElement);
-    float from = 0;
-    float to = 0;
-    parseNumberFromString(fromString, from);
-    parseNumberFromString(toString, to);
-    return fabsf(to - from);
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedNumberh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedNumber.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedNumber.h     2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGAnimatedNumber.h        2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,56 +0,0 @@
</span><del>-/*
- * Copyright (C) Research In Motion Limited 2010. 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 "SVGAnimatedStaticPropertyTearOff.h"
-#include "SVGAnimatedTypeAnimator.h"
-#include "SVGAttributeAccessor.h"
-
-namespace WebCore {
-
-class SVGAnimationElement;
-
-using SVGAnimatedNumber = SVGAnimatedStaticPropertyTearOff<float>;
-using SVGAnimatedNumberAttribute = SVGAnimatedAttribute<SVGAnimatedNumber>;
-
-template<typename OwnerType>
-using SVGAnimatedNumberAttributeAccessor = SVGAnimatedAttributeAccessor<OwnerType, SVGAnimatedNumberAttribute, AnimatedNumber>;
-
-template<typename OwnerType>
-using SVGAnimatedOptionalNumberAttributeAccessor = SVGAnimatedOptionalAttributeAccessor<OwnerType, SVGAnimatedNumberAttribute, AnimatedNumberOptionalNumber>;
-
-class SVGAnimatedNumberAnimator final : public SVGAnimatedTypeAnimator {
-public:
-    SVGAnimatedNumberAnimator(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="trunkSourceWebCoresvgSVGAnimatedNumberListcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimatedNumberList.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedNumberList.cpp       2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGAnimatedNumberList.cpp  2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -22,7 +22,6 @@
</span><span class="cx"> #include "SVGAnimatedNumberList.h"
</span><span class="cx"> 
</span><span class="cx"> #include "SVGAnimateElementBase.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedNumberOptionalNumbercpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedNumberOptionalNumber.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedNumberOptionalNumber.cpp     2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGAnimatedNumberOptionalNumber.cpp        2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,96 +0,0 @@
</span><del>-/*
- * Copyright (C) Research In Motion Limited 2011. 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 "SVGAnimatedNumberOptionalNumber.h"
-
-#include "SVGAnimateElementBase.h"
-#include "SVGAnimatedNumber.h"
-#include "SVGParserUtilities.h"
-
-namespace WebCore {
-
-SVGAnimatedNumberOptionalNumberAnimator::SVGAnimatedNumberOptionalNumberAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement)
-    : SVGAnimatedTypeAnimator(AnimatedNumberOptionalNumber, animationElement, contextElement)
-{
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberOptionalNumberAnimator::constructFromString(const String& string)
-{
-    return SVGAnimatedType::create(SVGPropertyTraits<std::pair<float, float>>::fromString(string));
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberOptionalNumberAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    return constructFromBaseValues<SVGAnimatedNumber, SVGAnimatedNumber>(animatedTypes);
-}
-
-void SVGAnimatedNumberOptionalNumberAnimator::stopAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    stopAnimValAnimationForTypes<SVGAnimatedNumber, SVGAnimatedNumber>(animatedTypes);
-}
-
-void SVGAnimatedNumberOptionalNumberAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGAnimatedType& type)
-{
-    resetFromBaseValues<SVGAnimatedNumber, SVGAnimatedNumber>(animatedTypes, type);
-}
-
-void SVGAnimatedNumberOptionalNumberAnimator::animValWillChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValWillChangeForTypes<SVGAnimatedNumber, SVGAnimatedNumber>(animatedTypes);
-}
-
-void SVGAnimatedNumberOptionalNumberAnimator::animValDidChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValDidChangeForTypes<SVGAnimatedNumber, SVGAnimatedNumber>(animatedTypes);
-}
-
-void SVGAnimatedNumberOptionalNumberAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnimatedType* to)
-{
-    ASSERT(from->type() == AnimatedNumberOptionalNumber);
-    ASSERT(from->type() == to->type());
-
-    const auto& fromNumberPair = from->as<std::pair<float, float>>();
-    auto& toNumberPair = to->as<std::pair<float, float>>();
-
-    toNumberPair.first += fromNumberPair.first;
-    toNumberPair.second += fromNumberPair.second;
-}
-
-void SVGAnimatedNumberOptionalNumberAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType* toAtEndOfDuration, SVGAnimatedType* animated)
-{
-    ASSERT(m_animationElement);
-    ASSERT(m_contextElement);
-
-    const auto& fromNumberPair = (m_animationElement->animationMode() == AnimationMode::To ? animated : from)->as<std::pair<float, float>>();
-    const auto& toNumberPair = to->as<std::pair<float, float>>();
-    const auto& toAtEndOfDurationNumberPair = toAtEndOfDuration->as<std::pair<float, float>>();
-    auto& animatedNumberPair = animated->as<std::pair<float, float>>();
-
-    m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromNumberPair.first, toNumberPair.first, toAtEndOfDurationNumberPair.first, animatedNumberPair.first);
-    m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromNumberPair.second, toNumberPair.second, toAtEndOfDurationNumberPair.second, animatedNumberPair.second);
-}
-
-float SVGAnimatedNumberOptionalNumberAnimator::calculateDistance(const String&, const String&)
-{
-    // FIXME: Distance calculation is not possible for SVGNumberOptionalNumber right now. We need the distance for every single value.
-    return -1;
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedNumberOptionalNumberh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedNumberOptionalNumber.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedNumberOptionalNumber.h       2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGAnimatedNumberOptionalNumber.h  2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,44 +0,0 @@
</span><del>-/*
- * Copyright (C) Research In Motion Limited 2010. 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 "SVGAnimatedTypeAnimator.h"
-
-namespace WebCore {
-
-class SVGAnimationElement;
-
-class SVGAnimatedNumberOptionalNumberAnimator final : public SVGAnimatedTypeAnimator {
-public:
-    SVGAnimatedNumberOptionalNumberAnimator(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="trunkSourceWebCoresvgSVGAnimatedTransformListcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimatedTransformList.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedTransformList.cpp    2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGAnimatedTransformList.cpp       2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -25,7 +25,6 @@
</span><span class="cx"> #include "SVGAnimatedTransformList.h"
</span><span class="cx"> 
</span><span class="cx"> #include "SVGAnimateTransformElement.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGNames.h"
</span><span class="cx"> #include "SVGTransformDistance.h"
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatorFactoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimatorFactory.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatorFactory.h    2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGAnimatorFactory.h       2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -23,9 +23,7 @@
</span><span class="cx"> #include "SVGAnimatedEnumeration.h"
</span><span class="cx"> #include "SVGAnimatedLength.h"
</span><span class="cx"> #include "SVGAnimatedLengthList.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGAnimatedNumberList.h"
</span><del>-#include "SVGAnimatedNumberOptionalNumber.h"
</del><span class="cx"> #include "SVGAnimatedPath.h"
</span><span class="cx"> #include "SVGAnimatedPointList.h"
</span><span class="cx"> #include "SVGAnimatedString.h"
</span><span class="lines">@@ -47,6 +45,8 @@
</span><span class="cx">         case AnimatedColor:
</span><span class="cx">         case AnimatedInteger:
</span><span class="cx">         case AnimatedIntegerOptionalInteger:
</span><ins>+        case AnimatedNumber:
+        case AnimatedNumberOptionalNumber:
</ins><span class="cx">         case AnimatedPreserveAspectRatio:
</span><span class="cx">         case AnimatedRect:
</span><span class="cx">             return nullptr;
</span><span class="lines">@@ -59,12 +59,8 @@
</span><span class="cx">             return std::make_unique<SVGAnimatedLengthAnimator>(animationElement, contextElement);
</span><span class="cx">         case AnimatedLengthList:
</span><span class="cx">             return std::make_unique<SVGAnimatedLengthListAnimator>(animationElement, contextElement);
</span><del>-        case AnimatedNumber:
-            return std::make_unique<SVGAnimatedNumberAnimator>(animationElement, contextElement);
</del><span class="cx">         case AnimatedNumberList:
</span><span class="cx">             return std::make_unique<SVGAnimatedNumberListAnimator>(animationElement, contextElement);
</span><del>-        case AnimatedNumberOptionalNumber:
-            return std::make_unique<SVGAnimatedNumberOptionalNumberAnimator>(animationElement, contextElement);
</del><span class="cx">         case AnimatedPath:
</span><span class="cx">             return std::make_unique<SVGAnimatedPathAnimator>(animationElement, contextElement);
</span><span class="cx">         case AnimatedPoints:
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGComponentTransferFunctionElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGComponentTransferFunctionElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGComponentTransferFunctionElement.cpp 2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGComponentTransferFunctionElement.cpp    2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006 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">@@ -36,6 +36,15 @@
</span><span class="cx">     : SVGElement(tagName, document)
</span><span class="cx"> {
</span><span class="cx">     registerAttributes();
</span><ins>+    
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::slopeAttr, &SVGComponentTransferFunctionElement::m_slope>();
+        PropertyRegistry::registerProperty<SVGNames::interceptAttr, &SVGComponentTransferFunctionElement::m_intercept>();
+        PropertyRegistry::registerProperty<SVGNames::amplitudeAttr, &SVGComponentTransferFunctionElement::m_amplitude>();
+        PropertyRegistry::registerProperty<SVGNames::exponentAttr, &SVGComponentTransferFunctionElement::m_exponent>();
+        PropertyRegistry::registerProperty<SVGNames::offsetAttr, &SVGComponentTransferFunctionElement::m_offset>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGComponentTransferFunctionElement::registerAttributes()
</span><span class="lines">@@ -45,11 +54,6 @@
</span><span class="cx">         return;
</span><span class="cx">     registry.registerAttribute<SVGNames::typeAttr, ComponentTransferType, &SVGComponentTransferFunctionElement::m_type>();
</span><span class="cx">     registry.registerAttribute<SVGNames::tableValuesAttr, &SVGComponentTransferFunctionElement::m_tableValues>();
</span><del>-    registry.registerAttribute<SVGNames::slopeAttr, &SVGComponentTransferFunctionElement::m_slope>();
-    registry.registerAttribute<SVGNames::interceptAttr, &SVGComponentTransferFunctionElement::m_intercept>();
-    registry.registerAttribute<SVGNames::amplitudeAttr, &SVGComponentTransferFunctionElement::m_amplitude>();
-    registry.registerAttribute<SVGNames::exponentAttr, &SVGComponentTransferFunctionElement::m_exponent>();
-    registry.registerAttribute<SVGNames::offsetAttr, &SVGComponentTransferFunctionElement::m_offset>();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGComponentTransferFunctionElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="lines">@@ -70,27 +74,27 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::slopeAttr) {
</span><del>-        m_slope.setValue(value.toFloat());
</del><ins>+        m_slope->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::interceptAttr) {
</span><del>-        m_intercept.setValue(value.toFloat());
</del><ins>+        m_intercept->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::amplitudeAttr) {
</span><del>-        m_amplitude.setValue(value.toFloat());
</del><ins>+        m_amplitude->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::exponentAttr) {
</span><del>-        m_exponent.setValue(value.toFloat());
</del><ins>+        m_exponent->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::offsetAttr) {
</span><del>-        m_offset.setValue(value.toFloat());
</del><ins>+        m_offset->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGComponentTransferFunctionElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGComponentTransferFunctionElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGComponentTransferFunctionElement.h   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGComponentTransferFunctionElement.h      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include "FEComponentTransfer.h"
</span><span class="cx"> #include "SVGAnimatedEnumeration.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGAnimatedNumberList.h"
</span><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> 
</span><span class="lines">@@ -77,19 +76,19 @@
</span><span class="cx"> 
</span><span class="cx">     ComponentTransferType type() const { return m_type.currentValue(attributeOwnerProxy()); }
</span><span class="cx">     const SVGNumberListValues& tableValues() const { return m_tableValues.currentValue(attributeOwnerProxy()); }
</span><del>-    float slope() const { return m_slope.currentValue(attributeOwnerProxy()); }
-    float intercept() const { return m_intercept.currentValue(attributeOwnerProxy()); }
-    float amplitude() const { return m_amplitude.currentValue(attributeOwnerProxy()); }
-    float exponent() const { return m_exponent.currentValue(attributeOwnerProxy()); }
-    float offset() const { return m_offset.currentValue(attributeOwnerProxy()); }
</del><ins>+    float slope() const { return m_slope->currentValue(); }
+    float intercept() const { return m_intercept->currentValue(); }
+    float amplitude() const { return m_amplitude->currentValue(); }
+    float exponent() const { return m_exponent->currentValue(); }
+    float offset() const { return m_offset->currentValue(); }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedEnumeration> typeAnimated() { return m_type.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx">     RefPtr<SVGAnimatedNumberList> tableValuesAnimated() { return m_tableValues.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> slopeAnimated() { return m_slope.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> interceptAnimated() { return m_intercept.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> amplitudeAnimated() { return m_amplitude.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> exponentAnimated() { return m_exponent.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> offsetAnimated() { return m_offset.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& slopeAnimated() { return m_slope; }
+    SVGAnimatedNumber& interceptAnimated() { return m_intercept; }
+    SVGAnimatedNumber& amplitudeAnimated() { return m_amplitude; }
+    SVGAnimatedNumber& exponentAnimated() { return m_exponent; }
+    SVGAnimatedNumber& offsetAnimated() { return m_offset; }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     SVGComponentTransferFunctionElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -117,11 +116,11 @@
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     SVGAnimatedEnumerationAttribute<ComponentTransferType> m_type { FECOMPONENTTRANSFER_TYPE_IDENTITY };
</span><span class="cx">     SVGAnimatedNumberListAttribute m_tableValues;
</span><del>-    SVGAnimatedNumberAttribute m_slope { 1 };
-    SVGAnimatedNumberAttribute m_intercept;
-    SVGAnimatedNumberAttribute m_amplitude { 1 };
-    SVGAnimatedNumberAttribute m_exponent { 1 };
-    SVGAnimatedNumberAttribute m_offset;
</del><ins>+    Ref<SVGAnimatedNumber> m_slope { SVGAnimatedNumber::create(this, 1) };
+    Ref<SVGAnimatedNumber> m_intercept { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_amplitude { SVGAnimatedNumber::create(this, 1) };
+    Ref<SVGAnimatedNumber> m_exponent { SVGAnimatedNumber::create(this, 1) };
+    Ref<SVGAnimatedNumber> m_offset { SVGAnimatedNumber::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFECompositeElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFECompositeElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFECompositeElement.cpp       2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFECompositeElement.cpp  2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006 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">@@ -36,6 +36,14 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::feCompositeTag));
</span><span class="cx">     registerAttributes();
</span><ins>+    
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::k1Attr, &SVGFECompositeElement::m_k1>();
+        PropertyRegistry::registerProperty<SVGNames::k2Attr, &SVGFECompositeElement::m_k2>();
+        PropertyRegistry::registerProperty<SVGNames::k3Attr, &SVGFECompositeElement::m_k3>();
+        PropertyRegistry::registerProperty<SVGNames::k4Attr, &SVGFECompositeElement::m_k4>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGFECompositeElement> SVGFECompositeElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -51,10 +59,6 @@
</span><span class="cx">     registry.registerAttribute<SVGNames::inAttr, &SVGFECompositeElement::m_in1>();
</span><span class="cx">     registry.registerAttribute<SVGNames::in2Attr, &SVGFECompositeElement::m_in2>();
</span><span class="cx">     registry.registerAttribute<SVGNames::operatorAttr, CompositeOperationType, &SVGFECompositeElement::m_svgOperator>();
</span><del>-    registry.registerAttribute<SVGNames::k1Attr, &SVGFECompositeElement::m_k1>();
-    registry.registerAttribute<SVGNames::k2Attr, &SVGFECompositeElement::m_k2>();
-    registry.registerAttribute<SVGNames::k3Attr, &SVGFECompositeElement::m_k3>();
-    registry.registerAttribute<SVGNames::k4Attr, &SVGFECompositeElement::m_k4>();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGFECompositeElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="lines">@@ -77,22 +81,22 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::k1Attr) {
</span><del>-        m_k1.setValue(value.toFloat());
</del><ins>+        m_k1->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::k2Attr) {
</span><del>-        m_k2.setValue(value.toFloat());
</del><ins>+        m_k2->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::k3Attr) {
</span><del>-        m_k3.setValue(value.toFloat());
</del><ins>+        m_k3->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::k4Attr) {
</span><del>-        m_k4.setValue(value.toFloat());
</del><ins>+        m_k4->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFECompositeElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFECompositeElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFECompositeElement.h 2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFECompositeElement.h    2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include "FEComposite.h"
</span><span class="cx"> #include "SVGAnimatedEnumeration.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGFilterPrimitiveStandardAttributes.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -88,18 +87,18 @@
</span><span class="cx">     String in1() const { return m_in1.currentValue(attributeOwnerProxy()); }
</span><span class="cx">     String in2() const { return m_in2.currentValue(attributeOwnerProxy()); }
</span><span class="cx">     CompositeOperationType svgOperator() const { return m_svgOperator.currentValue(attributeOwnerProxy()); }
</span><del>-    float k1() const { return m_k1.currentValue(attributeOwnerProxy()); }
-    float k2() const { return m_k2.currentValue(attributeOwnerProxy()); }
-    float k3() const { return m_k3.currentValue(attributeOwnerProxy()); }
-    float k4() const { return m_k4.currentValue(attributeOwnerProxy()); }
</del><ins>+    float k1() const { return m_k1->currentValue(); }
+    float k2() const { return m_k2->currentValue(); }
+    float k3() const { return m_k3->currentValue(); }
+    float k4() const { return m_k4->currentValue(); }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx">     RefPtr<SVGAnimatedString> in2Animated() { return m_in2.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx">     RefPtr<SVGAnimatedEnumeration> svgOperatorAnimated() { return m_svgOperator.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> k1Animated() { return m_k1.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> k2Animated() { return m_k2.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> k3Animated() { return m_k3.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> k4Animated() { return m_k4.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& k1Animated() { return m_k1; }
+    SVGAnimatedNumber& k2Animated() { return m_k2; }
+    SVGAnimatedNumber& k3Animated() { return m_k3; }
+    SVGAnimatedNumber& k4Animated() { return m_k4; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGFECompositeElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -128,10 +127,10 @@
</span><span class="cx">     SVGAnimatedStringAttribute m_in1;
</span><span class="cx">     SVGAnimatedStringAttribute m_in2;
</span><span class="cx">     SVGAnimatedEnumerationAttribute<CompositeOperationType> m_svgOperator { FECOMPOSITE_OPERATOR_OVER };
</span><del>-    SVGAnimatedNumberAttribute m_k1;
-    SVGAnimatedNumberAttribute m_k2;
-    SVGAnimatedNumberAttribute m_k3;
-    SVGAnimatedNumberAttribute m_k4;
</del><ins>+    Ref<SVGAnimatedNumber> m_k1 { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_k2 { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_k3 { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_k4 { SVGAnimatedNumber::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEConvolveMatrixElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEConvolveMatrixElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEConvolveMatrixElement.cpp  2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEConvolveMatrixElement.cpp     2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -44,8 +44,11 @@
</span><span class="cx">     static std::once_flag onceFlag;
</span><span class="cx">     std::call_once(onceFlag, [] {
</span><span class="cx">         PropertyRegistry::registerProperty<SVGNames::orderAttr, &SVGFEConvolveMatrixElement::m_orderX, &SVGFEConvolveMatrixElement::m_orderY>();
</span><ins>+        PropertyRegistry::registerProperty<SVGNames::divisorAttr, &SVGFEConvolveMatrixElement::m_divisor>();
+        PropertyRegistry::registerProperty<SVGNames::biasAttr, &SVGFEConvolveMatrixElement::m_bias>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::targetXAttr, &SVGFEConvolveMatrixElement::m_targetX>();
</span><span class="cx">         PropertyRegistry::registerProperty<SVGNames::targetYAttr, &SVGFEConvolveMatrixElement::m_targetY>();
</span><ins>+        PropertyRegistry::registerProperty<SVGNames::kernelUnitLengthAttr, &SVGFEConvolveMatrixElement::m_kernelUnitLengthX, &SVGFEConvolveMatrixElement::m_kernelUnitLengthY>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::preserveAlphaAttr, &SVGFEConvolveMatrixElement::m_preserveAlpha>();
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -55,18 +58,6 @@
</span><span class="cx">     return adoptRef(*new SVGFEConvolveMatrixElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const AtomicString& SVGFEConvolveMatrixElement::kernelUnitLengthXIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGKernelUnitLengthX", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
-const AtomicString& SVGFEConvolveMatrixElement::kernelUnitLengthYIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGKernelUnitLengthY", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
</del><span class="cx"> void SVGFEConvolveMatrixElement::registerAttributes()
</span><span class="cx"> {
</span><span class="cx">     auto& registry = attributeRegistry();
</span><span class="lines">@@ -74,12 +65,7 @@
</span><span class="cx">         return;
</span><span class="cx">     registry.registerAttribute<SVGNames::inAttr, &SVGFEConvolveMatrixElement::m_in1>();
</span><span class="cx">     registry.registerAttribute<SVGNames::kernelMatrixAttr, &SVGFEConvolveMatrixElement::m_kernelMatrix>();
</span><del>-    registry.registerAttribute<SVGNames::divisorAttr, &SVGFEConvolveMatrixElement::m_divisor>();
-    registry.registerAttribute<SVGNames::biasAttr, &SVGFEConvolveMatrixElement::m_bias>();
</del><span class="cx">     registry.registerAttribute<SVGNames::edgeModeAttr, EdgeModeType, &SVGFEConvolveMatrixElement::m_edgeMode>();
</span><del>-    registry.registerAttribute<SVGNames::kernelUnitLengthAttr,
-        &SVGFEConvolveMatrixElement::kernelUnitLengthXIdentifier, &SVGFEConvolveMatrixElement::m_kernelUnitLengthX,
-        &SVGFEConvolveMatrixElement::kernelUnitLengthYIdentifier, &SVGFEConvolveMatrixElement::m_kernelUnitLengthY>();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGFEConvolveMatrixElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="lines">@@ -119,7 +105,7 @@
</span><span class="cx">     if (name == SVGNames::divisorAttr) {
</span><span class="cx">         float divisor = value.toFloat();
</span><span class="cx">         if (divisor)
</span><del>-            m_divisor.setValue(divisor);
</del><ins>+            m_divisor->setBaseValInternal(divisor);
</ins><span class="cx">         else
</span><span class="cx">             document().accessSVGExtensions().reportWarning("feConvolveMatrix: problem parsing divisor=\"" + value + "\". Filtered element will not be displayed.");
</span><span class="cx">         return;
</span><span class="lines">@@ -126,7 +112,7 @@
</span><span class="cx">     }
</span><span class="cx">     
</span><span class="cx">     if (name == SVGNames::biasAttr) {
</span><del>-        m_bias.setValue(value.toFloat());
</del><ins>+        m_bias->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -143,8 +129,8 @@
</span><span class="cx">     if (name == SVGNames::kernelUnitLengthAttr) {
</span><span class="cx">         float x, y;
</span><span class="cx">         if (parseNumberOptionalNumber(value, x, y) && x > 0 && y > 0) {
</span><del>-            m_kernelUnitLengthX.setValue(x);
-            m_kernelUnitLengthY.setValue(y);
</del><ins>+            m_kernelUnitLengthX->setBaseValInternal(x);
+            m_kernelUnitLengthY->setBaseValInternal(y);
</ins><span class="cx">         } else
</span><span class="cx">             document().accessSVGExtensions().reportWarning("feConvolveMatrix: problem parsing kernelUnitLength=\"" + value + "\". Filtered element will not be displayed.");
</span><span class="cx">         return;
</span><span class="lines">@@ -194,8 +180,8 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGFEConvolveMatrixElement::setKernelUnitLength(float x, float y)
</span><span class="cx"> {
</span><del>-    m_kernelUnitLengthX.setValue(x);
-    m_kernelUnitLengthY.setValue(y);
</del><ins>+    m_kernelUnitLengthX->setBaseValInternal(x);
+    m_kernelUnitLengthY->setBaseValInternal(y);
</ins><span class="cx">     invalidate();
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEConvolveMatrixElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEConvolveMatrixElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEConvolveMatrixElement.h    2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEConvolveMatrixElement.h       2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -71,13 +71,13 @@
</span><span class="cx">     int orderX() const { return m_orderX->currentValue(); }
</span><span class="cx">     int orderY() const { return m_orderY->currentValue(); }
</span><span class="cx">     const SVGNumberListValues& kernelMatrix() const { return m_kernelMatrix.currentValue(attributeOwnerProxy()); }
</span><del>-    float divisor() const { return m_divisor.currentValue(attributeOwnerProxy()); }
-    float bias() const { return m_bias.currentValue(attributeOwnerProxy()); }
</del><ins>+    float divisor() const { return m_divisor->currentValue(); }
+    float bias() const { return m_bias->currentValue(); }
</ins><span class="cx">     int targetX() const { return m_targetX->currentValue(); }
</span><span class="cx">     int targetY() const { return m_targetY->currentValue(); }
</span><span class="cx">     EdgeModeType edgeMode() const { return m_edgeMode.currentValue(attributeOwnerProxy()); }
</span><del>-    float kernelUnitLengthX() const { return m_kernelUnitLengthX.currentValue(attributeOwnerProxy()); }
-    float kernelUnitLengthY() const { return m_kernelUnitLengthY.currentValue(attributeOwnerProxy()); }
</del><ins>+    float kernelUnitLengthX() const { return m_kernelUnitLengthX->currentValue(); }
+    float kernelUnitLengthY() const { return m_kernelUnitLengthY->currentValue(); }
</ins><span class="cx">     bool preserveAlpha() const { return m_preserveAlpha->currentValue(); }
</span><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
</span><span class="lines">@@ -84,13 +84,13 @@
</span><span class="cx">     SVGAnimatedInteger& orderXAnimated() { return m_orderX; }
</span><span class="cx">     SVGAnimatedInteger& orderYAnimated() { return m_orderY; }
</span><span class="cx">     RefPtr<SVGAnimatedNumberList> kernelMatrixAnimated() { return m_kernelMatrix.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> divisorAnimated() { return m_divisor.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> biasAnimated() { return m_bias.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& divisorAnimated() { return m_divisor; }
+    SVGAnimatedNumber& biasAnimated() { return m_bias; }
</ins><span class="cx">     SVGAnimatedInteger& targetXAnimated() { return m_targetX; }
</span><span class="cx">     SVGAnimatedInteger& targetYAnimated() { return m_targetY; }
</span><span class="cx">     RefPtr<SVGAnimatedEnumeration> edgeModeAnimated() { return m_edgeMode.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> kernelUnitLengthXAnimated() { return m_kernelUnitLengthX.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> kernelUnitLengthYAnimated() { return m_kernelUnitLengthY.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& kernelUnitLengthXAnimated() { return m_kernelUnitLengthX; }
+    SVGAnimatedNumber& kernelUnitLengthYAnimated() { return m_kernelUnitLengthY; }
</ins><span class="cx">     SVGAnimatedBoolean& preserveAlphaAnimated() { return m_preserveAlpha; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -115,9 +115,6 @@
</span><span class="cx">     bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
</span><span class="cx">     RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
</span><span class="cx"> 
</span><del>-    static const AtomicString& kernelUnitLengthXIdentifier();
-    static const AtomicString& kernelUnitLengthYIdentifier();
-
</del><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     SVGAnimatedStringAttribute m_in1;
</span><span class="lines">@@ -124,13 +121,13 @@
</span><span class="cx">     Ref<SVGAnimatedInteger> m_orderX { SVGAnimatedInteger::create(this) };
</span><span class="cx">     Ref<SVGAnimatedInteger> m_orderY { SVGAnimatedInteger::create(this) };
</span><span class="cx">     SVGAnimatedNumberListAttribute m_kernelMatrix;
</span><del>-    SVGAnimatedNumberAttribute m_divisor;
-    SVGAnimatedNumberAttribute m_bias;
</del><ins>+    Ref<SVGAnimatedNumber> m_divisor { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_bias { SVGAnimatedNumber::create(this) };
</ins><span class="cx">     Ref<SVGAnimatedInteger> m_targetX { SVGAnimatedInteger::create(this) };
</span><span class="cx">     Ref<SVGAnimatedInteger> m_targetY { SVGAnimatedInteger::create(this) };
</span><span class="cx">     SVGAnimatedEnumerationAttribute<EdgeModeType> m_edgeMode { EDGEMODE_DUPLICATE };
</span><del>-    SVGAnimatedNumberAttribute m_kernelUnitLengthX;
-    SVGAnimatedNumberAttribute m_kernelUnitLengthY;
</del><ins>+    Ref<SVGAnimatedNumber> m_kernelUnitLengthX { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_kernelUnitLengthY { SVGAnimatedNumber::create(this) };
</ins><span class="cx">     Ref<SVGAnimatedBoolean> m_preserveAlpha { SVGAnimatedBoolean::create(this) };
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEDiffuseLightingElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEDiffuseLightingElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEDiffuseLightingElement.cpp 2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEDiffuseLightingElement.cpp    2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -39,6 +39,13 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::feDiffuseLightingTag));
</span><span class="cx">     registerAttributes();
</span><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::diffuseConstantAttr, &SVGFEDiffuseLightingElement::m_diffuseConstant>();
+        PropertyRegistry::registerProperty<SVGNames::surfaceScaleAttr, &SVGFEDiffuseLightingElement::m_surfaceScale>();
+        PropertyRegistry::registerProperty<SVGNames::kernelUnitLengthAttr, &SVGFEDiffuseLightingElement::m_kernelUnitLengthX, &SVGFEDiffuseLightingElement::m_kernelUnitLengthY>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGFEDiffuseLightingElement> SVGFEDiffuseLightingElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -46,18 +53,6 @@
</span><span class="cx">     return adoptRef(*new SVGFEDiffuseLightingElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const AtomicString& SVGFEDiffuseLightingElement::kernelUnitLengthXIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGKernelUnitLengthX", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
-const AtomicString& SVGFEDiffuseLightingElement::kernelUnitLengthYIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGKernelUnitLengthY", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
</del><span class="cx"> void SVGFEDiffuseLightingElement::registerAttributes()
</span><span class="cx"> {
</span><span class="cx">     auto& registry = attributeRegistry();
</span><span class="lines">@@ -64,11 +59,6 @@
</span><span class="cx">     if (!registry.isEmpty())
</span><span class="cx">         return;
</span><span class="cx">     registry.registerAttribute<SVGNames::inAttr, &SVGFEDiffuseLightingElement::m_in1>();
</span><del>-    registry.registerAttribute<SVGNames::diffuseConstantAttr, &SVGFEDiffuseLightingElement::m_diffuseConstant>();
-    registry.registerAttribute<SVGNames::surfaceScaleAttr, &SVGFEDiffuseLightingElement::m_surfaceScale>();
-    registry.registerAttribute<SVGNames::kernelUnitLengthAttr,
-        &SVGFEDiffuseLightingElement::kernelUnitLengthXIdentifier, &SVGFEDiffuseLightingElement::m_kernelUnitLengthX,
-        &SVGFEDiffuseLightingElement::kernelUnitLengthYIdentifier, &SVGFEDiffuseLightingElement::m_kernelUnitLengthY>();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGFEDiffuseLightingElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="lines">@@ -79,12 +69,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::surfaceScaleAttr) {
</span><del>-        m_surfaceScale.setValue(value.toFloat());
</del><ins>+        m_surfaceScale->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::diffuseConstantAttr) {
</span><del>-        m_diffuseConstant.setValue(value.toFloat());
</del><ins>+        m_diffuseConstant->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -91,8 +81,8 @@
</span><span class="cx">     if (name == SVGNames::kernelUnitLengthAttr) {
</span><span class="cx">         float x, y;
</span><span class="cx">         if (parseNumberOptionalNumber(value, x, y)) {
</span><del>-            m_kernelUnitLengthX.setValue(x);
-            m_kernelUnitLengthY.setValue(y);
</del><ins>+            m_kernelUnitLengthX->setBaseValInternal(x);
+            m_kernelUnitLengthY->setBaseValInternal(y);
</ins><span class="cx">         }
</span><span class="cx">         return;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEDiffuseLightingElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEDiffuseLightingElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEDiffuseLightingElement.h   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEDiffuseLightingElement.h      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -37,16 +37,16 @@
</span><span class="cx">     void lightElementAttributeChanged(const SVGFELightElement*, const QualifiedName&);
</span><span class="cx"> 
</span><span class="cx">     String in1() const { return m_in1.currentValue(attributeOwnerProxy()); }
</span><del>-    float diffuseConstant() const { return m_diffuseConstant.currentValue(attributeOwnerProxy()); }
-    float surfaceScale() const { return m_surfaceScale.currentValue(attributeOwnerProxy()); }
-    float kernelUnitLengthX() const { return m_kernelUnitLengthX.currentValue(attributeOwnerProxy()); }
-    float kernelUnitLengthY() const { return m_kernelUnitLengthY.currentValue(attributeOwnerProxy()); }
</del><ins>+    float diffuseConstant() const { return m_diffuseConstant->currentValue(); }
+    float surfaceScale() const { return m_surfaceScale->currentValue(); }
+    float kernelUnitLengthX() const { return m_kernelUnitLengthX->currentValue(); }
+    float kernelUnitLengthY() const { return m_kernelUnitLengthY->currentValue(); }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> diffuseConstantAnimated() { return m_diffuseConstant.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> surfaceScaleAnimated() { return m_surfaceScale.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> kernelUnitLengthXAnimated() { return m_kernelUnitLengthX.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> kernelUnitLengthYAnimated() { return m_kernelUnitLengthY.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& diffuseConstantAnimated() { return m_diffuseConstant; }
+    SVGAnimatedNumber& surfaceScaleAnimated() { return m_surfaceScale; }
+    SVGAnimatedNumber& kernelUnitLengthXAnimated() { return m_kernelUnitLengthX; }
+    SVGAnimatedNumber& kernelUnitLengthYAnimated() { return m_kernelUnitLengthY; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGFEDiffuseLightingElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -70,16 +70,13 @@
</span><span class="cx">     bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
</span><span class="cx">     RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
</span><span class="cx"> 
</span><del>-    static const AtomicString& kernelUnitLengthXIdentifier();
-    static const AtomicString& kernelUnitLengthYIdentifier();
-
</del><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     SVGAnimatedStringAttribute m_in1;
</span><del>-    SVGAnimatedNumberAttribute m_diffuseConstant { 1 };
-    SVGAnimatedNumberAttribute m_surfaceScale { 1 };
-    SVGAnimatedNumberAttribute m_kernelUnitLengthX;
-    SVGAnimatedNumberAttribute m_kernelUnitLengthY;
</del><ins>+    Ref<SVGAnimatedNumber> m_diffuseConstant { SVGAnimatedNumber::create(this, 1) };
+    Ref<SVGAnimatedNumber> m_surfaceScale { SVGAnimatedNumber::create(this, 1) };
+    Ref<SVGAnimatedNumber> m_kernelUnitLengthX { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_kernelUnitLengthY { SVGAnimatedNumber::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEDisplacementMapElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEDisplacementMapElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEDisplacementMapElement.cpp 2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEDisplacementMapElement.cpp    2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2006 Oliver Hunt <oliver@nerget.com>
</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">@@ -35,6 +35,11 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::feDisplacementMapTag));
</span><span class="cx">     registerAttributes();
</span><ins>+    
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::scaleAttr, &SVGFEDisplacementMapElement::m_scale>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGFEDisplacementMapElement> SVGFEDisplacementMapElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -51,7 +56,6 @@
</span><span class="cx">     registry.registerAttribute<SVGNames::in2Attr, &SVGFEDisplacementMapElement::m_in2>();
</span><span class="cx">     registry.registerAttribute<SVGNames::xChannelSelectorAttr, ChannelSelectorType, &SVGFEDisplacementMapElement::m_xChannelSelector>();
</span><span class="cx">     registry.registerAttribute<SVGNames::yChannelSelectorAttr, ChannelSelectorType, &SVGFEDisplacementMapElement::m_yChannelSelector>();
</span><del>-    registry.registerAttribute<SVGNames::scaleAttr, &SVGFEDisplacementMapElement::m_scale>();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGFEDisplacementMapElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="lines">@@ -81,7 +85,7 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::scaleAttr) {
</span><del>-        m_scale.setValue(value.toFloat());
</del><ins>+        m_scale->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEDisplacementMapElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEDisplacementMapElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEDisplacementMapElement.h   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEDisplacementMapElement.h      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -22,7 +22,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include "FEDisplacementMap.h"
</span><span class="cx"> #include "SVGAnimatedEnumeration.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGFilterPrimitiveStandardAttributes.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -75,13 +74,13 @@
</span><span class="cx">     String in2() const { return m_in2.currentValue(attributeOwnerProxy()); }
</span><span class="cx">     ChannelSelectorType xChannelSelector() const { return m_xChannelSelector.currentValue(attributeOwnerProxy()); }
</span><span class="cx">     ChannelSelectorType yChannelSelector() const { return m_yChannelSelector.currentValue(attributeOwnerProxy()); }
</span><del>-    float scale() const { return m_scale.currentValue(attributeOwnerProxy()); }
</del><ins>+    float scale() const { return m_scale->currentValue(); }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx">     RefPtr<SVGAnimatedString> in2Animated() { return m_in2.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx">     RefPtr<SVGAnimatedEnumeration> xChannelSelectorAnimated() { return m_xChannelSelector.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx">     RefPtr<SVGAnimatedEnumeration> yChannelSelectorAnimated() { return m_yChannelSelector.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> scaleAnimated() { return m_scale.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& scaleAnimated() { return m_scale; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGFEDisplacementMapElement(const QualifiedName& tagName, Document&);
</span><span class="lines">@@ -111,7 +110,7 @@
</span><span class="cx">     SVGAnimatedStringAttribute m_in2;
</span><span class="cx">     SVGAnimatedEnumerationAttribute<ChannelSelectorType> m_xChannelSelector { CHANNEL_A };
</span><span class="cx">     SVGAnimatedEnumerationAttribute<ChannelSelectorType> m_yChannelSelector { CHANNEL_A };
</span><del>-    SVGAnimatedNumberAttribute m_scale;
</del><ins>+    Ref<SVGAnimatedNumber> m_scale { SVGAnimatedNumber::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEDropShadowElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEDropShadowElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEDropShadowElement.cpp      2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEDropShadowElement.cpp 2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) Research In Motion Limited 2011. 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">  * 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,6 +37,13 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::feDropShadowTag));
</span><span class="cx">     registerAttributes();
</span><ins>+    
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::dxAttr, &SVGFEDropShadowElement::m_dx>();
+        PropertyRegistry::registerProperty<SVGNames::dyAttr, &SVGFEDropShadowElement::m_dy>();
+        PropertyRegistry::registerProperty<SVGNames::stdDeviationAttr, &SVGFEDropShadowElement::m_stdDeviationX, &SVGFEDropShadowElement::m_stdDeviationY>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGFEDropShadowElement> SVGFEDropShadowElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -44,22 +51,10 @@
</span><span class="cx">     return adoptRef(*new SVGFEDropShadowElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const AtomicString& SVGFEDropShadowElement::stdDeviationXIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGStdDeviationX", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
-const AtomicString& SVGFEDropShadowElement::stdDeviationYIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGStdDeviationY", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
</del><span class="cx"> void SVGFEDropShadowElement::setStdDeviation(float x, float y)
</span><span class="cx"> {
</span><del>-    m_stdDeviationX.setValue(x);
-    m_stdDeviationY.setValue(y);
</del><ins>+    m_stdDeviationX->setBaseValInternal(x);
+    m_stdDeviationY->setBaseValInternal(y);
</ins><span class="cx">     invalidate();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -69,11 +64,6 @@
</span><span class="cx">     if (!registry.isEmpty())
</span><span class="cx">         return;
</span><span class="cx">     registry.registerAttribute<SVGNames::inAttr, &SVGFEDropShadowElement::m_in1>();
</span><del>-    registry.registerAttribute<SVGNames::dxAttr, &SVGFEDropShadowElement::m_dx>();
-    registry.registerAttribute<SVGNames::dyAttr, &SVGFEDropShadowElement::m_dy>();
-    registry.registerAttribute<SVGNames::stdDeviationAttr,
-        &SVGFEDropShadowElement::stdDeviationXIdentifier, &SVGFEDropShadowElement::m_stdDeviationX,
-        &SVGFEDropShadowElement::stdDeviationYIdentifier, &SVGFEDropShadowElement::m_stdDeviationY>();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGFEDropShadowElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="lines">@@ -81,8 +71,8 @@
</span><span class="cx">     if (name == SVGNames::stdDeviationAttr) {
</span><span class="cx">         float x, y;
</span><span class="cx">         if (parseNumberOptionalNumber(value, x, y)) {
</span><del>-            m_stdDeviationX.setValue(x);
-            m_stdDeviationY.setValue(y);
</del><ins>+            m_stdDeviationX->setBaseValInternal(x);
+            m_stdDeviationY->setBaseValInternal(y);
</ins><span class="cx">         }
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -93,12 +83,12 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::dxAttr) {
</span><del>-        m_dx.setValue(value.toFloat());
</del><ins>+        m_dx->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::dyAttr) {
</span><del>-        m_dy.setValue(value.toFloat());
</del><ins>+        m_dy->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEDropShadowElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEDropShadowElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEDropShadowElement.h        2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEDropShadowElement.h   2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -21,7 +21,6 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "FEDropShadow.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGFilterPrimitiveStandardAttributes.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -34,16 +33,16 @@
</span><span class="cx">     void setStdDeviation(float stdDeviationX, float stdDeviationY);
</span><span class="cx"> 
</span><span class="cx">     String in1() const { return m_in1.currentValue(attributeOwnerProxy()); }
</span><del>-    float dx() const { return m_dx.currentValue(attributeOwnerProxy()); }
-    float dy() const { return m_dy.currentValue(attributeOwnerProxy()); }
-    float stdDeviationX() const { return m_stdDeviationX.currentValue(attributeOwnerProxy()); }
-    float stdDeviationY() const { return m_stdDeviationY.currentValue(attributeOwnerProxy()); }
</del><ins>+    float dx() const { return m_dx->currentValue(); }
+    float dy() const { return m_dy->currentValue(); }
+    float stdDeviationX() const { return m_stdDeviationX->currentValue(); }
+    float stdDeviationY() const { return m_stdDeviationY->currentValue(); }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> dxAnimated() { return m_dx.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> dyAnimated() { return m_dy.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> stdDeviationXAnimated() { return m_stdDeviationX.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> stdDeviationYAnimated() { return m_stdDeviationY.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& dxAnimated() { return m_dx; }
+    SVGAnimatedNumber& dyAnimated() { return m_dy; }
+    SVGAnimatedNumber& stdDeviationXAnimated() { return m_stdDeviationX; }
+    SVGAnimatedNumber& stdDeviationYAnimated() { return m_stdDeviationY; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGFEDropShadowElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -66,16 +65,13 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
</span><span class="cx"> 
</span><del>-    static const AtomicString& stdDeviationXIdentifier();
-    static const AtomicString& stdDeviationYIdentifier();
-
</del><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     SVGAnimatedStringAttribute m_in1;
</span><del>-    SVGAnimatedNumberAttribute m_dx { 2 };
-    SVGAnimatedNumberAttribute m_dy { 2 };
-    SVGAnimatedNumberAttribute m_stdDeviationX { 2 };
-    SVGAnimatedNumberAttribute m_stdDeviationY { 2 };
</del><ins>+    Ref<SVGAnimatedNumber> m_dx { SVGAnimatedNumber::create(this, 2) };
+    Ref<SVGAnimatedNumber> m_dy { SVGAnimatedNumber::create(this, 2) };
+    Ref<SVGAnimatedNumber> m_stdDeviationX { SVGAnimatedNumber::create(this, 2) };
+    Ref<SVGAnimatedNumber> m_stdDeviationY { SVGAnimatedNumber::create(this, 2) };
</ins><span class="cx"> };
</span><span class="cx">     
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEGaussianBlurElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEGaussianBlurElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEGaussianBlurElement.cpp    2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEGaussianBlurElement.cpp       2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006 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,6 +37,11 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::feGaussianBlurTag));
</span><span class="cx">     registerAttributes();
</span><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::stdDeviationAttr, &SVGFEGaussianBlurElement::m_stdDeviationX, &SVGFEGaussianBlurElement::m_stdDeviationY>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGFEGaussianBlurElement> SVGFEGaussianBlurElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -44,22 +49,10 @@
</span><span class="cx">     return adoptRef(*new SVGFEGaussianBlurElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const AtomicString& SVGFEGaussianBlurElement::stdDeviationXIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGStdDeviationX", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
-const AtomicString& SVGFEGaussianBlurElement::stdDeviationYIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGStdDeviationY", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
</del><span class="cx"> void SVGFEGaussianBlurElement::setStdDeviation(float x, float y)
</span><span class="cx"> {
</span><del>-    m_stdDeviationX.setValue(x);
-    m_stdDeviationY.setValue(y);
</del><ins>+    m_stdDeviationX->setBaseValInternal(x);
+    m_stdDeviationY->setBaseValInternal(y);
</ins><span class="cx">     invalidate();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -69,9 +62,6 @@
</span><span class="cx">     if (!registry.isEmpty())
</span><span class="cx">         return;
</span><span class="cx">     registry.registerAttribute<SVGNames::inAttr, &SVGFEGaussianBlurElement::m_in1>();
</span><del>-    registry.registerAttribute<SVGNames::stdDeviationAttr,
-        &SVGFEGaussianBlurElement::stdDeviationXIdentifier, &SVGFEGaussianBlurElement::m_stdDeviationX,
-        &SVGFEGaussianBlurElement::stdDeviationYIdentifier, &SVGFEGaussianBlurElement::m_stdDeviationY>();
</del><span class="cx">     registry.registerAttribute<SVGNames::edgeModeAttr, EdgeModeType, &SVGFEGaussianBlurElement::m_edgeMode>();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -80,8 +70,8 @@
</span><span class="cx">     if (name == SVGNames::stdDeviationAttr) {
</span><span class="cx">         float x, y;
</span><span class="cx">         if (parseNumberOptionalNumber(value, x, y)) {
</span><del>-            m_stdDeviationX.setValue(x);
-            m_stdDeviationY.setValue(y);
</del><ins>+            m_stdDeviationX->setBaseValInternal(x);
+            m_stdDeviationY->setBaseValInternal(y);
</ins><span class="cx">         }
</span><span class="cx">         return;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEGaussianBlurElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEGaussianBlurElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEGaussianBlurElement.h      2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEGaussianBlurElement.h 2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include "FEGaussianBlur.h"
</span><span class="cx"> #include "SVGAnimatedEnumeration.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGFEConvolveMatrixElement.h"
</span><span class="cx"> #include "SVGFilterPrimitiveStandardAttributes.h"
</span><span class="cx"> 
</span><span class="lines">@@ -37,13 +36,13 @@
</span><span class="cx">     void setStdDeviation(float stdDeviationX, float stdDeviationY);
</span><span class="cx"> 
</span><span class="cx">     String in1() const { return m_in1.currentValue(attributeOwnerProxy()); }
</span><del>-    float stdDeviationX() const { return m_stdDeviationX.currentValue(attributeOwnerProxy()); }
-    float stdDeviationY() const { return m_stdDeviationY.currentValue(attributeOwnerProxy()); }
</del><ins>+    float stdDeviationX() const { return m_stdDeviationX->currentValue(); }
+    float stdDeviationY() const { return m_stdDeviationY->currentValue(); }
</ins><span class="cx">     EdgeModeType edgeMode() const { return m_edgeMode.currentValue(attributeOwnerProxy()); }
</span><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> stdDeviationXAnimated() { return m_stdDeviationX.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> stdDeviationYAnimated() { return m_stdDeviationY.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& stdDeviationXAnimated() { return m_stdDeviationX; }
+    SVGAnimatedNumber& stdDeviationYAnimated() { return m_stdDeviationY; }
</ins><span class="cx">     RefPtr<SVGAnimatedEnumeration> edgeModeAnimated() { return m_edgeMode.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -67,14 +66,11 @@
</span><span class="cx"> 
</span><span class="cx">     RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
</span><span class="cx"> 
</span><del>-    static const AtomicString& stdDeviationXIdentifier();
-    static const AtomicString& stdDeviationYIdentifier();
-
</del><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     SVGAnimatedStringAttribute m_in1;
</span><del>-    SVGAnimatedNumberAttribute m_stdDeviationX;
-    SVGAnimatedNumberAttribute m_stdDeviationY;
</del><ins>+    Ref<SVGAnimatedNumber> m_stdDeviationX { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_stdDeviationY { SVGAnimatedNumber::create(this) };
</ins><span class="cx">     SVGAnimatedEnumerationAttribute<EdgeModeType> m_edgeMode { EDGEMODE_NONE };
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFELightElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFELightElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFELightElement.cpp   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFELightElement.cpp      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx">  * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
</span><span class="cx">  * Copyright (C) 2005 Oliver Hunt <oliver@nerget.com>
</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">@@ -43,7 +43,19 @@
</span><span class="cx"> SVGFELightElement::SVGFELightElement(const QualifiedName& tagName, Document& document)
</span><span class="cx">     : SVGElement(tagName, document)
</span><span class="cx"> {
</span><del>-    registerAttributes();
</del><ins>+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::azimuthAttr, &SVGFELightElement::m_azimuth>();
+        PropertyRegistry::registerProperty<SVGNames::elevationAttr, &SVGFELightElement::m_elevation>();
+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGFELightElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGFELightElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::zAttr, &SVGFELightElement::m_z>();
+        PropertyRegistry::registerProperty<SVGNames::pointsAtXAttr, &SVGFELightElement::m_pointsAtX>();
+        PropertyRegistry::registerProperty<SVGNames::pointsAtYAttr, &SVGFELightElement::m_pointsAtY>();
+        PropertyRegistry::registerProperty<SVGNames::pointsAtZAttr, &SVGFELightElement::m_pointsAtZ>();
+        PropertyRegistry::registerProperty<SVGNames::specularExponentAttr, &SVGFELightElement::m_specularExponent>();
+        PropertyRegistry::registerProperty<SVGNames::limitingConeAngleAttr, &SVGFELightElement::m_limitingConeAngle>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SVGFELightElement* SVGFELightElement::findLightElement(const SVGElement* svgElement)
</span><span class="lines">@@ -55,72 +67,55 @@
</span><span class="cx">     return nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGFELightElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::azimuthAttr, &SVGFELightElement::m_azimuth>();
-    registry.registerAttribute<SVGNames::elevationAttr, &SVGFELightElement::m_elevation>();
-    registry.registerAttribute<SVGNames::xAttr, &SVGFELightElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGFELightElement::m_y>();
-    registry.registerAttribute<SVGNames::zAttr, &SVGFELightElement::m_z>();
-    registry.registerAttribute<SVGNames::pointsAtXAttr, &SVGFELightElement::m_pointsAtX>();
-    registry.registerAttribute<SVGNames::pointsAtYAttr, &SVGFELightElement::m_pointsAtY>();
-    registry.registerAttribute<SVGNames::pointsAtZAttr, &SVGFELightElement::m_pointsAtZ>();
-    registry.registerAttribute<SVGNames::specularExponentAttr, &SVGFELightElement::m_specularExponent>();
-    registry.registerAttribute<SVGNames::limitingConeAngleAttr, &SVGFELightElement::m_limitingConeAngle>();
-}
-
</del><span class="cx"> void SVGFELightElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (name == SVGNames::azimuthAttr) {
</span><del>-        m_azimuth.setValue(value.toFloat());
</del><ins>+        m_azimuth->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::elevationAttr) {
</span><del>-        m_elevation.setValue(value.toFloat());
</del><ins>+        m_elevation->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr) {
</span><del>-        m_x.setValue(value.toFloat());
</del><ins>+        m_x->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::yAttr) {
</span><del>-        m_y.setValue(value.toFloat());
</del><ins>+        m_y->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::zAttr) {
</span><del>-        m_z.setValue(value.toFloat());
</del><ins>+        m_z->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::pointsAtXAttr) {
</span><del>-        m_pointsAtX.setValue(value.toFloat());
</del><ins>+        m_pointsAtX->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::pointsAtYAttr) {
</span><del>-        m_pointsAtY.setValue(value.toFloat());
</del><ins>+        m_pointsAtY->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::pointsAtZAttr) {
</span><del>-        m_pointsAtZ.setValue(value.toFloat());
</del><ins>+        m_pointsAtZ->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::specularExponentAttr) {
</span><del>-        m_specularExponent.setValue(value.toFloat());
</del><ins>+        m_specularExponent->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::limitingConeAngleAttr) {
</span><del>-        m_limitingConeAngle.setValue(value.toFloat());
</del><ins>+        m_limitingConeAngle->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -129,7 +124,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGFELightElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         auto parent = makeRefPtr(parentElement());
</span><span class="cx">         if (!parent)
</span><span class="cx">             return;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFELightElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFELightElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFELightElement.h     2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFELightElement.h        2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "LightSource.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -36,27 +35,27 @@
</span><span class="cx">     virtual Ref<LightSource> lightSource(SVGFilterBuilder&) const = 0;
</span><span class="cx">     static SVGFELightElement* findLightElement(const SVGElement*);
</span><span class="cx"> 
</span><del>-    float azimuth() const { return m_azimuth.currentValue(attributeOwnerProxy()); }
-    float elevation() const { return m_elevation.currentValue(attributeOwnerProxy()); }
-    float x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    float y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    float z() const { return m_z.currentValue(attributeOwnerProxy()); }
-    float pointsAtX() const { return m_pointsAtX.currentValue(attributeOwnerProxy()); }
-    float pointsAtY() const { return m_pointsAtY.currentValue(attributeOwnerProxy()); }
-    float pointsAtZ() const { return m_pointsAtZ.currentValue(attributeOwnerProxy()); }
-    float specularExponent() const { return m_specularExponent.currentValue(attributeOwnerProxy()); }
-    float limitingConeAngle() const { return m_limitingConeAngle.currentValue(attributeOwnerProxy()); }
</del><ins>+    float azimuth() const { return m_azimuth->currentValue(); }
+    float elevation() const { return m_elevation->currentValue(); }
+    float x() const { return m_x->currentValue(); }
+    float y() const { return m_y->currentValue(); }
+    float z() const { return m_z->currentValue(); }
+    float pointsAtX() const { return m_pointsAtX->currentValue(); }
+    float pointsAtY() const { return m_pointsAtY->currentValue(); }
+    float pointsAtZ() const { return m_pointsAtZ->currentValue(); }
+    float specularExponent() const { return m_specularExponent->currentValue(); }
+    float limitingConeAngle() const { return m_limitingConeAngle->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedNumber> azimuthAnimated() { return m_azimuth.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> elevationAnimated() { return m_elevation.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> zAnimated() { return m_z.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> pointsAtXAnimated() { return m_pointsAtX.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> pointsAtYAnimated() { return m_pointsAtY.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> pointsAtZAnimated() { return m_pointsAtZ.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> specularExponentAnimated() { return m_specularExponent.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> limitingConeAngleAnimated() { return m_limitingConeAngle.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& azimuthAnimated() { return m_azimuth; }
+    SVGAnimatedNumber& elevationAnimated() { return m_elevation; }
+    SVGAnimatedNumber& xAnimated() { return m_x; }
+    SVGAnimatedNumber& yAnimated() { return m_y; }
+    SVGAnimatedNumber& zAnimated() { return m_z; }
+    SVGAnimatedNumber& pointsAtXAnimated() { return m_pointsAtX; }
+    SVGAnimatedNumber& pointsAtYAnimated() { return m_pointsAtY; }
+    SVGAnimatedNumber& pointsAtZAnimated() { return m_pointsAtZ; }
+    SVGAnimatedNumber& specularExponentAnimated() { return m_specularExponent; }
+    SVGAnimatedNumber& limitingConeAngleAnimated() { return m_limitingConeAngle; }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     SVGFELightElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -65,18 +64,11 @@
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGFELightElement, SVGElement>;
</span><del>-    static auto& 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<SVGFELightElement, SVGElement>;
</span><span class="cx">     const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
</span><span class="cx"> 
</span><del>-    static bool isKnownAttribute(const QualifiedName& attributeName)
-    {
-        return AttributeOwnerProxy::isKnownAttribute(attributeName) || PropertyRegistry::isKnownAttribute(attributeName);
-    }
-
</del><span class="cx">     void parseAttribute(const QualifiedName&, const AtomicString&) override;
</span><span class="cx">     void svgAttributeChanged(const QualifiedName&) override;
</span><span class="cx">     void childrenChanged(const ChildChange&) override;
</span><span class="lines">@@ -83,16 +75,16 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedNumberAttribute m_azimuth;
-    SVGAnimatedNumberAttribute m_elevation;
-    SVGAnimatedNumberAttribute m_x;
-    SVGAnimatedNumberAttribute m_y;
-    SVGAnimatedNumberAttribute m_z;
-    SVGAnimatedNumberAttribute m_pointsAtX;
-    SVGAnimatedNumberAttribute m_pointsAtY;
-    SVGAnimatedNumberAttribute m_pointsAtZ;
-    SVGAnimatedNumberAttribute m_specularExponent { 1 };
-    SVGAnimatedNumberAttribute m_limitingConeAngle;
</del><ins>+    Ref<SVGAnimatedNumber> m_azimuth { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_elevation { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_x { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_y { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_z { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_pointsAtX { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_pointsAtY { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_pointsAtZ { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_specularExponent { SVGAnimatedNumber::create(this, 1) };
+    Ref<SVGAnimatedNumber> m_limitingConeAngle { SVGAnimatedNumber::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEMorphologyElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEMorphologyElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEMorphologyElement.cpp      2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEMorphologyElement.cpp 2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,6 +1,6 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2009 Dirk Schulze <krit@webkit.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">@@ -36,6 +36,11 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::feMorphologyTag));
</span><span class="cx">     registerAttributes();
</span><ins>+    
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::radiusAttr, &SVGFEMorphologyElement::m_radiusX, &SVGFEMorphologyElement::m_radiusY>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGFEMorphologyElement> SVGFEMorphologyElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -43,22 +48,10 @@
</span><span class="cx">     return adoptRef(*new SVGFEMorphologyElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const AtomicString& SVGFEMorphologyElement::radiusXIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGRadiusX", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
-const AtomicString& SVGFEMorphologyElement::radiusYIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGRadiusY", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
</del><span class="cx"> void SVGFEMorphologyElement::setRadius(float x, float y)
</span><span class="cx"> {
</span><del>-    m_radiusX.setValue(x);
-    m_radiusY.setValue(y);
</del><ins>+    m_radiusX->setBaseValInternal(x);
+    m_radiusY->setBaseValInternal(y);
</ins><span class="cx">     invalidate();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -69,9 +62,6 @@
</span><span class="cx">         return;
</span><span class="cx">     registry.registerAttribute<SVGNames::inAttr, &SVGFEMorphologyElement::m_in1>();
</span><span class="cx">     registry.registerAttribute<SVGNames::operatorAttr, MorphologyOperatorType, &SVGFEMorphologyElement::m_svgOperator>();
</span><del>-    registry.registerAttribute<SVGNames::radiusAttr,
-        &SVGFEMorphologyElement::radiusXIdentifier, &SVGFEMorphologyElement::m_radiusX,
-        &SVGFEMorphologyElement::radiusYIdentifier, &SVGFEMorphologyElement::m_radiusY>();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGFEMorphologyElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="lines">@@ -91,8 +81,8 @@
</span><span class="cx">     if (name == SVGNames::radiusAttr) {
</span><span class="cx">         float x, y;
</span><span class="cx">         if (parseNumberOptionalNumber(value, x, y)) {
</span><del>-            m_radiusX.setValue(x);
-            m_radiusY.setValue(y);
</del><ins>+            m_radiusX->setBaseValInternal(x);
+            m_radiusY->setBaseValInternal(y);
</ins><span class="cx">         }
</span><span class="cx">         return;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEMorphologyElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEMorphologyElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEMorphologyElement.h        2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEMorphologyElement.h   2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -22,7 +22,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include "FEMorphology.h"
</span><span class="cx"> #include "SVGAnimatedEnumeration.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGFilterPrimitiveStandardAttributes.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -65,13 +64,13 @@
</span><span class="cx"> 
</span><span class="cx">     String in1() const { return m_in1.currentValue(attributeOwnerProxy()); }
</span><span class="cx">     MorphologyOperatorType svgOperator() const { return m_svgOperator.currentValue(attributeOwnerProxy()); }
</span><del>-    float radiusX() const { return m_radiusX.currentValue(attributeOwnerProxy()); }
-    float radiusY() const { return m_radiusY.currentValue(attributeOwnerProxy()); }
</del><ins>+    float radiusX() const { return m_radiusX->currentValue(); }
+    float radiusY() const { return m_radiusY->currentValue(); }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx">     RefPtr<SVGAnimatedEnumeration> svgOperatorAnimated() { return m_svgOperator.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> radiusXAnimated() { return m_radiusX.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> radiusYAnimated() { return m_radiusY.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& radiusXAnimated() { return m_radiusX; }
+    SVGAnimatedNumber& radiusYAnimated() { return m_radiusY; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGFEMorphologyElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -95,15 +94,12 @@
</span><span class="cx">     bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
</span><span class="cx">     RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
</span><span class="cx"> 
</span><del>-    static const AtomicString& radiusXIdentifier();
-    static const AtomicString& radiusYIdentifier();
-
</del><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     SVGAnimatedStringAttribute m_in1;
</span><span class="cx">     SVGAnimatedEnumerationAttribute<MorphologyOperatorType> m_svgOperator { FEMORPHOLOGY_OPERATOR_ERODE };
</span><del>-    SVGAnimatedNumberAttribute m_radiusX;
-    SVGAnimatedNumberAttribute m_radiusY;
</del><ins>+    Ref<SVGAnimatedNumber> m_radiusX { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_radiusY { SVGAnimatedNumber::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEOffsetElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEOffsetElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEOffsetElement.cpp  2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEOffsetElement.cpp     2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005 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,6 +37,12 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::feOffsetTag));
</span><span class="cx">     registerAttributes();
</span><ins>+    
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::dxAttr, &SVGFEOffsetElement::m_dx>();
+        PropertyRegistry::registerProperty<SVGNames::dyAttr, &SVGFEOffsetElement::m_dy>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGFEOffsetElement> SVGFEOffsetElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -50,19 +56,17 @@
</span><span class="cx">     if (!registry.isEmpty())
</span><span class="cx">         return;
</span><span class="cx">     registry.registerAttribute<SVGNames::inAttr, &SVGFEOffsetElement::m_in1>();
</span><del>-    registry.registerAttribute<SVGNames::dxAttr, &SVGFEOffsetElement::m_dx>();
-    registry.registerAttribute<SVGNames::dyAttr, &SVGFEOffsetElement::m_dy>();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGFEOffsetElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (name == SVGNames::dxAttr) {
</span><del>-        m_dx.setValue(value.toFloat());
</del><ins>+        m_dx->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::dyAttr) {
</span><del>-        m_dy.setValue(value.toFloat());
</del><ins>+        m_dy->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFEOffsetElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFEOffsetElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFEOffsetElement.h    2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFEOffsetElement.h       2019-03-21 00:35:50 UTC (rev 243266)
</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 "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGFilterPrimitiveStandardAttributes.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -32,12 +31,12 @@
</span><span class="cx">     static Ref<SVGFEOffsetElement> create(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     String in1() const { return m_in1.currentValue(attributeOwnerProxy()); }
</span><del>-    float dx() const { return m_dx.currentValue(attributeOwnerProxy()); }
-    float dy() const { return m_dy.currentValue(attributeOwnerProxy()); }
</del><ins>+    float dx() const { return m_dx->currentValue(); }
+    float dy() const { return m_dy->currentValue(); }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> dxAnimated() { return m_dx.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> dyAnimated() { return m_dy.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& dxAnimated() { return m_dx; }
+    SVGAnimatedNumber& dyAnimated() { return m_dy; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGFEOffsetElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -63,8 +62,8 @@
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     SVGAnimatedStringAttribute m_in1;
</span><del>-    SVGAnimatedNumberAttribute m_dx;
-    SVGAnimatedNumberAttribute m_dy;
</del><ins>+    Ref<SVGAnimatedNumber> m_dx { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_dy { SVGAnimatedNumber::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFESpecularLightingElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFESpecularLightingElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFESpecularLightingElement.cpp        2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFESpecularLightingElement.cpp   2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -40,6 +40,14 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::feSpecularLightingTag));
</span><span class="cx">     registerAttributes();
</span><ins>+    
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::specularConstantAttr, &SVGFESpecularLightingElement::m_specularConstant>();
+        PropertyRegistry::registerProperty<SVGNames::specularExponentAttr, &SVGFESpecularLightingElement::m_specularExponent>();
+        PropertyRegistry::registerProperty<SVGNames::surfaceScaleAttr, &SVGFESpecularLightingElement::m_surfaceScale>();
+        PropertyRegistry::registerProperty<SVGNames::kernelUnitLengthAttr, &SVGFESpecularLightingElement::m_kernelUnitLengthX, &SVGFESpecularLightingElement::m_kernelUnitLengthY>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGFESpecularLightingElement> SVGFESpecularLightingElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -47,18 +55,6 @@
</span><span class="cx">     return adoptRef(*new SVGFESpecularLightingElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const AtomicString& SVGFESpecularLightingElement::kernelUnitLengthXIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGKernelUnitLengthX", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
-const AtomicString& SVGFESpecularLightingElement::kernelUnitLengthYIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGKernelUnitLengthY", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
</del><span class="cx"> void SVGFESpecularLightingElement::registerAttributes()
</span><span class="cx"> {
</span><span class="cx">     auto& registry = attributeRegistry();
</span><span class="lines">@@ -65,12 +61,6 @@
</span><span class="cx">     if (!registry.isEmpty())
</span><span class="cx">         return;
</span><span class="cx">     registry.registerAttribute<SVGNames::inAttr, &SVGFESpecularLightingElement::m_in1>();
</span><del>-    registry.registerAttribute<SVGNames::specularConstantAttr, &SVGFESpecularLightingElement::m_specularConstant>();
-    registry.registerAttribute<SVGNames::specularExponentAttr, &SVGFESpecularLightingElement::m_specularExponent>();
-    registry.registerAttribute<SVGNames::surfaceScaleAttr, &SVGFESpecularLightingElement::m_surfaceScale>();
-    registry.registerAttribute<SVGNames::kernelUnitLengthAttr,
-        &SVGFESpecularLightingElement::kernelUnitLengthXIdentifier, &SVGFESpecularLightingElement::m_kernelUnitLengthX,
-        &SVGFESpecularLightingElement::kernelUnitLengthYIdentifier, &SVGFESpecularLightingElement::m_kernelUnitLengthY>();
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGFESpecularLightingElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="lines">@@ -81,17 +71,17 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::surfaceScaleAttr) {
</span><del>-        m_surfaceScale.setValue(value.toFloat());
</del><ins>+        m_surfaceScale->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::specularConstantAttr) {
</span><del>-        m_specularConstant.setValue(value.toFloat());
</del><ins>+        m_specularConstant->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::specularExponentAttr) {
</span><del>-        m_specularExponent.setValue(value.toFloat());
</del><ins>+        m_specularExponent->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -98,8 +88,8 @@
</span><span class="cx">     if (name == SVGNames::kernelUnitLengthAttr) {
</span><span class="cx">         float x, y;
</span><span class="cx">         if (parseNumberOptionalNumber(value, x, y)) {
</span><del>-            m_kernelUnitLengthX.setValue(x);
-            m_kernelUnitLengthY.setValue(y);
</del><ins>+            m_kernelUnitLengthX->setBaseValInternal(x);
+            m_kernelUnitLengthY->setBaseValInternal(y);
</ins><span class="cx">         }
</span><span class="cx">         return;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFESpecularLightingElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFESpecularLightingElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFESpecularLightingElement.h  2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFESpecularLightingElement.h     2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "FESpecularLighting.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGFELightElement.h"
</span><span class="cx"> #include "SVGFilterPrimitiveStandardAttributes.h"
</span><span class="cx"> 
</span><span class="lines">@@ -36,18 +35,18 @@
</span><span class="cx">     void lightElementAttributeChanged(const SVGFELightElement*, const QualifiedName&);
</span><span class="cx"> 
</span><span class="cx">     String in1() const { return m_in1.currentValue(attributeOwnerProxy()); }
</span><del>-    float specularConstant() const  { return m_specularConstant.currentValue(attributeOwnerProxy()); }
-    float specularExponent() const { return m_specularExponent.currentValue(attributeOwnerProxy()); }
-    float surfaceScale() const { return m_surfaceScale.currentValue(attributeOwnerProxy()); }
-    float kernelUnitLengthX() const { return m_kernelUnitLengthX.currentValue(attributeOwnerProxy()); }
-    float kernelUnitLengthY() const { return m_kernelUnitLengthY.currentValue(attributeOwnerProxy()); }
</del><ins>+    float specularConstant() const { return m_specularConstant->currentValue(); }
+    float specularExponent() const { return m_specularExponent->currentValue(); }
+    float surfaceScale() const { return m_surfaceScale->currentValue(); }
+    float kernelUnitLengthX() const { return m_kernelUnitLengthX->currentValue(); }
+    float kernelUnitLengthY() const { return m_kernelUnitLengthY->currentValue(); }
</ins><span class="cx"> 
</span><span class="cx">     RefPtr<SVGAnimatedString> in1Animated() { return m_in1.animatedProperty(attributeOwnerProxy()); }
</span><del>-    RefPtr<SVGAnimatedNumber> specularConstantAnimated() { return m_specularConstant.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> specularExponentAnimated() { return m_specularExponent.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> surfaceScaleAnimated() { return m_surfaceScale.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> kernelUnitLengthXAnimated() { return m_kernelUnitLengthX.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> kernelUnitLengthYAnimated() { return m_kernelUnitLengthY.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& specularConstantAnimated() { return m_specularConstant; }
+    SVGAnimatedNumber& specularExponentAnimated() { return m_specularExponent; }
+    SVGAnimatedNumber& surfaceScaleAnimated() { return m_surfaceScale; }
+    SVGAnimatedNumber& kernelUnitLengthXAnimated() { return m_kernelUnitLengthX; }
+    SVGAnimatedNumber& kernelUnitLengthYAnimated() { return m_kernelUnitLengthY; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGFESpecularLightingElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -71,17 +70,14 @@
</span><span class="cx">     bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&) override;
</span><span class="cx">     RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
</span><span class="cx"> 
</span><del>-    static const AtomicString& kernelUnitLengthXIdentifier();
-    static const AtomicString& kernelUnitLengthYIdentifier();
-
</del><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     SVGAnimatedStringAttribute m_in1;
</span><del>-    SVGAnimatedNumberAttribute m_specularConstant { 1 };
-    SVGAnimatedNumberAttribute m_specularExponent { 1 };
-    SVGAnimatedNumberAttribute m_surfaceScale { 1 };
-    SVGAnimatedNumberAttribute m_kernelUnitLengthX;
-    SVGAnimatedNumberAttribute m_kernelUnitLengthY;
</del><ins>+    Ref<SVGAnimatedNumber> m_specularConstant { SVGAnimatedNumber::create(this, 1) };
+    Ref<SVGAnimatedNumber> m_specularExponent { SVGAnimatedNumber::create(this, 1) };
+    Ref<SVGAnimatedNumber> m_surfaceScale { SVGAnimatedNumber::create(this, 1) };
+    Ref<SVGAnimatedNumber> m_kernelUnitLengthX { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_kernelUnitLengthY { SVGAnimatedNumber::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFETurbulenceElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFETurbulenceElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFETurbulenceElement.cpp      2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFETurbulenceElement.cpp 2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2007 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006 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">@@ -38,7 +38,9 @@
</span><span class="cx">     
</span><span class="cx">     static std::once_flag onceFlag;
</span><span class="cx">     std::call_once(onceFlag, [] {
</span><ins>+        PropertyRegistry::registerProperty<SVGNames::baseFrequencyAttr, &SVGFETurbulenceElement::m_baseFrequencyX, &SVGFETurbulenceElement::m_baseFrequencyY>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::numOctavesAttr, &SVGFETurbulenceElement::m_numOctaves>();
</span><ins>+        PropertyRegistry::registerProperty<SVGNames::seedAttr, &SVGFETurbulenceElement::m_seed>();
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -47,27 +49,11 @@
</span><span class="cx">     return adoptRef(*new SVGFETurbulenceElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-const AtomicString& SVGFETurbulenceElement::baseFrequencyXIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGBaseFrequencyX", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
-const AtomicString& SVGFETurbulenceElement::baseFrequencyYIdentifier()
-{
-    static NeverDestroyed<AtomicString> s_identifier("SVGBaseFrequencyY", AtomicString::ConstructFromLiteral);
-    return s_identifier;
-}
-
</del><span class="cx"> void SVGFETurbulenceElement::registerAttributes()
</span><span class="cx"> {
</span><span class="cx">     auto& registry = attributeRegistry();
</span><span class="cx">     if (!registry.isEmpty())
</span><span class="cx">         return;
</span><del>-    registry.registerAttribute<SVGNames::baseFrequencyAttr,
-        &SVGFETurbulenceElement::baseFrequencyXIdentifier, &SVGFETurbulenceElement::m_baseFrequencyX,
-        &SVGFETurbulenceElement::baseFrequencyYIdentifier, &SVGFETurbulenceElement::m_baseFrequencyY>();
-    registry.registerAttribute<SVGNames::seedAttr, &SVGFETurbulenceElement::m_seed>();
</del><span class="cx">     registry.registerAttribute<SVGNames::stitchTilesAttr, SVGStitchOptions, &SVGFETurbulenceElement::m_stitchTiles>();
</span><span class="cx">     registry.registerAttribute<SVGNames::typeAttr, TurbulenceType, &SVGFETurbulenceElement::m_type>();
</span><span class="cx"> }
</span><span class="lines">@@ -91,14 +77,14 @@
</span><span class="cx">     if (name == SVGNames::baseFrequencyAttr) {
</span><span class="cx">         float x, y;
</span><span class="cx">         if (parseNumberOptionalNumber(value, x, y)) {
</span><del>-            m_baseFrequencyX.setValue(x);
-            m_baseFrequencyY.setValue(y);
</del><ins>+            m_baseFrequencyX->setBaseValInternal(x);
+            m_baseFrequencyY->setBaseValInternal(y);
</ins><span class="cx">         }
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::seedAttr) {
</span><del>-        m_seed.setValue(value.toFloat());
</del><ins>+        m_seed->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFETurbulenceElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFETurbulenceElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFETurbulenceElement.h        2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGFETurbulenceElement.h   2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include "FETurbulence.h"
</span><span class="cx"> #include "SVGAnimatedEnumeration.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGFilterPrimitiveStandardAttributes.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -97,17 +96,17 @@
</span><span class="cx"> public:
</span><span class="cx">     static Ref<SVGFETurbulenceElement> create(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><del>-    float baseFrequencyX() const { return m_baseFrequencyX.currentValue(attributeOwnerProxy()); }
-    float baseFrequencyY() const { return m_baseFrequencyY.currentValue(attributeOwnerProxy()); }
</del><ins>+    float baseFrequencyX() const { return m_baseFrequencyX->currentValue(); }
+    float baseFrequencyY() const { return m_baseFrequencyY->currentValue(); }
</ins><span class="cx">     int numOctaves() const { return m_numOctaves->currentValue(); }
</span><del>-    float seed() const { return m_seed.currentValue(attributeOwnerProxy()); }
</del><ins>+    float seed() const { return m_seed->currentValue(); }
</ins><span class="cx">     SVGStitchOptions stitchTiles() const { return m_stitchTiles.currentValue(attributeOwnerProxy()); }
</span><span class="cx">     TurbulenceType type() const { return m_type.currentValue(attributeOwnerProxy()); }
</span><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedNumber> baseFrequencyXAnimated() { return m_baseFrequencyX.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> baseFrequencyYAnimated() { return m_baseFrequencyY.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& baseFrequencyXAnimated() { return m_baseFrequencyX; }
+    SVGAnimatedNumber& baseFrequencyYAnimated() { return m_baseFrequencyY; }
</ins><span class="cx">     SVGAnimatedInteger& numOctavesAnimated() { return m_numOctaves; }
</span><del>-    RefPtr<SVGAnimatedNumber> seedAnimated() { return m_seed.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedNumber& seedAnimated() { return m_seed; }
</ins><span class="cx">     RefPtr<SVGAnimatedEnumeration> stitchTilesAnimated() { return m_stitchTiles.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx">     RefPtr<SVGAnimatedEnumeration> typeAnimated() { return m_type.animatedProperty(attributeOwnerProxy()); }
</span><span class="cx"> 
</span><span class="lines">@@ -133,15 +132,12 @@
</span><span class="cx">     bool setFilterEffectAttribute(FilterEffect*, const QualifiedName& attrName) override;
</span><span class="cx">     RefPtr<FilterEffect> build(SVGFilterBuilder*, Filter&) const override;
</span><span class="cx"> 
</span><del>-    static const AtomicString& baseFrequencyXIdentifier();
-    static const AtomicString& baseFrequencyYIdentifier();
-
</del><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedNumberAttribute m_baseFrequencyX;
-    SVGAnimatedNumberAttribute m_baseFrequencyY;
</del><ins>+    Ref<SVGAnimatedNumber> m_baseFrequencyX { SVGAnimatedNumber::create(this) };
+    Ref<SVGAnimatedNumber> m_baseFrequencyY { SVGAnimatedNumber::create(this) };
</ins><span class="cx">     Ref<SVGAnimatedInteger> m_numOctaves { SVGAnimatedInteger::create(this, 1) };
</span><del>-    SVGAnimatedNumberAttribute m_seed;
</del><ins>+    Ref<SVGAnimatedNumber> m_seed { SVGAnimatedNumber::create(this) };
</ins><span class="cx">     SVGAnimatedEnumerationAttribute<SVGStitchOptions> m_stitchTiles { SVG_STITCHTYPE_NOSTITCH };
</span><span class="cx">     SVGAnimatedEnumerationAttribute<TurbulenceType> m_type { TurbulenceType::Turbulence };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGGeometryElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGGeometryElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGGeometryElement.cpp  2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGGeometryElement.cpp     2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -24,6 +24,8 @@
</span><span class="cx"> #include "SVGGeometryElement.h"
</span><span class="cx"> 
</span><span class="cx"> #include "DOMPoint.h"
</span><ins>+#include "RenderSVGResource.h"
+#include "RenderSVGShape.h"
</ins><span class="cx"> #include "SVGDocumentExtensions.h"
</span><span class="cx"> #include "SVGPathUtilities.h"
</span><span class="cx"> #include "SVGPoint.h"
</span><span class="lines">@@ -36,7 +38,10 @@
</span><span class="cx"> SVGGeometryElement::SVGGeometryElement(const QualifiedName& tagName, Document& document)
</span><span class="cx">     : SVGGraphicsElement(tagName, document)
</span><span class="cx"> {
</span><del>-    registerAttributes();
</del><ins>+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::pathLengthAttr, &SVGGeometryElement::m_pathLength>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> float SVGGeometryElement::getTotalLength() const
</span><span class="lines">@@ -87,19 +92,11 @@
</span><span class="cx">     return renderer->isPointInStroke(point);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGGeometryElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::pathLengthAttr, &SVGGeometryElement::m_pathLength>();
-}
-
</del><span class="cx"> void SVGGeometryElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (name == SVGNames::pathLengthAttr) {
</span><del>-        m_pathLength.setValue(value.toFloat());
-        if (m_pathLength.value() < 0)
</del><ins>+        m_pathLength->setBaseValInternal(value.toFloat());
+        if (m_pathLength->baseVal() < 0)
</ins><span class="cx">             document().accessSVGExtensions().reportError("A negative value for path attribute <pathLength> is not allowed");
</span><span class="cx">         return;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGGeometryElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGGeometryElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGGeometryElement.h    2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGGeometryElement.h       2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "Path.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGGraphicsElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="cx"> 
</span><span class="lines">@@ -43,11 +42,10 @@
</span><span class="cx">     bool isPointInStroke(DOMPointInit&&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGGeometryElement, SVGGraphicsElement>;
</span><del>-    static auto& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
-
</del><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGGeometryElement, SVGGraphicsElement>;
</span><span class="cx"> 
</span><del>-    auto pathLengthAnimated() { return m_pathLength.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    float pathLength() const { return m_pathLength->currentValue(); }
+    SVGAnimatedNumber& pathLengthAnimated() { return m_pathLength; }
</ins><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="cx">     SVGGeometryElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -59,18 +57,11 @@
</span><span class="cx">     bool isSVGGeometryElement() const override { return true; }
</span><span class="cx"> 
</span><span class="cx">     const SVGAttributeOwnerProxy& attributeOwnerProxy() const override { return m_attributeOwnerProxy; }
</span><del>-    static void registerAttributes();
-
</del><span class="cx">     const SVGPropertyRegistry& propertyRegistry() const override { return m_propertyRegistry; }
</span><span class="cx"> 
</span><del>-    static bool isKnownAttribute(const QualifiedName& attributeName)
-    {
-        return AttributeOwnerProxy::isKnownAttribute(attributeName) || PropertyRegistry::isKnownAttribute(attributeName);
-    }
-
</del><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedNumberAttribute m_pathLength;
</del><ins>+    Ref<SVGAnimatedNumber> m_pathLength { SVGAnimatedNumber::create(this) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPathElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPathElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPathElement.h        2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGPathElement.h   2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -22,7 +22,6 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "Path.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGAnimatedPath.h"
</span><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGeometryElement.h"
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPathSegListValuescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPathSegListValues.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPathSegListValues.cpp        2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGPathSegListValues.cpp   2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> #include "SVGPathSegListValues.h"
</span><span class="cx"> 
</span><span class="cx"> #include "SVGPathElement.h"
</span><ins>+#include "SVGPathSegWithContext.h"
</ins><span class="cx"> #include "SVGPathUtilities.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGStopElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGStopElement.cpp (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGStopElement.cpp      2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGStopElement.cpp 2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2007, 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,7 +37,11 @@
</span><span class="cx">     : SVGElement(tagName, document)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::stopTag));
</span><del>-    registerAttributes();
</del><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::offsetAttr, &SVGStopElement::m_offset>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGStopElement> SVGStopElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -45,21 +49,13 @@
</span><span class="cx">     return adoptRef(*new SVGStopElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGStopElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::offsetAttr, &SVGStopElement::m_offset>();
-}
-
</del><span class="cx"> void SVGStopElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (name == SVGNames::offsetAttr) {
</span><span class="cx">         if (value.endsWith('%'))
</span><del>-            m_offset.setValue(value.string().left(value.length() - 1).toFloat() / 100.0f);
</del><ins>+            m_offset->setBaseValInternal(value.string().left(value.length() - 1).toFloat() / 100.0f);
</ins><span class="cx">         else
</span><del>-            m_offset.setValue(value.toFloat());
</del><ins>+            m_offset->setBaseValInternal(value.toFloat());
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGStopElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGStopElement.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGStopElement.h        2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/SVGStopElement.h   2019-03-21 00:35:50 UTC (rev 243266)
</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 "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -33,25 +32,18 @@
</span><span class="cx"> 
</span><span class="cx">     Color stopColorIncludingOpacity() const;
</span><span class="cx"> 
</span><del>-    float offset() { return m_offset.currentValue(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedNumber> offsetAnimated() { return m_offset.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    float offset() const { return m_offset->currentValue(); }
+    SVGAnimatedNumber& offsetAnimated() { return m_offset; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGStopElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGStopElement, SVGElement>;
</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<SVGStopElement, SVGElement>;
</span><span class="cx">     const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
</span><span class="cx"> 
</span><del>-    static bool isKnownAttribute(const QualifiedName& attributeName)
-    {
-        return AttributeOwnerProxy::isKnownAttribute(attributeName) || PropertyRegistry::isKnownAttribute(attributeName);
-    }
-
</del><span class="cx">     void parseAttribute(const QualifiedName&, const AtomicString&) final;
</span><span class="cx">     void svgAttributeChanged(const QualifiedName&) final;
</span><span class="cx"> 
</span><span class="lines">@@ -62,7 +54,7 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedNumberAttribute m_offset { 0 };
</del><ins>+    Ref<SVGAnimatedNumber> m_offset { SVGAnimatedNumber::create(0) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAccessorImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h    2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h       2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -77,6 +77,28 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template<typename OwnerType>
</span><ins>+class SVGAnimatedNumberAccessor final : public SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedNumber> {
+    using Base = SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedNumber>;
+
+public:
+    using Base::Base;
+    using Base::property;
+    template<Ref<SVGAnimatedNumber> OwnerType::*property>
+    constexpr static const SVGMemberAccessor<OwnerType>& singleton() { return Base::template singleton<SVGAnimatedNumberAccessor, property>(); }
+
+private:
+    std::unique_ptr<SVGAttributeAnimator> createAnimator(OwnerType& owner, const QualifiedName& attributeName, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive) const final
+    {
+        return SVGAnimatedNumberAnimator::create(attributeName, property(owner), animationMode, calcMode, isAccumulated, isAdditive);
+    }
+
+    void appendAnimatedInstance(OwnerType& owner, SVGAttributeAnimator& animator) const final
+    {
+        static_cast<SVGAnimatedNumberAnimator&>(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 (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h    2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h       2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -76,6 +76,25 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class SVGAnimatedNumberAnimator final : public SVGAnimatedPropertyAnimator<SVGAnimatedNumber, SVGAnimationNumberFunction> {
+    friend class SVGAnimatedPropertyPairAnimator<SVGAnimatedNumberAnimator, SVGAnimatedNumberAnimator>;
+    friend class SVGAnimatedNumberPairAnimator;
+    using Base = SVGAnimatedPropertyAnimator<SVGAnimatedNumber, SVGAnimationNumberFunction>;
+    using Base::Base;
+
+public:
+    static auto create(const QualifiedName& attributeName, Ref<SVGAnimatedNumber>& animated, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
+    {
+        return std::unique_ptr<SVGAnimatedNumberAnimator>(new SVGAnimatedNumberAnimator(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 (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h    2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h       2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -29,7 +29,6 @@
</span><span class="cx"> #include "SVGAnimatedEnumeration.h"
</span><span class="cx"> #include "SVGAnimatedLength.h"
</span><span class="cx"> #include "SVGAnimatedLengthList.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGAnimatedNumberList.h"
</span><span class="cx"> #include "SVGAnimatedPointList.h"
</span><span class="cx"> #include "SVGAnimatedPrimitiveProperty.h"
</span><span class="lines">@@ -43,6 +42,7 @@
</span><span class="cx"> 
</span><span class="cx"> using SVGAnimatedBoolean = SVGAnimatedPrimitiveProperty<bool>;
</span><span class="cx"> using SVGAnimatedInteger = SVGAnimatedPrimitiveProperty<int>;
</span><ins>+using SVGAnimatedNumber = SVGAnimatedPrimitiveProperty<float>;
</ins><span class="cx"> 
</span><span class="cx"> using SVGAnimatedRect = SVGAnimatedValueProperty<SVGRect>;
</span><span class="cx"> using SVGAnimatedPreserveAspectRatio = SVGAnimatedValueProperty<SVGPreserveAspectRatio>;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyPairAccessorImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyPairAccessorImpl.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyPairAccessorImpl.h        2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyPairAccessorImpl.h   2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -69,4 +69,39 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template<typename OwnerType>
+class SVGAnimatedNumberPairAccessor final : public SVGAnimatedPropertyPairAccessor<OwnerType, SVGAnimatedNumberAccessor<OwnerType>, SVGAnimatedNumberAccessor<OwnerType>> {
+    using Base = SVGAnimatedPropertyPairAccessor<OwnerType, SVGAnimatedNumberAccessor<OwnerType>, SVGAnimatedNumberAccessor<OwnerType>>;
+    using Base::property1;
+    using Base::property2;
+
+public:
+    using Base::Base;
+    template<Ref<SVGAnimatedNumber> OwnerType::*property1, Ref<SVGAnimatedNumber> OwnerType::*property2 >
+    constexpr static const SVGMemberAccessor<OwnerType>& singleton() { return Base::template singleton<SVGAnimatedNumberPairAccessor, property1, property2>(); }
+
+private:
+    Optional<String> synchronize(const OwnerType& owner) const final
+    {
+        bool dirty1 = property1(owner)->isDirty();
+        bool dirty2 = property2(owner)->isDirty();
+        if (!(dirty1 || dirty2))
+            return WTF::nullopt;
+
+        String string1 = dirty1 ? *property1(owner)->synchronize() : property1(owner)->baseValAsString();
+        String string2 = dirty2 ? *property2(owner)->synchronize() : property2(owner)->baseValAsString();
+        return string1 == string2 ? string1 : string1 + ", " + string2;
+    }
+
+    std::unique_ptr<SVGAttributeAnimator> createAnimator(OwnerType& owner, const QualifiedName& attributeName, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive) const final
+    {
+        return SVGAnimatedNumberPairAnimator::create(attributeName, property1(owner), property2(owner), animationMode, calcMode, isAccumulated, isAdditive);
+    }
+
+    void appendAnimatedInstance(OwnerType& owner, SVGAttributeAnimator& animator) const final
+    {
+        static_cast<SVGAnimatedNumberPairAnimator&>(animator).appendAnimatedInstance(property1(owner), property2(owner));
+    }
+};
+
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyPairAnimatorImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyPairAnimatorImpl.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyPairAnimatorImpl.h        2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyPairAnimatorImpl.h   2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -76,4 +76,47 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class SVGAnimatedNumberPairAnimator final : public SVGAnimatedPropertyPairAnimator<SVGAnimatedNumberAnimator, SVGAnimatedNumberAnimator> {
+    using Base = SVGAnimatedPropertyPairAnimator<SVGAnimatedNumberAnimator, SVGAnimatedNumberAnimator>;
+    using Base::Base;
+
+public:
+    static auto create(const QualifiedName& attributeName, Ref<SVGAnimatedNumber>& animated1, Ref<SVGAnimatedNumber>& animated2, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
+    {
+        return std::unique_ptr<SVGAnimatedNumberPairAnimator>(new SVGAnimatedNumberPairAnimator(attributeName, animated1, animated2, animationMode, calcMode, isAccumulated, isAdditive));
+    }
+
+private:
+    void setFromAndToValues(SVGElement*, const String& from, const String& to) final
+    {
+        auto pairFrom = SVGPropertyTraits<std::pair<float, float>>::fromString(from);
+        auto pairTo = SVGPropertyTraits<std::pair<float, float>>::fromString(to);
+        
+        m_animatedPropertyAnimator1->m_function.m_from = pairFrom.first;
+        m_animatedPropertyAnimator1->m_function.m_to = pairTo.first;
+        
+        m_animatedPropertyAnimator2->m_function.m_from = pairFrom.second;
+        m_animatedPropertyAnimator2->m_function.m_to = pairTo.second;
+    }
+
+    void setFromAndByValues(SVGElement*, const String& from, const String& by) final
+    {
+        auto pairFrom = SVGPropertyTraits<std::pair<float, float>>::fromString(from);
+        auto pairBy = SVGPropertyTraits<std::pair<float, float>>::fromString(by);
+        
+        m_animatedPropertyAnimator1->m_function.m_from = pairFrom.first;
+        m_animatedPropertyAnimator1->m_function.m_to = pairFrom.first + pairBy.first;
+        
+        m_animatedPropertyAnimator2->m_function.m_from = pairFrom.second;
+        m_animatedPropertyAnimator2->m_function.m_to = pairFrom.second + pairBy.second;
+    }
+
+    void setToAtEndOfDurationValue(const String& toAtEndOfDuration) final
+    {
+        auto pairToAtEndOfDuration = SVGPropertyTraits<std::pair<float, float>>::fromString(toAtEndOfDuration);
+        m_animatedPropertyAnimator1->m_function.m_toAtEndOfDuration = pairToAtEndOfDuration.first;
+        m_animatedPropertyAnimator2->m_function.m_toAtEndOfDuration = pairToAtEndOfDuration.second;
+    }
+};
+
</ins><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveValueFunctionImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveValueFunctionImpl.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveValueFunctionImpl.h      2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveValueFunctionImpl.h 2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -120,7 +120,47 @@
</span><span class="cx">         m_to += m_from;
</span><span class="cx">     }
</span><span class="cx"> };
</span><del>-    
</del><ins>+
+class SVGAnimationNumberFunction : public SVGAnimationAdditiveValueFunction<float> {
+    friend class SVGAnimatedNumberPairAnimator;
+
+public:
+    using Base = SVGAnimationAdditiveValueFunction<float>;
+    using Base::Base;
+
+    void setFromAndToValues(SVGElement*, const String& from, const String& to) override
+    {
+        m_from = SVGPropertyTraits<float>::fromString(from);
+        m_to = SVGPropertyTraits<float>::fromString(to);
+    }
+
+    void setToAtEndOfDurationValue(const String& toAtEndOfDuration) override
+    {
+        m_toAtEndOfDuration = SVGPropertyTraits<float>::fromString(toAtEndOfDuration);
+    }
+
+    void progress(SVGElement*, float percentage, unsigned repeatCount, float& animated)
+    {
+        float from = m_animationMode == AnimationMode::To ? animated : m_from;
+        animated = Base::progress(percentage, repeatCount, from, m_to, toAtEndOfDuration(), animated);
+    }
+
+    float calculateDistance(SVGElement*, const String& from, const String& to) const override
+    {
+        float fromNumber = 0;
+        float toNumber = 0;
+        parseNumberFromString(from, fromNumber);
+        parseNumberFromString(to, toNumber);
+        return fabsf(toNumber - fromNumber);
+    }
+
+private:
+    void addFromAndToValues(SVGElement*) override
+    {
+        m_to += m_from;
+    }
+};
+
</ins><span class="cx"> class SVGAnimationRectFunction : public SVGAnimationAdditiveValueFunction<FloatRect> {
</span><span class="cx"> public:
</span><span class="cx">     using Base = SVGAnimationAdditiveValueFunction<FloatRect>;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAttributeRegistryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h       2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h  2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -28,7 +28,6 @@
</span><span class="cx"> #include "SVGAnimatedEnumeration.h"
</span><span class="cx"> #include "SVGAnimatedLength.h"
</span><span class="cx"> #include "SVGAnimatedLengthList.h"
</span><del>-#include "SVGAnimatedNumber.h"
</del><span class="cx"> #include "SVGAnimatedNumberList.h"
</span><span class="cx"> #include "SVGAnimatedPointList.h"
</span><span class="cx"> #include "SVGAnimatedString.h"
</span><span class="lines">@@ -74,12 +73,6 @@
</span><span class="cx">         registerAttribute(SVGAnimatedLengthListAttributeAccessor<OwnerType>::template singleton<attributeName, attribute>());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, SVGAnimatedNumberAttribute OwnerType::*attribute>
-    void registerAttribute()
-    {
-        registerAttribute(SVGAnimatedNumberAttributeAccessor<OwnerType>::template singleton<attributeName, attribute>());
-    }
-
</del><span class="cx">     template<const LazyNeverDestroyed<const QualifiedName>& attributeName, SVGAnimatedNumberListAttribute OwnerType::*attribute>
</span><span class="cx">     void registerAttribute()
</span><span class="cx">     {
</span><span class="lines">@@ -86,14 +79,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,
-        const AtomicString& (*identifier)(), SVGAnimatedNumberAttribute OwnerType::*attribute,
-        const AtomicString& (*optionalIdentifier)(), SVGAnimatedNumberAttribute OwnerType::*optionalAttribute>
-    void registerAttribute()
-    {
-        registerAttribute(SVGAnimatedOptionalNumberAttributeAccessor<OwnerType>::template singleton<attributeName, identifier, attribute, optionalIdentifier, optionalAttribute>());
-    }
-
</del><span class="cx">     template<const LazyNeverDestroyed<const QualifiedName>& attributeName, SVGAnimatedPointListAttribute OwnerType::*attribute>
</span><span class="cx">     void registerAttribute()
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGPrimitivePropertyAnimatorImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGPrimitivePropertyAnimatorImpl.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGPrimitivePropertyAnimatorImpl.h   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGPrimitivePropertyAnimatorImpl.h      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -25,11 +25,12 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGAnimationFunction.h"
</del><ins>+#include "SVGAnimationAdditiveValueFunctionImpl.h"
</ins><span class="cx"> #include "SVGPrimitivePropertyAnimator.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> using SVGColorAnimator = SVGPrimitivePropertyAnimator<Color, SVGAnimationColorFunction>;
</span><ins>+using SVGNumberAnimator = SVGPrimitivePropertyAnimator<float, SVGAnimationNumberFunction>;
</ins><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGPropertyAnimatorFactoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGPropertyAnimatorFactory.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGPropertyAnimatorFactory.h 2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGPropertyAnimatorFactory.h    2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -80,6 +80,11 @@
</span><span class="cx">         return SVGColorAnimator::create(attributeName, WTFMove(property), animationMode, calcMode, isAccumulated, isAdditive);
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    static auto createNumberAnimator(const QualifiedName& attributeName, Ref<SVGProperty>&& property, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
+    {
+        return SVGNumberAnimator::create(attributeName,  WTFMove(property), animationMode, calcMode, isAccumulated, isAdditive);
+    }
+
</ins><span class="cx">     static const AttributeAnimatorCreator& attributeAnimatorCreator()
</span><span class="cx">     {
</span><span class="cx">         static NeverDestroyed<AttributeAnimatorCreator> map = AttributeAnimatorCreator({
</span><span class="lines">@@ -89,6 +94,13 @@
</span><span class="cx">             { SVGNames::lighting_colorAttr->impl(), std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
</span><span class="cx">             { SVGNames::stop_colorAttr->impl(),     std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
</span><span class="cx">             { SVGNames::strokeAttr->impl(),         std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
</span><ins>+
+            { SVGNames::fill_opacityAttr->impl(),       std::make_pair(SVGValueProperty<float>::create, SVGPropertyAnimatorFactory::createNumberAnimator) },
+            { SVGNames::flood_opacityAttr->impl(),      std::make_pair(SVGValueProperty<float>::create, SVGPropertyAnimatorFactory::createNumberAnimator) },
+            { SVGNames::opacityAttr->impl(),            std::make_pair(SVGValueProperty<float>::create, SVGPropertyAnimatorFactory::createNumberAnimator) },
+            { SVGNames::stop_opacityAttr->impl(),       std::make_pair(SVGValueProperty<float>::create, SVGPropertyAnimatorFactory::createNumberAnimator) },
+            { SVGNames::stroke_miterlimitAttr->impl(),  std::make_pair(SVGValueProperty<float>::create, SVGPropertyAnimatorFactory::createNumberAnimator) },
+            { SVGNames::stroke_opacityAttr->impl(),     std::make_pair(SVGValueProperty<float>::create, SVGPropertyAnimatorFactory::createNumberAnimator) },
</ins><span class="cx">         });
</span><span class="cx">         return map;
</span><span class="cx">     }
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGPropertyOwnerRegistryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h (243265 => 243266)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h   2019-03-21 00:27:58 UTC (rev 243265)
+++ trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h      2019-03-21 00:35:50 UTC (rev 243266)
</span><span class="lines">@@ -60,7 +60,13 @@
</span><span class="cx">     {
</span><span class="cx">         registerProperty(attributeName, SVGAnimatedIntegerAccessor<OwnerType>::template singleton<property>());
</span><span class="cx">     }
</span><del>-    
</del><ins>+
+    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedNumber> OwnerType::*property>
+    static void registerProperty()
+    {
+        registerProperty(attributeName, SVGAnimatedNumberAccessor<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 class="lines">@@ -78,6 +84,13 @@
</span><span class="cx">     {
</span><span class="cx">         registerProperty(attributeName, SVGAnimatedIntegerPairAccessor<OwnerType>::template singleton<property1, property2>());
</span><span class="cx">     }
</span><ins>+
+    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedNumber> OwnerType::*property1, Ref<SVGAnimatedNumber> OwnerType::*property2>
+    static void registerProperty()
+    {
+        registerProperty(attributeName, SVGAnimatedNumberPairAccessor<OwnerType>::template singleton<property1, property2>());
+    }
+
</ins><span class="cx">     // Enumerate all the SVGMemberAccessors recursively. The functor will be called and will
</span><span class="cx">     // be given the pair<QualifiedName, SVGMemberAccessor> till the functor returns false.
</span><span class="cx">     template<typename Functor>
</span></span></pre>
</div>
</div>

</body>
</html>