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

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

<h3>Log Message</h3>
<pre>Remove the SVG tear off objects for SVGLength, SVGLengthList and SVGAnimatedLengthList
https://bugs.webkit.org/show_bug.cgi?id=196083

Reviewed by Simon Fraser.

Source/WebCore:

-- SVGLength will be a superclass of SVGValueProperty<SVGLengthValue>. It
   is a wrapper of SVGLengthValue. It will be provide the DOM methods. It
   can setValueAsString() and return valueAsString().

-- SVGLengthList will be a superclass of SVGValuePropertyList<SVGLength>.
   The base class will provide all the DOM methods. SVGLengthList will be
   responsible for parsing a String to a SVGLength items. It can also
   build a string representing the stored items.

-- SVGAnimatedLengthList will be defined as SVGAnimatedPropertyList<SVGLengthList>.
   Like SVGAnimatedPointList, all the required methods and attributes
   will be handled by SVGAnimatedPropertyList.

-- SVGAnimatedLengthAccessor and SVGAnimatedLengthListAccessor will be
   added to access the members of types SVGAnimatedLength and
   SVGAnimatedLengthList.

-- SVGAnimatedLengthAnimator and SVGAnimatedLengthListAnimator will be
   created by the the new accessors to animate attributes of types
   SVGAnimatedLength and SVGAnimatedLengthList.

-- SVGAnimationLengthFunction and SVGAnimationLengthListFunction will be
   responsible for progressing the animVal() of attributes of types
   SVGAnimatedLength and SVGAnimatedLengthList.

-- SVGValuePropertyAnimator is a new template class which can animate a
   none reflecting attribute which should be backed by a value property,
   e.g. SVGLength.

-- SVGValuePropertyListAnimator is a new template class which can animate a
   none reflecting attribute which should be backed by a value property
   list, e.g. SVGLengthList.

Notes:

    -- SVGElement::isAnimatedStyleAttribute() will return true if the
       attribute is known by SVGPropertyAnimatorFactory. Or it's has
       a reflecting SVGAnimatedPropertyLength property and its name is
       one of the names listed in isAnimatedStylePropertyAttribute() of
       the propertyRegistry() of the SVGElement.

    -- SVGElement::commitPropertyChange() has to handle the attributes
       for which isAnimatedStylePropertyAttribute() returns true different
       from the other ones. styleReclac() needs updated attributes since
       it does not access the reflecting properties in the SVGELement.

    -- SVGTextContentElement does not need a customized SVGAnimatedLength.
       All SVGTextContentElement::textLengthAnimated() needs to know is
       whether m_textLength->baseVal() holds an empty SVGLength. If it
       does, it sets its value to getComputedTextLength().

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* rendering/svg/SVGTextLayoutAttributesBuilder.cpp:
(WebCore::updateCharacterData):
(WebCore::SVGTextLayoutAttributesBuilder::fillCharacterDataMap):
* svg/SVGAnimateElementBase.cpp:
(WebCore::SVGAnimateElementBase::hasValidAttributeType const):
* svg/SVGAnimatedLength.cpp: Removed.
* svg/SVGAnimatedLength.h: Removed.
* svg/SVGAnimatedLengthList.cpp: Removed.
* svg/SVGAnimatedLengthList.h: Removed.
* svg/SVGAnimatedType.h:
(WebCore::SVGAnimatedType::type const):
* svg/SVGAnimationElement.cpp:
(WebCore::SVGAnimationElement::isTargetAttributeCSSProperty):
(WebCore::inheritsFromProperty):
* svg/SVGAnimatorFactory.h:
(WebCore::SVGAnimatorFactory::isSupportedAttribute):
(WebCore::SVGAnimatorFactory::create):
These changes were required because some of the tests were trying to
animated unsupported attributes. To differentiate between between the
these two cases:
    1) the attribute is animate-able by the legacy controller.
    2) animating the attribute or the attribute itself is not supported
       by the element.

We want SVGAnimatorFactory tell us whether it can create an animator for
a given attribute or not.

* svg/SVGCircleElement.cpp:
(WebCore::SVGCircleElement::SVGCircleElement):
(WebCore::SVGCircleElement::parseAttribute):
(WebCore::SVGCircleElement::svgAttributeChanged):
(WebCore::SVGCircleElement::registerAttributes): Deleted.
* svg/SVGCircleElement.h:
* svg/SVGCursorElement.cpp:
(WebCore::SVGCursorElement::SVGCursorElement):
(WebCore::SVGCursorElement::parseAttribute):
(WebCore::SVGCursorElement::svgAttributeChanged):
(WebCore::SVGCursorElement::registerAttributes): Deleted.
* svg/SVGCursorElement.h:
* svg/SVGElement.cpp:
(WebCore::SVGElement::commitPropertyChange):
(WebCore::SVGElement::isAnimatedStyleAttribute const):
* svg/SVGElement.h:
* svg/SVGEllipseElement.cpp:
(WebCore::SVGEllipseElement::SVGEllipseElement):
(WebCore::SVGEllipseElement::parseAttribute):
(WebCore::SVGEllipseElement::svgAttributeChanged):
(WebCore::SVGEllipseElement::registerAttributes): Deleted.
* svg/SVGEllipseElement.h:
* svg/SVGFilterElement.cpp:
(WebCore::SVGFilterElement::SVGFilterElement):
(WebCore::SVGFilterElement::registerAttributes):
(WebCore::SVGFilterElement::parseAttribute):
* svg/SVGFilterElement.h:
* svg/SVGFilterPrimitiveStandardAttributes.cpp:
(WebCore::SVGFilterPrimitiveStandardAttributes::SVGFilterPrimitiveStandardAttributes):
(WebCore::SVGFilterPrimitiveStandardAttributes::parseAttribute):
(WebCore::SVGFilterPrimitiveStandardAttributes::registerAttributes): Deleted.
* svg/SVGFilterPrimitiveStandardAttributes.h:
(WebCore::SVGFilterPrimitiveStandardAttributes::x const):
(WebCore::SVGFilterPrimitiveStandardAttributes::y const):
(WebCore::SVGFilterPrimitiveStandardAttributes::width const):
(WebCore::SVGFilterPrimitiveStandardAttributes::height const):
(WebCore::SVGFilterPrimitiveStandardAttributes::xAnimated):
(WebCore::SVGFilterPrimitiveStandardAttributes::yAnimated):
(WebCore::SVGFilterPrimitiveStandardAttributes::widthAnimated):
(WebCore::SVGFilterPrimitiveStandardAttributes::heightAnimated):
(WebCore::SVGFilterPrimitiveStandardAttributes::isKnownAttribute): Deleted.
* svg/SVGForeignObjectElement.cpp:
(WebCore::SVGForeignObjectElement::SVGForeignObjectElement):
(WebCore::SVGForeignObjectElement::parseAttribute):
(WebCore::SVGForeignObjectElement::registerAttributes): Deleted.
* svg/SVGForeignObjectElement.h:
* svg/SVGImageElement.cpp:
(WebCore::SVGImageElement::SVGImageElement):
(WebCore::SVGImageElement::parseAttribute):
(WebCore::SVGImageElement::registerAttributes): Deleted.
* svg/SVGImageElement.h:
* svg/SVGLength.h:
(WebCore::SVGLength::create):
(WebCore::SVGLength::clone const):
(WebCore::SVGLength::unitType):
(WebCore::SVGLength::valueForBindings):
(WebCore::SVGLength::setValueForBindings):
(WebCore::SVGLength::valueInSpecifiedUnits):
(WebCore::SVGLength::setValueInSpecifiedUnits):
(WebCore::SVGLength::setValueAsString):
(WebCore::SVGLength::newValueSpecifiedUnits):
(WebCore::SVGLength::convertToSpecifiedUnits):
(WebCore::SVGLength::valueAsString): Deleted.
(WebCore::SVGLength::SVGLength): Deleted.
* svg/SVGLengthList.h:
(WebCore::SVGLengthList::create):
(WebCore::SVGLengthList::lengthMode const):
(WebCore::SVGLengthList::parse):
(WebCore::SVGLengthList::SVGLengthList):
* svg/SVGLengthListValues.cpp: Removed.
* svg/SVGLengthListValues.h: Removed.
* svg/SVGLineElement.cpp:
(WebCore::SVGLineElement::SVGLineElement):
(WebCore::SVGLineElement::parseAttribute):
(WebCore::SVGLineElement::svgAttributeChanged):
(WebCore::SVGLineElement::registerAttributes): Deleted.
* svg/SVGLineElement.h:
* svg/SVGLinearGradientElement.cpp:
(WebCore::SVGLinearGradientElement::SVGLinearGradientElement):
(WebCore::SVGLinearGradientElement::parseAttribute):
(WebCore::SVGLinearGradientElement::svgAttributeChanged):
(WebCore::SVGLinearGradientElement::registerAttributes): Deleted.
* svg/SVGLinearGradientElement.h:
* svg/SVGMarkerElement.cpp:
(WebCore::SVGMarkerElement::SVGMarkerElement):
(WebCore::SVGMarkerElement::registerAttributes):
(WebCore::SVGMarkerElement::parseAttribute):
* svg/SVGMarkerElement.h:
* svg/SVGMaskElement.cpp:
(WebCore::SVGMaskElement::SVGMaskElement):
(WebCore::SVGMaskElement::registerAttributes):
(WebCore::SVGMaskElement::parseAttribute):
(WebCore::SVGMaskElement::svgAttributeChanged):
* svg/SVGMaskElement.h:
* svg/SVGPatternElement.cpp:
(WebCore::SVGPatternElement::SVGPatternElement):
(WebCore::SVGPatternElement::registerAttributes):
(WebCore::SVGPatternElement::parseAttribute):
* svg/SVGPatternElement.h:
* svg/SVGPoint.h:
* svg/SVGRadialGradientElement.cpp:
(WebCore::SVGRadialGradientElement::SVGRadialGradientElement):
(WebCore::SVGRadialGradientElement::parseAttribute):
(WebCore::SVGRadialGradientElement::svgAttributeChanged):
(WebCore::SVGRadialGradientElement::registerAttributes): Deleted.
* svg/SVGRadialGradientElement.h:
* svg/SVGRectElement.cpp:
(WebCore::SVGRectElement::SVGRectElement):
(WebCore::SVGRectElement::parseAttribute):
(WebCore::SVGRectElement::svgAttributeChanged):
(WebCore::SVGRectElement::registerAttributes): Deleted.
* svg/SVGRectElement.h:
* svg/SVGSVGElement.cpp:
(WebCore::SVGSVGElement::SVGSVGElement):
(WebCore::SVGSVGElement::parseAttribute):
(WebCore::SVGSVGElement::svgAttributeChanged):
(WebCore::SVGSVGElement::registerAttributes): Deleted.
* svg/SVGSVGElement.h:
* svg/SVGTextContentElement.cpp:
(WebCore::SVGTextContentElement::SVGTextContentElement):
(WebCore::SVGTextContentElement::registerAttributes):
(WebCore::SVGTextContentElement::parseAttribute):
(WebCore::SVGTextContentElement::svgAttributeChanged):
(WebCore::SVGTextContentElement::textLengthAnimated):
* svg/SVGTextContentElement.h:
(WebCore::SVGTextContentElement::specifiedTextLength const):
(WebCore::SVGTextContentElement::textLength const):
(WebCore::SVGTextContentElement::specifiedTextLength): Deleted.
(WebCore::SVGTextContentElement::textLengthAnimated): Deleted.
(WebCore::SVGTextContentElement::SVGAnimatedCustomLengthAttribute::SVGAnimatedCustomLengthAttribute): Deleted.
(WebCore::SVGTextContentElement::SVGAnimatedCustomLengthAttribute::synchronize): Deleted.
(WebCore::SVGTextContentElement::SVGAnimatedCustomLengthAttribute::animatedProperty): Deleted.
* svg/SVGTextPathElement.cpp:
(WebCore::SVGTextPathElement::SVGTextPathElement):
(WebCore::SVGTextPathElement::registerAttributes):
(WebCore::SVGTextPathElement::parseAttribute):
* svg/SVGTextPathElement.h:
* svg/SVGTextPositioningElement.cpp:
(WebCore::SVGTextPositioningElement::SVGTextPositioningElement):
(WebCore::SVGTextPositioningElement::parseAttribute):
(WebCore::SVGTextPositioningElement::svgAttributeChanged):
(WebCore::SVGTextPositioningElement::registerAttributes): Deleted.
* svg/SVGTextPositioningElement.h:
(WebCore::SVGTextPositioningElement::x const):
(WebCore::SVGTextPositioningElement::y const):
(WebCore::SVGTextPositioningElement::dx const):
(WebCore::SVGTextPositioningElement::dy const):
(WebCore::SVGTextPositioningElement::xAnimated):
(WebCore::SVGTextPositioningElement::yAnimated):
(WebCore::SVGTextPositioningElement::dxAnimated):
(WebCore::SVGTextPositioningElement::dyAnimated):
(WebCore::SVGTextPositioningElement::isKnownAttribute): Deleted.
* svg/SVGUseElement.cpp:
(WebCore::SVGUseElement::SVGUseElement):
(WebCore::SVGUseElement::parseAttribute):
(WebCore::SVGUseElement::svgAttributeChanged):
(WebCore::SVGUseElement::registerAttributes): Deleted.
* svg/SVGUseElement.h:
* svg/SVGValue.h:
* svg/properties/SVGAnimatedPropertyAccessorImpl.h:
* svg/properties/SVGAnimatedPropertyAnimator.h:
* svg/properties/SVGAnimatedPropertyAnimatorImpl.h:
* svg/properties/SVGAnimatedPropertyImpl.h:
* svg/properties/SVGAnimationAdditiveListFunctionImpl.h:
(WebCore::SVGAnimationLengthListFunction::SVGAnimationLengthListFunction):
(WebCore::SVGAnimationLengthListFunction::progress):
(WebCore::SVGAnimationNumberListFunction::progress):
(WebCore::SVGAnimationPointListFunction::progress):
* svg/properties/SVGAnimationAdditiveValueFunctionImpl.h:
(WebCore::SVGAnimationLengthFunction::SVGAnimationLengthFunction):
(WebCore::SVGAnimationLengthFunction::progress):
* svg/properties/SVGAttributeAnimator.cpp:
(WebCore::SVGAttributeAnimator::isAnimatedStylePropertyAniamtor const):
* svg/properties/SVGAttributeAnimator.h:
* svg/properties/SVGAttributeRegistry.h:
* svg/properties/SVGPropertyAnimatorFactory.h:
(WebCore::SVGPropertyAnimatorFactory::createLengthAnimator):
(WebCore::SVGPropertyAnimatorFactory::createLengthListAnimator):
(WebCore::SVGPropertyAnimatorFactory::attributeAnimatorCreator):
* svg/properties/SVGPropertyOwnerRegistry.h:
(WebCore::SVGPropertyOwnerRegistry::registerProperty):
(WebCore::SVGPropertyOwnerRegistry::isAnimatedLengthAttribute):
* svg/properties/SVGPropertyRegistry.h:
* svg/properties/SVGValuePropertyAnimator.h: Added.
(WebCore::SVGValuePropertyAnimator::SVGValuePropertyAnimator):
* svg/properties/SVGValuePropertyAnimatorImpl.h: Added.
* svg/properties/SVGValuePropertyListAnimator.h: Added.
(WebCore::SVGValuePropertyListAnimator::SVGValuePropertyListAnimator):
* svg/properties/SVGValuePropertyListAnimatorImpl.h: Added.

LayoutTests:

* platform/win/TestExpectations:
* svg/animations/svglength-element-removed-crash.svg:
* svg/dom/SVGLengthList-appendItem-expected.txt:
* svg/dom/SVGLengthList-appendItem.xhtml:
* svg/dom/SVGLengthList-basics-expected.txt:
* svg/dom/SVGLengthList-basics.xhtml:
* svg/dom/SVGLengthList-initialize-expected.txt:
* svg/dom/SVGLengthList-initialize.xhtml:
* svg/dom/SVGLengthList-insertItemBefore-expected.txt:
* svg/dom/SVGLengthList-insertItemBefore.xhtml:
* svg/dom/SVGLengthList-removeItem-expected.txt:
* svg/dom/SVGLengthList-removeItem.xhtml:
* svg/dom/SVGLengthList-replaceItem-expected.txt:
* svg/dom/SVGLengthList-replaceItem.xhtml:
This changes are required because SVGLengthList will be following the SVG2
specs regarding adding new items to the list.

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformwinTestExpectations">trunk/LayoutTests/platform/win/TestExpectations</a></li>
<li><a href="#trunkLayoutTestssvganimationssvglengthelementremovedcrashsvg">trunk/LayoutTests/svg/animations/svglength-element-removed-crash.svg</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListappendItemexpectedtxt">trunk/LayoutTests/svg/dom/SVGLengthList-appendItem-expected.txt</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListappendItemxhtml">trunk/LayoutTests/svg/dom/SVGLengthList-appendItem.xhtml</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListbasicsexpectedtxt">trunk/LayoutTests/svg/dom/SVGLengthList-basics-expected.txt</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListbasicsxhtml">trunk/LayoutTests/svg/dom/SVGLengthList-basics.xhtml</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListinitializeexpectedtxt">trunk/LayoutTests/svg/dom/SVGLengthList-initialize-expected.txt</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListinitializexhtml">trunk/LayoutTests/svg/dom/SVGLengthList-initialize.xhtml</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListinsertItemBeforeexpectedtxt">trunk/LayoutTests/svg/dom/SVGLengthList-insertItemBefore-expected.txt</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListinsertItemBeforexhtml">trunk/LayoutTests/svg/dom/SVGLengthList-insertItemBefore.xhtml</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListremoveItemexpectedtxt">trunk/LayoutTests/svg/dom/SVGLengthList-removeItem-expected.txt</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListremoveItemxhtml">trunk/LayoutTests/svg/dom/SVGLengthList-removeItem.xhtml</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListreplaceItemexpectedtxt">trunk/LayoutTests/svg/dom/SVGLengthList-replaceItem-expected.txt</a></li>
<li><a href="#trunkLayoutTestssvgdomSVGLengthListreplaceItemxhtml">trunk/LayoutTests/svg/dom/SVGLengthList-replaceItem.xhtml</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreSourcestxt">trunk/Source/WebCore/Sources.txt</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCorerenderingsvgSVGTextLayoutAttributesBuildercpp">trunk/Source/WebCore/rendering/svg/SVGTextLayoutAttributesBuilder.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimateElementBasecpp">trunk/Source/WebCore/svg/SVGAnimateElementBase.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedTypeh">trunk/Source/WebCore/svg/SVGAnimatedType.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimationElementcpp">trunk/Source/WebCore/svg/SVGAnimationElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatorFactoryh">trunk/Source/WebCore/svg/SVGAnimatorFactory.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGCircleElementcpp">trunk/Source/WebCore/svg/SVGCircleElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGCircleElementh">trunk/Source/WebCore/svg/SVGCircleElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGCursorElementcpp">trunk/Source/WebCore/svg/SVGCursorElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGCursorElementh">trunk/Source/WebCore/svg/SVGCursorElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGElementcpp">trunk/Source/WebCore/svg/SVGElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGElementh">trunk/Source/WebCore/svg/SVGElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGEllipseElementcpp">trunk/Source/WebCore/svg/SVGEllipseElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGEllipseElementh">trunk/Source/WebCore/svg/SVGEllipseElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFilterElementcpp">trunk/Source/WebCore/svg/SVGFilterElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFilterElementh">trunk/Source/WebCore/svg/SVGFilterElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFilterPrimitiveStandardAttributescpp">trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGFilterPrimitiveStandardAttributesh">trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGForeignObjectElementcpp">trunk/Source/WebCore/svg/SVGForeignObjectElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGForeignObjectElementh">trunk/Source/WebCore/svg/SVGForeignObjectElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGImageElementcpp">trunk/Source/WebCore/svg/SVGImageElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGImageElementh">trunk/Source/WebCore/svg/SVGImageElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGLengthh">trunk/Source/WebCore/svg/SVGLength.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGLengthListh">trunk/Source/WebCore/svg/SVGLengthList.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGLineElementcpp">trunk/Source/WebCore/svg/SVGLineElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGLineElementh">trunk/Source/WebCore/svg/SVGLineElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGLinearGradientElementcpp">trunk/Source/WebCore/svg/SVGLinearGradientElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGLinearGradientElementh">trunk/Source/WebCore/svg/SVGLinearGradientElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGMarkerElementcpp">trunk/Source/WebCore/svg/SVGMarkerElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGMarkerElementh">trunk/Source/WebCore/svg/SVGMarkerElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGMaskElementcpp">trunk/Source/WebCore/svg/SVGMaskElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGMaskElementh">trunk/Source/WebCore/svg/SVGMaskElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPatternElementcpp">trunk/Source/WebCore/svg/SVGPatternElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPatternElementh">trunk/Source/WebCore/svg/SVGPatternElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGPointh">trunk/Source/WebCore/svg/SVGPoint.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGRadialGradientElementcpp">trunk/Source/WebCore/svg/SVGRadialGradientElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGRadialGradientElementh">trunk/Source/WebCore/svg/SVGRadialGradientElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGRectElementcpp">trunk/Source/WebCore/svg/SVGRectElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGRectElementh">trunk/Source/WebCore/svg/SVGRectElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGSVGElementcpp">trunk/Source/WebCore/svg/SVGSVGElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGSVGElementh">trunk/Source/WebCore/svg/SVGSVGElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGTextContentElementcpp">trunk/Source/WebCore/svg/SVGTextContentElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGTextContentElementh">trunk/Source/WebCore/svg/SVGTextContentElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGTextPathElementcpp">trunk/Source/WebCore/svg/SVGTextPathElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGTextPathElementh">trunk/Source/WebCore/svg/SVGTextPathElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGTextPositioningElementcpp">trunk/Source/WebCore/svg/SVGTextPositioningElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGTextPositioningElementh">trunk/Source/WebCore/svg/SVGTextPositioningElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGUseElementcpp">trunk/Source/WebCore/svg/SVGUseElement.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGUseElementh">trunk/Source/WebCore/svg/SVGUseElement.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGValueh">trunk/Source/WebCore/svg/SVGValue.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAccessorImplh">trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAnimatorh">trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimator.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="#trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveListFunctionImplh">trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunctionImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveValueFunctionImplh">trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveValueFunctionImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAttributeAnimatorcpp">trunk/Source/WebCore/svg/properties/SVGAttributeAnimator.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAttributeAnimatorh">trunk/Source/WebCore/svg/properties/SVGAttributeAnimator.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGAttributeRegistryh">trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.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>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGValuePropertyAnimatorh">trunk/Source/WebCore/svg/properties/SVGValuePropertyAnimator.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGValuePropertyAnimatorImplh">trunk/Source/WebCore/svg/properties/SVGValuePropertyAnimatorImpl.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGValuePropertyListAnimatorh">trunk/Source/WebCore/svg/properties/SVGValuePropertyListAnimator.h</a></li>
<li><a href="#trunkSourceWebCoresvgpropertiesSVGValuePropertyListAnimatorImplh">trunk/Source/WebCore/svg/properties/SVGValuePropertyListAnimatorImpl.h</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedLengthcpp">trunk/Source/WebCore/svg/SVGAnimatedLength.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedLengthh">trunk/Source/WebCore/svg/SVGAnimatedLength.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedLengthListcpp">trunk/Source/WebCore/svg/SVGAnimatedLengthList.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGAnimatedLengthListh">trunk/Source/WebCore/svg/SVGAnimatedLengthList.h</a></li>
<li><a href="#trunkSourceWebCoresvgSVGLengthListValuescpp">trunk/Source/WebCore/svg/SVGLengthListValues.cpp</a></li>
<li><a href="#trunkSourceWebCoresvgSVGLengthListValuesh">trunk/Source/WebCore/svg/SVGLengthListValues.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/ChangeLog 2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,3 +1,29 @@
</span><ins>+2019-03-26  Said Abou-Hallawa  <said@apple.com>
+
+        Remove the SVG tear off objects for SVGLength, SVGLengthList and SVGAnimatedLengthList
+        https://bugs.webkit.org/show_bug.cgi?id=196083
+
+        Reviewed by Simon Fraser.
+
+        * platform/win/TestExpectations:
+        * svg/animations/svglength-element-removed-crash.svg:
+        * svg/dom/SVGLengthList-appendItem-expected.txt:
+        * svg/dom/SVGLengthList-appendItem.xhtml:
+        * svg/dom/SVGLengthList-basics-expected.txt:
+        * svg/dom/SVGLengthList-basics.xhtml:
+        * svg/dom/SVGLengthList-initialize-expected.txt:
+        * svg/dom/SVGLengthList-initialize.xhtml:
+        * svg/dom/SVGLengthList-insertItemBefore-expected.txt:
+        * svg/dom/SVGLengthList-insertItemBefore.xhtml:
+        * svg/dom/SVGLengthList-removeItem-expected.txt:
+        * svg/dom/SVGLengthList-removeItem.xhtml:
+        * svg/dom/SVGLengthList-replaceItem-expected.txt:
+        * svg/dom/SVGLengthList-replaceItem.xhtml:
+        This changes are required because SVGLengthList will be following the SVG2
+        specs regarding adding new items to the list. 
+
+        See https://www.w3.org/TR/SVG/types.html#TermListInterface.
+
</ins><span class="cx"> 2019-03-26  Simon Fraser  <simon.fraser@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [iOS WK2] position:fixed inside oveflow:scroll is jumpy
</span></span></pre></div>
<a id="trunkLayoutTestsplatformwinTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/win/TestExpectations (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/win/TestExpectations  2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/platform/win/TestExpectations     2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1954,6 +1954,9 @@
</span><span class="cx"> imported/mozilla/svg/svg-effects-area-zoomed-out.xhtml
</span><span class="cx"> svg/filters/feImage-self-and-other-referencing.html
</span><span class="cx"> 
</span><ins>+# GCController.collect() issues.
+svg/animations/svglength-element-removed-crash.svg [ Failure ]
+
</ins><span class="cx"> ################################################################################
</span><span class="cx"> ###################          End SVG Issues              #######################
</span><span class="cx"> ################################################################################
</span></span></pre></div>
<a id="trunkLayoutTestssvganimationssvglengthelementremovedcrashsvg"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/animations/svglength-element-removed-crash.svg (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/animations/svglength-element-removed-crash.svg     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/animations/svglength-element-removed-crash.svg        2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -32,8 +32,8 @@
</span><span class="cx">     // The rest of this test should FAIL without requiring gmalloc if this test has regressed.
</span><span class="cx">     var liveDelta = window.internals.numberOfLiveNodes() - originalLiveElements;
</span><span class="cx">     
</span><del>-    // Make sure that the <rect> is still alive; if it's not, liveDelta will be -1.
-    if (liveDelta == 0)
</del><ins>+    // Make sure that the <rect> is deleted; if it's not, liveDelta will be 0.
+    if (liveDelta == -1)
</ins><span class="cx">         log(" PASS");
</span><span class="cx">     else
</span><span class="cx">         log(" FAIL: " + liveDelta + " extra live node(s)");
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListappendItemexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-appendItem-expected.txt (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-appendItem-expected.txt  2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-appendItem-expected.txt     2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -27,7 +27,8 @@
</span><span class="cx"> PASS text2.x.baseVal.getItem(3) threw exception IndexSizeError: The index is not in the allowed range..
</span><span class="cx"> 
</span><span class="cx"> Append fourth item x=900 to the text1 x list
</span><del>-PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(3)) is text1.x.baseVal.getItem(4)
</del><ins>+PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(3)) is text1.x.baseVal.getItem(5)
+PASS text1.x.baseVal.removeItem(3).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 5
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 500
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 50
</span><span class="lines">@@ -37,7 +38,8 @@
</span><span class="cx"> PASS text1.x.baseVal.getItem(5) threw exception IndexSizeError: The index is not in the allowed range..
</span><span class="cx"> 
</span><span class="cx"> Append first item x=500 to the text1 x list
</span><del>-PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(0)) is text1.x.baseVal.getItem(4)
</del><ins>+PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(0)) is text1.x.baseVal.getItem(5)
+PASS text1.x.baseVal.removeItem(0).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 5
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 100
</span><span class="lines">@@ -59,7 +61,9 @@
</span><span class="cx"> 
</span><span class="cx"> Append third and fourth item of the text1 x list to the text2 x list
</span><span class="cx"> PASS text2.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value is 1000
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text2.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value is 900
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 4
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 100
</span><span class="lines">@@ -77,10 +81,14 @@
</span><span class="cx"> 
</span><span class="cx"> Shuffle around items in text1 and text2 list using appendItem, to get x=50,100,150,... in both lists
</span><span class="cx"> PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value is 500
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text2.x.baseVal.appendItem(newLength2).value is 150
</span><span class="cx"> PASS text2.x.baseVal.appendItem(text2.x.baseVal.getItem(2)).value is 1000
</span><ins>+PASS text2.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text2.x.baseVal.appendItem(text2.x.baseVal.getItem(3)).value is 900
</span><ins>+PASS text2.x.baseVal.removeItem(3).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text2.x.baseVal.appendItem(text2.x.baseVal.getItem(2)).value is 1000
</span><ins>+PASS text2.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 4
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 100
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListappendItemxhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-appendItem.xhtml (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-appendItem.xhtml 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-appendItem.xhtml    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -46,7 +46,8 @@
</span><span class="cx"> 
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Append fourth item x=900 to the text1 x list");
</span><del>-    shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(3))", "text1.x.baseVal.getItem(4)");
</del><ins>+    shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(3))", "text1.x.baseVal.getItem(5)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(3).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "5");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "500");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "50");
</span><span class="lines">@@ -57,7 +58,8 @@
</span><span class="cx"> 
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Append first item x=500 to the text1 x list");
</span><del>-    shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(0))", "text1.x.baseVal.getItem(4)");
</del><ins>+    shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(0))", "text1.x.baseVal.getItem(5)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(0).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "5");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "100");
</span><span class="lines">@@ -81,7 +83,9 @@
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Append third and fourth item of the text1 x list to the text2 x list");
</span><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value", "1000");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value", "900");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "4");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "100");
</span><span class="lines">@@ -103,10 +107,14 @@
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Shuffle around items in text1 and text2 list using appendItem, to get x=50,100,150,... in both lists");
</span><span class="cx">     shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value", "500");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text2.x.baseVal.appendItem(newLength2).value", "150");
</span><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text2.x.baseVal.getItem(2)).value", "1000");
</span><ins>+    shouldBeEqualToString("text2.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text2.x.baseVal.getItem(3)).value", "900");
</span><ins>+    shouldBeEqualToString("text2.x.baseVal.removeItem(3).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text2.x.baseVal.getItem(2)).value", "1000");
</span><ins>+    shouldBeEqualToString("text2.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "4");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "100");
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListbasicsexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-basics-expected.txt (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-basics-expected.txt      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-basics-expected.txt 2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> PASS text1.x.baseVal.insertItemBefore(text1) threw exception TypeError: Not enough arguments.
</span><span class="cx"> PASS text1.x.baseVal.insertItemBefore(null) threw exception TypeError: Not enough arguments.
</span><span class="cx"> PASS text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 'aString') is text1.x.baseVal.getItem(0)
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 3
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 1000
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 500
</span><span class="lines">@@ -35,6 +36,7 @@
</span><span class="cx"> PASS text1.x.baseVal.getItem(2).value is 1500
</span><span class="cx"> PASS text1.getAttribute('x') is "1000 500 1500"
</span><span class="cx"> PASS text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), text1) is text1.x.baseVal.getItem(0)
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 3
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 500
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 1000
</span><span class="lines">@@ -41,6 +43,7 @@
</span><span class="cx"> PASS text1.x.baseVal.getItem(2).value is 1500
</span><span class="cx"> PASS text1.getAttribute('x') is "500 1000 1500"
</span><span class="cx"> PASS text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), null) is text1.x.baseVal.getItem(0)
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 3
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 1000
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 500
</span><span class="lines">@@ -47,6 +50,7 @@
</span><span class="cx"> PASS text1.x.baseVal.getItem(2).value is 1500
</span><span class="cx"> PASS text1.getAttribute('x') is "1000 500 1500"
</span><span class="cx"> PASS text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 0) is text1.x.baseVal.getItem(0)
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 3
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 500
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 1000
</span><span class="lines">@@ -62,10 +66,13 @@
</span><span class="cx"> 
</span><span class="cx"> Test edge cases for insertItemBefore()
</span><span class="cx"> PASS text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(3), 3) is text1.x.baseVal.getItem(3)
</span><ins>+PASS text1.x.baseVal.removeItem(4).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.getAttribute('x') is "1 2 3 4"
</span><del>-PASS text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 5) is text1.x.baseVal.getItem(3)
</del><ins>+PASS text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 5) is text1.x.baseVal.getItem(4)
+PASS text1.x.baseVal.removeItem(1).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.getAttribute('x') is "1 3 4 2"
</span><span class="cx"> PASS text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 0) is text1.x.baseVal.getItem(0)
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.getAttribute('x') is "3 1 4 2"
</span><span class="cx"> 
</span><span class="cx"> Set x='1 2 3 4' for text1
</span><span class="lines">@@ -111,7 +118,8 @@
</span><span class="cx"> PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(3), 3) is text1.x.baseVal.getItem(3)
</span><span class="cx"> PASS text1.x.baseVal.numberOfItems is 4
</span><span class="cx"> PASS text1.getAttribute('x') is "1 2 3 4"
</span><del>-PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(1), 3) is text1.x.baseVal.getItem(2)
</del><ins>+PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(1), 3) is text1.x.baseVal.getItem(3)
+PASS text1.x.baseVal.removeItem(1).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 3
</span><span class="cx"> PASS text1.getAttribute('x') is "1 3 2"
</span><span class="cx"> PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(3), 4) threw exception IndexSizeError: The index is not in the allowed range..
</span><span class="lines">@@ -120,13 +128,16 @@
</span><span class="cx"> PASS text1.setAttribute('x', '1 2 3 4') is undefined.
</span><span class="cx"> 
</span><span class="cx"> Test overlapping edge cases for replaceItem()
</span><del>-PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 3) is text1.x.baseVal.getItem(2)
</del><ins>+PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 3) is text1.x.baseVal.getItem(3)
+PASS text1.x.baseVal.removeItem(0).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 3
</span><span class="cx"> PASS text1.x.baseVal.getItem(2).value is 2
</span><del>-PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 2) is text1.x.baseVal.getItem(1)
</del><ins>+PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 2) is text1.x.baseVal.getItem(2)
+PASS text1.x.baseVal.removeItem(0).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 2
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 4
</span><del>-PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 1) is text1.x.baseVal.getItem(0)
</del><ins>+PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 1) is text1.x.baseVal.getItem(1)
+PASS text1.x.baseVal.removeItem(1).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 1
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 6
</span><span class="cx"> PASS text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 0) is text1.x.baseVal.getItem(0)
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListbasicsxhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-basics.xhtml (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-basics.xhtml     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-basics.xhtml        2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -50,6 +50,7 @@
</span><span class="cx">     shouldThrow("text1.x.baseVal.insertItemBefore(null)");
</span><span class="cx"> 
</span><span class="cx">     shouldBe("text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 'aString')", "text1.x.baseVal.getItem(0)");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "3");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "1000");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "500");
</span><span class="lines">@@ -57,6 +58,7 @@
</span><span class="cx">     shouldBeEqualToString("text1.getAttribute('x')", "1000 500 1500");
</span><span class="cx"> 
</span><span class="cx">     shouldBe("text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), text1)", "text1.x.baseVal.getItem(0)");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "3");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "500");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "1000");
</span><span class="lines">@@ -64,6 +66,7 @@
</span><span class="cx">     shouldBeEqualToString("text1.getAttribute('x')", "500 1000 1500");
</span><span class="cx"> 
</span><span class="cx">     shouldBe("text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), null)", "text1.x.baseVal.getItem(0)");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "3");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "1000");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "500");
</span><span class="lines">@@ -71,6 +74,7 @@
</span><span class="cx">     shouldBeEqualToString("text1.getAttribute('x')", "1000 500 1500");
</span><span class="cx"> 
</span><span class="cx">     shouldBe("text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 0)", "text1.x.baseVal.getItem(0)");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "3");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "500");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "1000");
</span><span class="lines">@@ -89,10 +93,13 @@
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Test edge cases for insertItemBefore()");
</span><span class="cx">     shouldBe("text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(3), 3)", "text1.x.baseVal.getItem(3)");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(4).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBeEqualToString("text1.getAttribute('x')", "1 2 3 4");
</span><del>-    shouldBe("text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 5)", "text1.x.baseVal.getItem(3)");
</del><ins>+    shouldBe("text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 5)", "text1.x.baseVal.getItem(4)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(1).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBeEqualToString("text1.getAttribute('x')", "1 3 4 2");
</span><span class="cx">     shouldBe("text1.x.baseVal.insertItemBefore(text1.x.baseVal.getItem(1), 0)", "text1.x.baseVal.getItem(0)");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBeEqualToString("text1.getAttribute('x')", "3 1 4 2");
</span><span class="cx"> 
</span><span class="cx">     debug("");
</span><span class="lines">@@ -145,7 +152,8 @@
</span><span class="cx">     shouldBe("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(3), 3)", "text1.x.baseVal.getItem(3)");
</span><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "4");
</span><span class="cx">     shouldBeEqualToString("text1.getAttribute('x')", "1 2 3 4");
</span><del>-    shouldBe("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(1), 3)", "text1.x.baseVal.getItem(2)");
</del><ins>+    shouldBe("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(1), 3)", "text1.x.baseVal.getItem(3)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(1).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "3");
</span><span class="cx">     shouldBeEqualToString("text1.getAttribute('x')", "1 3 2");
</span><span class="cx">     shouldThrow("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(3), 4)");
</span><span class="lines">@@ -157,17 +165,20 @@
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Test overlapping edge cases for replaceItem()");
</span><span class="cx">     var item = text1.x.baseVal.getItem(3);
</span><del>-    shouldBe("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 3)", "text1.x.baseVal.getItem(2)");
</del><ins>+    shouldBe("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 3)", "text1.x.baseVal.getItem(3)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(0).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "3");    
</span><span class="cx">     item = text1.x.baseVal.getItem(2);
</span><span class="cx">     item.newValueSpecifiedUnits(item.unitType, item.value * 2);
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(2).value", "2");
</span><del>-    shouldBe("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 2)", "text1.x.baseVal.getItem(1)");
</del><ins>+    shouldBe("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 2)", "text1.x.baseVal.getItem(2)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(0).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "2");
</span><span class="cx">     item = text1.x.baseVal.getItem(1);
</span><span class="cx">     item.newValueSpecifiedUnits(item.unitType, item.value * 2);
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "4");
</span><del>-    shouldBe("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 1)", "text1.x.baseVal.getItem(0)");
</del><ins>+    shouldBe("text1.x.baseVal.replaceItem(text1.x.baseVal.getItem(0), 1)", "text1.x.baseVal.getItem(1)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(1).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "1");
</span><span class="cx">     item = text1.x.baseVal.getItem(0);
</span><span class="cx">     item.newValueSpecifiedUnits(item.unitType, item.value * 2);
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListinitializeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-initialize-expected.txt (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-initialize-expected.txt  2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-initialize-expected.txt     2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -45,7 +45,8 @@
</span><span class="cx"> PASS text2.x.baseVal.getItem(1).value is 50
</span><span class="cx"> 
</span><span class="cx"> Override the third text elements x list with the item x=50 from the second text element, where it should be removed afterwards
</span><del>-PASS text3.x.baseVal.initialize(itemInAnotherList) is itemInAnotherList
</del><ins>+PASS text3.x.baseVal.initialize(itemInAnotherList) is text3.x.baseVal.getItem(0)
+PASS text2.x.baseVal.removeItem(1).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text3.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text2.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text2.x.baseVal.getItem(1) threw exception IndexSizeError: The index is not in the allowed range..
</span><span class="lines">@@ -59,7 +60,8 @@
</span><span class="cx"> PASS text3.x.baseVal.getItem(0).value is 50
</span><span class="cx"> 
</span><span class="cx"> Move item from text3 to text4
</span><del>-PASS text4.x.baseVal.initialize(text3.x.baseVal.getItem(0)) is itemInAnotherList
</del><ins>+PASS text4.x.baseVal.initialize(text3.x.baseVal.getItem(0)) is text4.x.baseVal.getItem(0)
+PASS text3.x.baseVal.removeItem(0).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text4.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text3.x.baseVal.getItem(0) threw exception IndexSizeError: The index is not in the allowed range..
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListinitializexhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-initialize.xhtml (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-initialize.xhtml 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-initialize.xhtml    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -71,11 +71,12 @@
</span><span class="cx">     itemInAnotherList.value = 50;
</span><span class="cx">     shouldBe("text2.x.baseVal.getItem(1).value", "50");
</span><span class="cx"> 
</span><del>-    // Spec: If the inserted item is already in a list, it is removed from its previous list before it is inserted into this list.
-    //       The inserted item is the item itself and not a copy.
</del><ins>+    // Spec: If the inserted item is already in a list, a copy of the item will be inserted.
</ins><span class="cx">     debug("");
</span><span class="cx">     debug("Override the third text elements x list with the item x=50 from the second text element, where it should be removed afterwards");
</span><del>-    shouldBe("text3.x.baseVal.initialize(itemInAnotherList)", "itemInAnotherList");
</del><ins>+    shouldBe("text3.x.baseVal.initialize(itemInAnotherList)", "text3.x.baseVal.getItem(0)");
+    shouldBeEqualToString("text2.x.baseVal.removeItem(1).toString()", "[object SVGLength]");
+    itemInAnotherList = text3.x.baseVal.getItem(0);
</ins><span class="cx">     shouldBe("text3.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text2.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldThrow("text2.x.baseVal.getItem(1)");
</span><span class="lines">@@ -91,7 +92,8 @@
</span><span class="cx"> 
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Move item from text3 to text4");
</span><del>-    shouldBe("text4.x.baseVal.initialize(text3.x.baseVal.getItem(0))", "itemInAnotherList");
</del><ins>+    shouldBe("text4.x.baseVal.initialize(text3.x.baseVal.getItem(0))", "text4.x.baseVal.getItem(0)");
+    shouldBeEqualToString("text3.x.baseVal.removeItem(0).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text4.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldThrow("text3.x.baseVal.getItem(0)");
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListinsertItemBeforeexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-insertItemBefore-expected.txt (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-insertItemBefore-expected.txt    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-insertItemBefore-expected.txt       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -62,7 +62,8 @@
</span><span class="cx"> PASS text1.x.baseVal.getItem(6) threw exception IndexSizeError: The index is not in the allowed range..
</span><span class="cx"> 
</span><span class="cx"> Insert item 'newLength3' at position=1, between '100' and '500', remove it from the old position=2 afterwards.
</span><del>-PASS text1.x.baseVal.insertItemBefore(newLength3, 1) is newLength3
</del><ins>+PASS text1.x.baseVal.insertItemBefore(newLength3, 1) is text1.x.baseVal.getItem(1)
+PASS text1.x.baseVal.removeItem(3).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 6
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 100
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 150
</span><span class="lines">@@ -73,7 +74,8 @@
</span><span class="cx"> PASS text1.x.baseVal.getItem(6) threw exception IndexSizeError: The index is not in the allowed range..
</span><span class="cx"> 
</span><span class="cx"> Insert item 'newLength3' at position=0, before '100', remove it from the old position=5 afterwards.
</span><del>-PASS text1.x.baseVal.insertItemBefore(newLength1, 0) is newLength1
</del><ins>+PASS text1.x.baseVal.insertItemBefore(newLength1, 0) is text1.x.baseVal.getItem(0)
+PASS text1.x.baseVal.removeItem(6).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 6
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 100
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListinsertItemBeforexhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-insertItemBefore.xhtml (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-insertItemBefore.xhtml   2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-insertItemBefore.xhtml      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -96,11 +96,11 @@
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(5).value", "50");
</span><span class="cx">     shouldThrow("text1.x.baseVal.getItem(6)");
</span><span class="cx"> 
</span><del>-    // Spec: If newItem is already in a list, it is removed from its previous list before it is inserted into this list.
-    // Spec: If the item is already in this list, note that the index of the item to insert before is before the removal of the item. 
</del><ins>+    // Spec: If newItem is already in a list, a clone of newItem inserted into this list.
</ins><span class="cx">     debug("");
</span><span class="cx">     debug("Insert item 'newLength3' at position=1, between '100' and '500', remove it from the old position=2 afterwards.");
</span><del>-    shouldBe("text1.x.baseVal.insertItemBefore(newLength3, 1)", "newLength3");
</del><ins>+    shouldBe("text1.x.baseVal.insertItemBefore(newLength3, 1)", "text1.x.baseVal.getItem(1)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(3).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "6");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "100");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "150");
</span><span class="lines">@@ -112,7 +112,8 @@
</span><span class="cx"> 
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Insert item 'newLength3' at position=0, before '100', remove it from the old position=5 afterwards.");
</span><del>-    shouldBe("text1.x.baseVal.insertItemBefore(newLength1, 0)", "newLength1");
</del><ins>+    shouldBe("text1.x.baseVal.insertItemBefore(newLength1, 0)", "text1.x.baseVal.getItem(0)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(6).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "6");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "100");
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListremoveItemexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-removeItem-expected.txt (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-removeItem-expected.txt  2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-removeItem-expected.txt     2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -27,7 +27,8 @@
</span><span class="cx"> PASS text2.x.baseVal.getItem(3) threw exception IndexSizeError: The index is not in the allowed range..
</span><span class="cx"> 
</span><span class="cx"> Append fourth item x=900 to the text1 x list
</span><del>-PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(3)) is text1.x.baseVal.getItem(4)
</del><ins>+PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(3)) is text1.x.baseVal.getItem(5)
+PASS text1.x.baseVal.removeItem(3).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 5
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 500
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 50
</span><span class="lines">@@ -37,7 +38,8 @@
</span><span class="cx"> PASS text1.x.baseVal.getItem(5) threw exception IndexSizeError: The index is not in the allowed range..
</span><span class="cx"> 
</span><span class="cx"> Append first item x=500 to the text1 x list
</span><del>-PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(0)) is text1.x.baseVal.getItem(4)
</del><ins>+PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(0)) is text1.x.baseVal.getItem(5)
+PASS text1.x.baseVal.removeItem(0).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 5
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 100
</span><span class="lines">@@ -59,7 +61,9 @@
</span><span class="cx"> 
</span><span class="cx"> Append third and fourth item of the text1 x list to the text2 x list
</span><span class="cx"> PASS text2.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value is 1000
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text2.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value is 900
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 4
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 100
</span><span class="lines">@@ -77,10 +81,14 @@
</span><span class="cx"> 
</span><span class="cx"> Shuffle around items in text1 and text2 list using appendItem, to get x=50,100,150,... in both lists
</span><span class="cx"> PASS text1.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value is 500
</span><ins>+PASS text1.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text2.x.baseVal.appendItem(newLength2).value is 150
</span><span class="cx"> PASS text2.x.baseVal.appendItem(text2.x.baseVal.getItem(2)).value is 1000
</span><ins>+PASS text2.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text2.x.baseVal.appendItem(text2.x.baseVal.getItem(3)).value is 900
</span><ins>+PASS text2.x.baseVal.removeItem(3).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text2.x.baseVal.appendItem(text2.x.baseVal.getItem(2)).value is 1000
</span><ins>+PASS text2.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text1.x.baseVal.numberOfItems is 4
</span><span class="cx"> PASS text1.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text1.x.baseVal.getItem(1).value is 100
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListremoveItemxhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-removeItem.xhtml (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-removeItem.xhtml 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-removeItem.xhtml    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -46,7 +46,8 @@
</span><span class="cx"> 
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Append fourth item x=900 to the text1 x list");
</span><del>-    shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(3))", "text1.x.baseVal.getItem(4)");
</del><ins>+    shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(3))", "text1.x.baseVal.getItem(5)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(3).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "5");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "500");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "50");
</span><span class="lines">@@ -57,7 +58,8 @@
</span><span class="cx"> 
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Append first item x=500 to the text1 x list");
</span><del>-    shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(0))", "text1.x.baseVal.getItem(4)");
</del><ins>+    shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(0))", "text1.x.baseVal.getItem(5)");
+    shouldBeEqualToString("text1.x.baseVal.removeItem(0).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "5");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "100");
</span><span class="lines">@@ -81,7 +83,9 @@
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Append third and fourth item of the text1 x list to the text2 x list");
</span><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value", "1000");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value", "900");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "4");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "100");
</span><span class="lines">@@ -103,10 +107,14 @@
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Shuffle around items in text1 and text2 list using appendItem, to get x=50,100,150,... in both lists");
</span><span class="cx">     shouldBe("text1.x.baseVal.appendItem(text1.x.baseVal.getItem(2)).value", "500");
</span><ins>+    shouldBeEqualToString("text1.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text2.x.baseVal.appendItem(newLength2).value", "150");
</span><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text2.x.baseVal.getItem(2)).value", "1000");
</span><ins>+    shouldBeEqualToString("text2.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text2.x.baseVal.getItem(3)).value", "900");
</span><ins>+    shouldBeEqualToString("text2.x.baseVal.removeItem(3).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text2.x.baseVal.appendItem(text2.x.baseVal.getItem(2)).value", "1000");
</span><ins>+    shouldBeEqualToString("text2.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text1.x.baseVal.numberOfItems", "4");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text1.x.baseVal.getItem(1).value", "100");
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListreplaceItemexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-replaceItem-expected.txt (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-replaceItem-expected.txt 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-replaceItem-expected.txt    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -46,6 +46,7 @@
</span><span class="cx"> 
</span><span class="cx"> Replace the first item in text2 x list with the third item in the list
</span><span class="cx"> PASS text2.x.baseVal.replaceItem(text2.x.baseVal.getItem(2), 0).value is 50
</span><ins>+PASS text2.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text2.x.baseVal.numberOfItems is 3
</span><span class="cx"> PASS text2.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text2.x.baseVal.getItem(1).value is 100
</span><span class="lines">@@ -70,6 +71,7 @@
</span><span class="cx"> 
</span><span class="cx"> Replace the first item in text4 x list with the second item in the text3 x list
</span><span class="cx"> PASS text4.x.baseVal.replaceItem(text3.x.baseVal.getItem(1), 0).value is 50
</span><ins>+PASS text3.x.baseVal.removeItem(1).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text3.x.baseVal.numberOfItems is 4
</span><span class="cx"> PASS text3.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text3.x.baseVal.getItem(1).value is 100
</span><span class="lines">@@ -85,6 +87,7 @@
</span><span class="cx"> 
</span><span class="cx"> Replace the second item in text4 x list with the second item in the text4 x list
</span><span class="cx"> PASS text4.x.baseVal.replaceItem(text3.x.baseVal.getItem(2), 1).value is 100
</span><ins>+PASS text3.x.baseVal.removeItem(2).toString() is "[object SVGLength]"
</ins><span class="cx"> PASS text4.x.baseVal.numberOfItems is 4
</span><span class="cx"> PASS text4.x.baseVal.getItem(0).value is 50
</span><span class="cx"> PASS text4.x.baseVal.getItem(1).value is 100
</span></span></pre></div>
<a id="trunkLayoutTestssvgdomSVGLengthListreplaceItemxhtml"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/svg/dom/SVGLengthList-replaceItem.xhtml (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/svg/dom/SVGLengthList-replaceItem.xhtml        2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/LayoutTests/svg/dom/SVGLengthList-replaceItem.xhtml   2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -75,6 +75,7 @@
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Replace the first item in text2 x list with the third item in the list");
</span><span class="cx">     shouldBe("text2.x.baseVal.replaceItem(text2.x.baseVal.getItem(2), 0).value", "50");
</span><ins>+    shouldBeEqualToString("text2.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text2.x.baseVal.numberOfItems", "3");
</span><span class="cx">     shouldBe("text2.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text2.x.baseVal.getItem(1).value", "100");
</span><span class="lines">@@ -102,6 +103,7 @@
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Replace the first item in text4 x list with the second item in the text3 x list");
</span><span class="cx">     shouldBe("text4.x.baseVal.replaceItem(text3.x.baseVal.getItem(1), 0).value", "50");
</span><ins>+    shouldBeEqualToString("text3.x.baseVal.removeItem(1).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text3.x.baseVal.numberOfItems", "4");
</span><span class="cx">     shouldBe("text3.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text3.x.baseVal.getItem(1).value", "100");
</span><span class="lines">@@ -118,6 +120,7 @@
</span><span class="cx">     debug("");
</span><span class="cx">     debug("Replace the second item in text4 x list with the second item in the text4 x list");
</span><span class="cx">     shouldBe("text4.x.baseVal.replaceItem(text3.x.baseVal.getItem(2), 1).value", "100");
</span><ins>+    shouldBeEqualToString("text3.x.baseVal.removeItem(2).toString()", "[object SVGLength]");
</ins><span class="cx">     shouldBe("text4.x.baseVal.numberOfItems", "4");
</span><span class="cx">     shouldBe("text4.x.baseVal.getItem(0).value", "50");
</span><span class="cx">     shouldBe("text4.x.baseVal.getItem(1).value", "100");
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog   2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/ChangeLog      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,3 +1,280 @@
</span><ins>+2019-03-26  Said Abou-Hallawa  <said@apple.com>
+
+        Remove the SVG tear off objects for SVGLength, SVGLengthList and SVGAnimatedLengthList
+        https://bugs.webkit.org/show_bug.cgi?id=196083
+
+        Reviewed by Simon Fraser.
+
+        -- SVGLength will be a superclass of SVGValueProperty<SVGLengthValue>. It
+           is a wrapper of SVGLengthValue. It will be provide the DOM methods. It
+           can setValueAsString() and return valueAsString().
+
+        -- SVGLengthList will be a superclass of SVGValuePropertyList<SVGLength>.
+           The base class will provide all the DOM methods. SVGLengthList will be
+           responsible for parsing a String to a SVGLength items. It can also 
+           build a string representing the stored items.
+
+        -- SVGAnimatedLengthList will be defined as SVGAnimatedPropertyList<SVGLengthList>.
+           Like SVGAnimatedPointList, all the required methods and attributes
+           will be handled by SVGAnimatedPropertyList.
+
+        -- SVGAnimatedLengthAccessor and SVGAnimatedLengthListAccessor will be
+           added to access the members of types SVGAnimatedLength and 
+           SVGAnimatedLengthList.
+
+        -- SVGAnimatedLengthAnimator and SVGAnimatedLengthListAnimator will be
+           created by the the new accessors to animate attributes of types
+           SVGAnimatedLength and SVGAnimatedLengthList.
+
+        -- SVGAnimationLengthFunction and SVGAnimationLengthListFunction will be
+           responsible for progressing the animVal() of attributes of types
+           SVGAnimatedLength and SVGAnimatedLengthList.
+
+        -- SVGValuePropertyAnimator is a new template class which can animate a
+           none reflecting attribute which should be backed by a value property,
+           e.g. SVGLength.
+
+        -- SVGValuePropertyListAnimator is a new template class which can animate a
+           none reflecting attribute which should be backed by a value property
+           list, e.g. SVGLengthList.
+
+        Notes:
+
+            -- SVGElement::isAnimatedStyleAttribute() will return true if the
+               attribute is known by SVGPropertyAnimatorFactory. Or it's has 
+               a reflecting SVGAnimatedPropertyLength property and its name is
+               one of the names listed in isAnimatedStylePropertyAttribute() of
+               the propertyRegistry() of the SVGElement.
+
+            -- SVGElement::commitPropertyChange() has to handle the attributes
+               for which isAnimatedStylePropertyAttribute() returns true different
+               from the other ones. styleReclac() needs updated attributes since
+               it does not access the reflecting properties in the SVGELement.
+
+            -- SVGTextContentElement does not need a customized SVGAnimatedLength.
+               All SVGTextContentElement::textLengthAnimated() needs to know is
+               whether m_textLength->baseVal() holds an empty SVGLength. If it
+               does, it sets its value to getComputedTextLength().
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * rendering/svg/SVGTextLayoutAttributesBuilder.cpp:
+        (WebCore::updateCharacterData):
+        (WebCore::SVGTextLayoutAttributesBuilder::fillCharacterDataMap):
+        * svg/SVGAnimateElementBase.cpp:
+        (WebCore::SVGAnimateElementBase::hasValidAttributeType const):
+        * svg/SVGAnimatedLength.cpp: Removed.
+        * svg/SVGAnimatedLength.h: Removed.
+        * svg/SVGAnimatedLengthList.cpp: Removed.
+        * svg/SVGAnimatedLengthList.h: Removed.
+        * svg/SVGAnimatedType.h:
+        (WebCore::SVGAnimatedType::type const):
+        * svg/SVGAnimationElement.cpp:
+        (WebCore::SVGAnimationElement::isTargetAttributeCSSProperty):
+        (WebCore::inheritsFromProperty):
+        * svg/SVGAnimatorFactory.h:
+        (WebCore::SVGAnimatorFactory::isSupportedAttribute):
+        (WebCore::SVGAnimatorFactory::create):
+        These changes were required because some of the tests were trying to
+        animated unsupported attributes. To differentiate between between the
+        these two cases:
+            1) the attribute is animate-able by the legacy controller.
+            2) animating the attribute or the attribute itself is not supported
+               by the element.
+
+        We want SVGAnimatorFactory tell us whether it can create an animator for
+        a given attribute or not.
+
+        * svg/SVGCircleElement.cpp:
+        (WebCore::SVGCircleElement::SVGCircleElement):
+        (WebCore::SVGCircleElement::parseAttribute):
+        (WebCore::SVGCircleElement::svgAttributeChanged):
+        (WebCore::SVGCircleElement::registerAttributes): Deleted.
+        * svg/SVGCircleElement.h:
+        * svg/SVGCursorElement.cpp:
+        (WebCore::SVGCursorElement::SVGCursorElement):
+        (WebCore::SVGCursorElement::parseAttribute):
+        (WebCore::SVGCursorElement::svgAttributeChanged):
+        (WebCore::SVGCursorElement::registerAttributes): Deleted.
+        * svg/SVGCursorElement.h:
+        * svg/SVGElement.cpp:
+        (WebCore::SVGElement::commitPropertyChange):
+        (WebCore::SVGElement::isAnimatedStyleAttribute const):
+        * svg/SVGElement.h:
+        * svg/SVGEllipseElement.cpp:
+        (WebCore::SVGEllipseElement::SVGEllipseElement):
+        (WebCore::SVGEllipseElement::parseAttribute):
+        (WebCore::SVGEllipseElement::svgAttributeChanged):
+        (WebCore::SVGEllipseElement::registerAttributes): Deleted.
+        * svg/SVGEllipseElement.h:
+        * svg/SVGFilterElement.cpp:
+        (WebCore::SVGFilterElement::SVGFilterElement):
+        (WebCore::SVGFilterElement::registerAttributes):
+        (WebCore::SVGFilterElement::parseAttribute):
+        * svg/SVGFilterElement.h:
+        * svg/SVGFilterPrimitiveStandardAttributes.cpp:
+        (WebCore::SVGFilterPrimitiveStandardAttributes::SVGFilterPrimitiveStandardAttributes):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::parseAttribute):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::registerAttributes): Deleted.
+        * svg/SVGFilterPrimitiveStandardAttributes.h:
+        (WebCore::SVGFilterPrimitiveStandardAttributes::x const):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::y const):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::width const):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::height const):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::xAnimated):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::yAnimated):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::widthAnimated):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::heightAnimated):
+        (WebCore::SVGFilterPrimitiveStandardAttributes::isKnownAttribute): Deleted.
+        * svg/SVGForeignObjectElement.cpp:
+        (WebCore::SVGForeignObjectElement::SVGForeignObjectElement):
+        (WebCore::SVGForeignObjectElement::parseAttribute):
+        (WebCore::SVGForeignObjectElement::registerAttributes): Deleted.
+        * svg/SVGForeignObjectElement.h:
+        * svg/SVGImageElement.cpp:
+        (WebCore::SVGImageElement::SVGImageElement):
+        (WebCore::SVGImageElement::parseAttribute):
+        (WebCore::SVGImageElement::registerAttributes): Deleted.
+        * svg/SVGImageElement.h:
+        * svg/SVGLength.h:
+        (WebCore::SVGLength::create):
+        (WebCore::SVGLength::clone const):
+        (WebCore::SVGLength::unitType):
+        (WebCore::SVGLength::valueForBindings):
+        (WebCore::SVGLength::setValueForBindings):
+        (WebCore::SVGLength::valueInSpecifiedUnits):
+        (WebCore::SVGLength::setValueInSpecifiedUnits):
+        (WebCore::SVGLength::setValueAsString):
+        (WebCore::SVGLength::newValueSpecifiedUnits):
+        (WebCore::SVGLength::convertToSpecifiedUnits):
+        (WebCore::SVGLength::valueAsString): Deleted.
+        (WebCore::SVGLength::SVGLength): Deleted.
+        * svg/SVGLengthList.h:
+        (WebCore::SVGLengthList::create):
+        (WebCore::SVGLengthList::lengthMode const):
+        (WebCore::SVGLengthList::parse):
+        (WebCore::SVGLengthList::SVGLengthList):
+        * svg/SVGLengthListValues.cpp: Removed.
+        * svg/SVGLengthListValues.h: Removed.
+        * svg/SVGLineElement.cpp:
+        (WebCore::SVGLineElement::SVGLineElement):
+        (WebCore::SVGLineElement::parseAttribute):
+        (WebCore::SVGLineElement::svgAttributeChanged):
+        (WebCore::SVGLineElement::registerAttributes): Deleted.
+        * svg/SVGLineElement.h:
+        * svg/SVGLinearGradientElement.cpp:
+        (WebCore::SVGLinearGradientElement::SVGLinearGradientElement):
+        (WebCore::SVGLinearGradientElement::parseAttribute):
+        (WebCore::SVGLinearGradientElement::svgAttributeChanged):
+        (WebCore::SVGLinearGradientElement::registerAttributes): Deleted.
+        * svg/SVGLinearGradientElement.h:
+        * svg/SVGMarkerElement.cpp:
+        (WebCore::SVGMarkerElement::SVGMarkerElement):
+        (WebCore::SVGMarkerElement::registerAttributes):
+        (WebCore::SVGMarkerElement::parseAttribute):
+        * svg/SVGMarkerElement.h:
+        * svg/SVGMaskElement.cpp:
+        (WebCore::SVGMaskElement::SVGMaskElement):
+        (WebCore::SVGMaskElement::registerAttributes):
+        (WebCore::SVGMaskElement::parseAttribute):
+        (WebCore::SVGMaskElement::svgAttributeChanged):
+        * svg/SVGMaskElement.h:
+        * svg/SVGPatternElement.cpp:
+        (WebCore::SVGPatternElement::SVGPatternElement):
+        (WebCore::SVGPatternElement::registerAttributes):
+        (WebCore::SVGPatternElement::parseAttribute):
+        * svg/SVGPatternElement.h:
+        * svg/SVGPoint.h:
+        * svg/SVGRadialGradientElement.cpp:
+        (WebCore::SVGRadialGradientElement::SVGRadialGradientElement):
+        (WebCore::SVGRadialGradientElement::parseAttribute):
+        (WebCore::SVGRadialGradientElement::svgAttributeChanged):
+        (WebCore::SVGRadialGradientElement::registerAttributes): Deleted.
+        * svg/SVGRadialGradientElement.h:
+        * svg/SVGRectElement.cpp:
+        (WebCore::SVGRectElement::SVGRectElement):
+        (WebCore::SVGRectElement::parseAttribute):
+        (WebCore::SVGRectElement::svgAttributeChanged):
+        (WebCore::SVGRectElement::registerAttributes): Deleted.
+        * svg/SVGRectElement.h:
+        * svg/SVGSVGElement.cpp:
+        (WebCore::SVGSVGElement::SVGSVGElement):
+        (WebCore::SVGSVGElement::parseAttribute):
+        (WebCore::SVGSVGElement::svgAttributeChanged):
+        (WebCore::SVGSVGElement::registerAttributes): Deleted.
+        * svg/SVGSVGElement.h:
+        * svg/SVGTextContentElement.cpp:
+        (WebCore::SVGTextContentElement::SVGTextContentElement):
+        (WebCore::SVGTextContentElement::registerAttributes):
+        (WebCore::SVGTextContentElement::parseAttribute):
+        (WebCore::SVGTextContentElement::svgAttributeChanged):
+        (WebCore::SVGTextContentElement::textLengthAnimated):
+        * svg/SVGTextContentElement.h:
+        (WebCore::SVGTextContentElement::specifiedTextLength const):
+        (WebCore::SVGTextContentElement::textLength const):
+        (WebCore::SVGTextContentElement::specifiedTextLength): Deleted.
+        (WebCore::SVGTextContentElement::textLengthAnimated): Deleted.
+        (WebCore::SVGTextContentElement::SVGAnimatedCustomLengthAttribute::SVGAnimatedCustomLengthAttribute): Deleted.
+        (WebCore::SVGTextContentElement::SVGAnimatedCustomLengthAttribute::synchronize): Deleted.
+        (WebCore::SVGTextContentElement::SVGAnimatedCustomLengthAttribute::animatedProperty): Deleted.
+        * svg/SVGTextPathElement.cpp:
+        (WebCore::SVGTextPathElement::SVGTextPathElement):
+        (WebCore::SVGTextPathElement::registerAttributes):
+        (WebCore::SVGTextPathElement::parseAttribute):
+        * svg/SVGTextPathElement.h:
+        * svg/SVGTextPositioningElement.cpp:
+        (WebCore::SVGTextPositioningElement::SVGTextPositioningElement):
+        (WebCore::SVGTextPositioningElement::parseAttribute):
+        (WebCore::SVGTextPositioningElement::svgAttributeChanged):
+        (WebCore::SVGTextPositioningElement::registerAttributes): Deleted.
+        * svg/SVGTextPositioningElement.h:
+        (WebCore::SVGTextPositioningElement::x const):
+        (WebCore::SVGTextPositioningElement::y const):
+        (WebCore::SVGTextPositioningElement::dx const):
+        (WebCore::SVGTextPositioningElement::dy const):
+        (WebCore::SVGTextPositioningElement::xAnimated):
+        (WebCore::SVGTextPositioningElement::yAnimated):
+        (WebCore::SVGTextPositioningElement::dxAnimated):
+        (WebCore::SVGTextPositioningElement::dyAnimated):
+        (WebCore::SVGTextPositioningElement::isKnownAttribute): Deleted.
+        * svg/SVGUseElement.cpp:
+        (WebCore::SVGUseElement::SVGUseElement):
+        (WebCore::SVGUseElement::parseAttribute):
+        (WebCore::SVGUseElement::svgAttributeChanged):
+        (WebCore::SVGUseElement::registerAttributes): Deleted.
+        * svg/SVGUseElement.h:
+        * svg/SVGValue.h:
+        * svg/properties/SVGAnimatedPropertyAccessorImpl.h:
+        * svg/properties/SVGAnimatedPropertyAnimator.h:
+        * svg/properties/SVGAnimatedPropertyAnimatorImpl.h:
+        * svg/properties/SVGAnimatedPropertyImpl.h:
+        * svg/properties/SVGAnimationAdditiveListFunctionImpl.h:
+        (WebCore::SVGAnimationLengthListFunction::SVGAnimationLengthListFunction):
+        (WebCore::SVGAnimationLengthListFunction::progress):
+        (WebCore::SVGAnimationNumberListFunction::progress):
+        (WebCore::SVGAnimationPointListFunction::progress):
+        * svg/properties/SVGAnimationAdditiveValueFunctionImpl.h:
+        (WebCore::SVGAnimationLengthFunction::SVGAnimationLengthFunction):
+        (WebCore::SVGAnimationLengthFunction::progress):
+        * svg/properties/SVGAttributeAnimator.cpp:
+        (WebCore::SVGAttributeAnimator::isAnimatedStylePropertyAniamtor const):
+        * svg/properties/SVGAttributeAnimator.h:
+        * svg/properties/SVGAttributeRegistry.h:
+        * svg/properties/SVGPropertyAnimatorFactory.h:
+        (WebCore::SVGPropertyAnimatorFactory::createLengthAnimator):
+        (WebCore::SVGPropertyAnimatorFactory::createLengthListAnimator):
+        (WebCore::SVGPropertyAnimatorFactory::attributeAnimatorCreator):
+        * svg/properties/SVGPropertyOwnerRegistry.h:
+        (WebCore::SVGPropertyOwnerRegistry::registerProperty):
+        (WebCore::SVGPropertyOwnerRegistry::isAnimatedLengthAttribute):
+        * svg/properties/SVGPropertyRegistry.h:
+        * svg/properties/SVGValuePropertyAnimator.h: Added.
+        (WebCore::SVGValuePropertyAnimator::SVGValuePropertyAnimator):
+        * svg/properties/SVGValuePropertyAnimatorImpl.h: Added.
+        * svg/properties/SVGValuePropertyListAnimator.h: Added.
+        (WebCore::SVGValuePropertyListAnimator::SVGValuePropertyListAnimator):
+        * svg/properties/SVGValuePropertyListAnimatorImpl.h: Added.
+
</ins><span class="cx"> 2019-03-26  Simon Fraser  <simon.fraser@apple.com>
</span><span class="cx"> 
</span><span class="cx">         [iOS WK2] position:fixed inside oveflow:scroll is jumpy
</span></span></pre></div>
<a id="trunkSourceWebCoreSourcestxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Sources.txt (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Sources.txt 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/Sources.txt    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -2267,8 +2267,6 @@
</span><span class="cx"> svg/SVGAnimateElementBase.cpp
</span><span class="cx"> svg/SVGAnimateMotionElement.cpp
</span><span class="cx"> svg/SVGAnimateTransformElement.cpp
</span><del>-svg/SVGAnimatedLength.cpp
-svg/SVGAnimatedLengthList.cpp
</del><span class="cx"> svg/SVGAnimatedPath.cpp
</span><span class="cx"> svg/SVGAnimatedTransformList.cpp
</span><span class="cx"> svg/SVGAnimatedTypeAnimator.cpp
</span><span class="lines">@@ -2334,7 +2332,6 @@
</span><span class="cx"> svg/SVGLangSpace.cpp
</span><span class="cx"> svg/SVGLegacyAttributeAnimationController.cpp
</span><span class="cx"> svg/SVGLengthContext.cpp
</span><del>-svg/SVGLengthListValues.cpp
</del><span class="cx"> svg/SVGLengthValue.cpp
</span><span class="cx"> svg/SVGLineElement.cpp
</span><span class="cx"> svg/SVGLinearGradientElement.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj   2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -271,8 +271,6 @@
</span><span class="cx">          088A0E0B126EF1DB00978F7A /* SVGPropertyTearOff.h in Headers */ = {isa = PBXBuildFile; fileRef = 088A0E02126EF1DB00978F7A /* SVGPropertyTearOff.h */; };
</span><span class="cx">          088A0E0C126EF1DB00978F7A /* SVGPropertyTraits.h in Headers */ = {isa = PBXBuildFile; fileRef = 088A0E03126EF1DB00978F7A /* SVGPropertyTraits.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          088C2F7A12390081003D65CE /* SVGTextLayoutAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 088C2F7612390080003D65CE /* SVGTextLayoutAttributes.h */; };
</span><del>-               089021A9126EF5DE0092D5EA /* SVGAnimatedLength.h in Headers */ = {isa = PBXBuildFile; fileRef = 089021A8126EF5DE0092D5EA /* SVGAnimatedLength.h */; };
-               089021AD126EF5E90092D5EA /* SVGAnimatedLengthList.h in Headers */ = {isa = PBXBuildFile; fileRef = 089021AC126EF5E90092D5EA /* SVGAnimatedLengthList.h */; };
</del><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><span class="lines">@@ -2226,7 +2224,6 @@
</span><span class="cx">          7C30D9861F815AEC00268356 /* JSAbortSignal.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C30D9811F815AC100268356 /* JSAbortSignal.h */; };
</span><span class="cx">          7C330A021DF8FAC600D3395C /* GraphicsContext3DAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C330A011DF8FAC600D3395C /* GraphicsContext3DAttributes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          7C330A081DF9F95100D3395C /* JSPositionOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C330A061DF9F95100D3395C /* JSPositionOptions.h */; };
</span><del>-               7C39C3651DDA865200FEFB29 /* SVGLengthListValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C39C3631DDA864900FEFB29 /* SVGLengthListValues.h */; };
</del><span class="cx">           7C3A91E61C963B8800D1A7E3 /* ClipboardAccessPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C3A91E51C963B8800D1A7E3 /* ClipboardAccessPolicy.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">          7C3B79711908757B00B47A2D /* UserMessageHandler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 7C3B796F1908757B00B47A2D /* UserMessageHandler.cpp */; };
</span><span class="cx">          7C3B79721908757B00B47A2D /* UserMessageHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 7C3B79701908757B00B47A2D /* UserMessageHandler.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -5639,8 +5636,6 @@
</span><span class="cx">          088A0E03126EF1DB00978F7A /* SVGPropertyTraits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPropertyTraits.h; sourceTree = "<group>"; };
</span><span class="cx">          088C2F7512390080003D65CE /* SVGTextLayoutAttributes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGTextLayoutAttributes.cpp; sourceTree = "<group>"; };
</span><span class="cx">          088C2F7612390080003D65CE /* SVGTextLayoutAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTextLayoutAttributes.h; sourceTree = "<group>"; };
</span><del>-               089021A8126EF5DE0092D5EA /* SVGAnimatedLength.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedLength.h; sourceTree = "<group>"; };
-               089021AC126EF5E90092D5EA /* SVGAnimatedLengthList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedLengthList.h; sourceTree = "<group>"; };
</del><span class="cx">           089582530E857A7E00F82C83 /* ImageLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageLoader.cpp; sourceTree = "<group>"; };
</span><span class="cx">          089582540E857A7E00F82C83 /* ImageLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageLoader.h; sourceTree = "<group>"; };
</span><span class="cx">          089A8E06128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPathSegListPropertyTearOff.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -7557,7 +7552,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>-               431A2FD613B7707A007791E4 /* SVGAnimatedLengthList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedLengthList.cpp; sourceTree = "<group>"; };
</del><span class="cx">           432D3FE718A8658400D7DC03 /* SelectorCheckerTestFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectorCheckerTestFunctions.h; sourceTree = "<group>"; };
</span><span class="cx">          4358E87A1360A2EE00E4748C /* JSSVGFEDropShadowElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSSVGFEDropShadowElement.cpp; sourceTree = "<group>"; };
</span><span class="cx">          4358E87B1360A2EE00E4748C /* JSSVGFEDropShadowElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSSVGFEDropShadowElement.h; sourceTree = "<group>"; };
</span><span class="lines">@@ -7619,7 +7613,6 @@
</span><span class="cx">          436708B912D9CA4B00044234 /* SVGResourcesCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGResourcesCache.h; sourceTree = "<group>"; };
</span><span class="cx">          436708BA12D9CA4B00044234 /* SVGResourcesCycleSolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGResourcesCycleSolver.cpp; sourceTree = "<group>"; };
</span><span class="cx">          436708BB12D9CA4B00044234 /* SVGResourcesCycleSolver.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGResourcesCycleSolver.h; sourceTree = "<group>"; };
</span><del>-               4381763A13A697D4007D1187 /* SVGAnimatedLength.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedLength.cpp; sourceTree = "<group>"; };
</del><span class="cx">           439046C312DA25E800AF80A2 /* RenderMathMLBlock.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderMathMLBlock.cpp; sourceTree = "<group>"; };
</span><span class="cx">          439046C412DA25E800AF80A2 /* RenderMathMLBlock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderMathMLBlock.h; sourceTree = "<group>"; };
</span><span class="cx">          439046C512DA25E800AF80A2 /* RenderMathMLFenced.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderMathMLFenced.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -9523,6 +9516,10 @@
</span><span class="cx">          72F1ADA11A3904C300014E18 /* EXTFragDepth.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EXTFragDepth.idl; sourceTree = "<group>"; };
</span><span class="cx">          72F1ADA31A390B9F00014E18 /* JSEXTFragDepth.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSEXTFragDepth.cpp; sourceTree = "<group>"; };
</span><span class="cx">          72F1ADA41A390B9F00014E18 /* JSEXTFragDepth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSEXTFragDepth.h; sourceTree = "<group>"; };
</span><ins>+               72FB238422497AD4007E5AC7 /* SVGValuePropertyAnimatorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGValuePropertyAnimatorImpl.h; sourceTree = "<group>"; };
+               72FB238622497AD5007E5AC7 /* SVGValuePropertyAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGValuePropertyAnimator.h; sourceTree = "<group>"; };
+               72FB238722497B15007E5AC7 /* SVGValuePropertyListAnimatorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGValuePropertyListAnimatorImpl.h; sourceTree = "<group>"; };
+               72FB238822497B15007E5AC7 /* SVGValuePropertyListAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGValuePropertyListAnimator.h; sourceTree = "<group>"; };
</ins><span class="cx">           7553CFE6108F473F00EA281E /* TimelineRecordFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimelineRecordFactory.h; sourceTree = "<group>"; };
</span><span class="cx">          7553CFE7108F473F00EA281E /* TimelineRecordFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TimelineRecordFactory.cpp; sourceTree = "<group>"; };
</span><span class="cx">          75793E800D0CE0B3007FC0AC /* MessageEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = MessageEvent.cpp; sourceTree = "<group>"; };
</span><span class="lines">@@ -16259,7 +16256,11 @@
</span><span class="cx">                          088A0E02126EF1DB00978F7A /* SVGPropertyTearOff.h */,
</span><span class="cx">                          088A0E03126EF1DB00978F7A /* SVGPropertyTraits.h */,
</span><span class="cx">                          721443462240CAD200F12FF7 /* SVGValueProperty.h */,
</span><ins>+                               72FB238622497AD5007E5AC7 /* SVGValuePropertyAnimator.h */,
+                               72FB238422497AD4007E5AC7 /* SVGValuePropertyAnimatorImpl.h */,
</ins><span class="cx">                           7266F02522430F8C00833975 /* SVGValuePropertyList.h */,
</span><ins>+                               72FB238822497B15007E5AC7 /* SVGValuePropertyListAnimator.h */,
+                               72FB238722497B15007E5AC7 /* SVGValuePropertyListAnimatorImpl.h */,
</ins><span class="cx">                   );
</span><span class="cx">                  path = properties;
</span><span class="cx">                  sourceTree = "<group>";
</span><span class="lines">@@ -24338,8 +24339,6 @@
</span><span class="cx">                          7134496C146941B300720312 /* SVGLengthContext.h */,
</span><span class="cx">                          B22278A00D00BF200071B782 /* SVGLengthList.h */,
</span><span class="cx">                          B22278A10D00BF200071B782 /* SVGLengthList.idl */,
</span><del>-                               7C39C3621DDA864900FEFB29 /* SVGLengthListValues.cpp */,
-                               7C39C3631DDA864900FEFB29 /* SVGLengthListValues.h */,
</del><span class="cx">                           7CE58D521DD7B09300128552 /* SVGLengthValue.cpp */,
</span><span class="cx">                          7CE58D531DD7B09300128552 /* SVGLengthValue.h */,
</span><span class="cx">                          B22278A20D00BF200071B782 /* SVGLinearGradientElement.cpp */,
</span><span class="lines">@@ -31988,7 +31987,6 @@
</span><span class="cx">                          55D70D23223B017C00044B8E /* SVGLegacyAnimatedProperty.h in Headers */,
</span><span class="cx">                          7134496E146941B300720312 /* SVGLengthContext.h in Headers */,
</span><span class="cx">                          B2227A360D00BF220071B782 /* SVGLengthList.h in Headers */,
</span><del>-                               7C39C3651DDA865200FEFB29 /* SVGLengthListValues.h in Headers */,
</del><span class="cx">                           7CCEBFC01DD8F6AB002C40B8 /* SVGLengthValue.h in Headers */,
</span><span class="cx">                          B2227A390D00BF220071B782 /* SVGLinearGradientElement.h in Headers */,
</span><span class="cx">                          B2227A3C0D00BF220071B782 /* SVGLineElement.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWebCorerenderingsvgSVGTextLayoutAttributesBuildercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/rendering/svg/SVGTextLayoutAttributesBuilder.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/rendering/svg/SVGTextLayoutAttributesBuilder.cpp    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/rendering/svg/SVGTextLayoutAttributesBuilder.cpp       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -160,16 +160,16 @@
</span><span class="cx">         fillCharacterDataMap(m_textPositions[i]);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static inline void updateCharacterData(unsigned i, float& lastRotation, SVGCharacterData& data, const SVGLengthContext& lengthContext, const SVGLengthListValues* xList, const SVGLengthListValues* yList, const SVGLengthListValues* dxList, const SVGLengthListValues* dyList, const SVGNumberList* rotateList)
</del><ins>+static inline void updateCharacterData(unsigned i, float& lastRotation, SVGCharacterData& data, const SVGLengthContext& lengthContext, const SVGLengthList* xList, const SVGLengthList* yList, const SVGLengthList* dxList, const SVGLengthList* dyList, const SVGNumberList* rotateList)
</ins><span class="cx"> {
</span><span class="cx">     if (xList)
</span><del>-        data.x = xList->at(i).value(lengthContext);
</del><ins>+        data.x = xList->items()[i]->value().value(lengthContext);
</ins><span class="cx">     if (yList)
</span><del>-        data.y = yList->at(i).value(lengthContext);
</del><ins>+        data.y = yList->items()[i]->value().value(lengthContext);
</ins><span class="cx">     if (dxList)
</span><del>-        data.dx = dxList->at(i).value(lengthContext);
</del><ins>+        data.dx = dxList->items()[i]->value().value(lengthContext);
</ins><span class="cx">     if (dyList)
</span><del>-        data.dy = dyList->at(i).value(lengthContext);
</del><ins>+        data.dy = dyList->items()[i]->value().value(lengthContext);
</ins><span class="cx">     if (rotateList) {
</span><span class="cx">         data.rotate = rotateList->items()[i]->value();
</span><span class="cx">         lastRotation = data.rotate;
</span><span class="lines">@@ -195,10 +195,10 @@
</span><span class="cx">     float lastRotation = SVGTextLayoutAttributes::emptyValue();
</span><span class="cx">     SVGLengthContext lengthContext(position.element);
</span><span class="cx">     for (unsigned i = 0; i < position.length; ++i) {
</span><del>-        const SVGLengthListValues* xListPtr = i < xListSize ? &xList : 0;
-        const SVGLengthListValues* yListPtr = i < yListSize ? &yList : 0;
-        const SVGLengthListValues* dxListPtr = i < dxListSize ? &dxList : 0;
-        const SVGLengthListValues* dyListPtr = i < dyListSize ? &dyList : 0;
</del><ins>+        const SVGLengthList* xListPtr = i < xListSize ? &xList : nullptr;
+        const SVGLengthList* yListPtr = i < yListSize ? &yList : nullptr;
+        const SVGLengthList* dxListPtr = i < dxListSize ? &dxList : nullptr;
+        const SVGLengthList* dyListPtr = i < dyListSize ? &dyList : nullptr;
</ins><span class="cx">         const SVGNumberList* rotateListPtr = i < rotateListSize ? &rotateList : nullptr;
</span><span class="cx">         if (!xListPtr && !yListPtr && !dxListPtr && !dyListPtr && !rotateListPtr)
</span><span class="cx">             break;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimateElementBasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimateElementBase.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimateElementBase.cpp       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGAnimateElementBase.cpp  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -25,6 +25,7 @@
</span><span class="cx"> #include "SVGAnimateElementBase.h"
</span><span class="cx"> 
</span><span class="cx"> #include "QualifiedName.h"
</span><ins>+#include "SVGAnimatorFactory.h"
</ins><span class="cx"> #include "SVGAttributeAnimationController.h"
</span><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> #include "SVGLegacyAttributeAnimationController.h"
</span><span class="lines">@@ -63,7 +64,7 @@
</span><span class="cx">     if (!targetElement() || hasInvalidCSSAttributeType())
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    if (determineAnimatedPropertyType(*targetElement()) != AnimatedUnknown)
</del><ins>+    if (SVGAnimatorFactory::isSupportedAttributeType(determineAnimatedPropertyType(*targetElement())))
</ins><span class="cx">         return true;
</span><span class="cx"> 
</span><span class="cx">     return targetElement()->isAnimatedAttribute(attributeName());
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedLengthcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedLength.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedLength.cpp   2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGAnimatedLength.cpp      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,116 +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 "SVGAnimatedLength.h"
-
-#include "SVGAnimateElementBase.h"
-
-namespace WebCore {
-
-SVGAnimatedLengthAnimator::SVGAnimatedLengthAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement)
-    : SVGAnimatedTypeAnimator(AnimatedLength, animationElement, contextElement)
-    , m_lengthMode(SVGLengthValue::lengthModeForAnimatedLengthAttribute(animationElement->attributeName()))
-{
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedLengthAnimator::constructFromString(const String& string)
-{
-    return SVGAnimatedType::create(SVGLengthValue(m_lengthMode, string));
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedLengthAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    return constructFromBaseValue<SVGAnimatedLength>(animatedTypes);
-}
-
-void SVGAnimatedLengthAnimator::stopAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    stopAnimValAnimationForType<SVGAnimatedLength>(animatedTypes);
-}
-
-void SVGAnimatedLengthAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGAnimatedType& type)
-{
-    resetFromBaseValue<SVGAnimatedLength>(animatedTypes, type);
-}
-
-void SVGAnimatedLengthAnimator::animValWillChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValWillChangeForType<SVGAnimatedLength>(animatedTypes);
-}
-
-void SVGAnimatedLengthAnimator::animValDidChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValDidChangeForType<SVGAnimatedLength>(animatedTypes);
-}
-
-void SVGAnimatedLengthAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnimatedType* to)
-{
-    ASSERT(from->type() == AnimatedLength);
-    ASSERT(from->type() == to->type());
-
-    SVGLengthContext lengthContext(m_contextElement);
-    const auto& fromLength = from->as<SVGLengthValue>();
-    auto& toLength = to->as<SVGLengthValue>();
-
-    toLength.setValue(toLength.value(lengthContext) + fromLength.value(lengthContext), lengthContext);
-}
-
-static SVGLengthValue parseLengthFromString(SVGAnimationElement* animationElement, const String& string)
-{
-    SVGLengthValue length;
-    length.setValueAsString(string, SVGLengthValue::lengthModeForAnimatedLengthAttribute(animationElement->attributeName()));
-    return length;
-}
-
-void SVGAnimatedLengthAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType* toAtEndOfDuration, SVGAnimatedType* animated)
-{
-    ASSERT(m_animationElement);
-    ASSERT(m_contextElement);
-
-    auto fromSVGLength = (m_animationElement->animationMode() == AnimationMode::To ? animated : from)->as<SVGLengthValue>();
-    auto toSVGLength = to->as<SVGLengthValue>();
-    const auto& toAtEndOfDurationSVGLength = toAtEndOfDuration->as<SVGLengthValue>();
-    auto& animatedSVGLength = animated->as<SVGLengthValue>();
-
-    // Apply CSS inheritance rules.
-    m_animationElement->adjustForInheritance<SVGLengthValue>(parseLengthFromString, m_animationElement->fromPropertyValueType(), fromSVGLength, m_contextElement);
-    m_animationElement->adjustForInheritance<SVGLengthValue>(parseLengthFromString, m_animationElement->toPropertyValueType(), toSVGLength, m_contextElement);
-
-    SVGLengthContext lengthContext(m_contextElement);
-    float animatedNumber = animatedSVGLength.value(lengthContext);
-    SVGLengthType unitType = percentage < 0.5 ? fromSVGLength.unitType() : toSVGLength.unitType();
-    m_animationElement->animateAdditiveNumber(percentage, repeatCount, fromSVGLength.value(lengthContext), toSVGLength.value(lengthContext), toAtEndOfDurationSVGLength.value(lengthContext), animatedNumber);
-
-    animatedSVGLength.setValue(lengthContext, animatedNumber, m_lengthMode, unitType);
-}
-
-float SVGAnimatedLengthAnimator::calculateDistance(const String& fromString, const String& toString)
-{
-    ASSERT(m_animationElement);
-    ASSERT(m_contextElement);
-    auto lengthMode = SVGLengthValue::lengthModeForAnimatedLengthAttribute(m_animationElement->attributeName());
-    auto from = SVGLengthValue(lengthMode, fromString);
-    auto to = SVGLengthValue(lengthMode, toString);
-    SVGLengthContext lengthContext(m_contextElement);
-    return fabsf(to.value(lengthContext) - from.value(lengthContext));
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedLengthh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedLength.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedLength.h     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGAnimatedLength.h        2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,57 +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 "SVGAnimatedPropertyTearOff.h"
-#include "SVGAnimatedTypeAnimator.h"
-#include "SVGAttributeAccessor.h"
-#include "SVGLength.h"
-
-namespace WebCore {
-
-class SVGAnimationElement;
-
-using SVGAnimatedLength = SVGAnimatedPropertyTearOff<SVGLength>;
-using SVGAnimatedLengthAttribute = SVGAnimatedAttribute<SVGAnimatedLength>;
-
-template<typename OwnerType>
-using SVGAnimatedLengthAttributeAccessor = SVGAnimatedAttributeAccessor<OwnerType, SVGAnimatedLengthAttribute, AnimatedLength>;
-
-class SVGAnimatedLengthAnimator final : public SVGAnimatedTypeAnimator {
-public:
-    SVGAnimatedLengthAnimator(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;
-
-private:
-    SVGLengthMode m_lengthMode;
-};
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedLengthListcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedLengthList.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedLengthList.cpp       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGAnimatedLengthList.cpp  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,131 +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 "SVGAnimatedLengthList.h"
-
-#include "SVGAnimateElementBase.h"
-
-namespace WebCore {
-
-SVGAnimatedLengthListAnimator::SVGAnimatedLengthListAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement)
-    : SVGAnimatedTypeAnimator(AnimatedLengthList, animationElement, contextElement)
-    , m_lengthMode(SVGLengthValue::lengthModeForAnimatedLengthAttribute(animationElement->attributeName()))
-{
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedLengthListAnimator::constructFromString(const String& string)
-{
-    return SVGAnimatedType::create(SVGPropertyTraits<SVGLengthListValues>::fromString(string, m_lengthMode));
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedLengthListAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    return constructFromBaseValue<SVGAnimatedLengthList>(animatedTypes);
-}
-
-void SVGAnimatedLengthListAnimator::stopAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    stopAnimValAnimationForType<SVGAnimatedLengthList>(animatedTypes);
-}
-
-void SVGAnimatedLengthListAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGAnimatedType& type)
-{
-    resetFromBaseValue<SVGAnimatedLengthList>(animatedTypes, type);
-}
-
-void SVGAnimatedLengthListAnimator::animValWillChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValWillChangeForType<SVGAnimatedLengthList>(animatedTypes);
-}
-
-void SVGAnimatedLengthListAnimator::animValDidChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValDidChangeForType<SVGAnimatedLengthList>(animatedTypes);
-}
-
-void SVGAnimatedLengthListAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnimatedType* to)
-{
-    ASSERT(from->type() == AnimatedLengthList);
-    ASSERT(from->type() == to->type());
-
-    const auto& fromLengthList = from->as<SVGLengthListValues>();
-    auto& toLengthList = to->as<SVGLengthListValues>();
-
-    unsigned fromLengthListSize = fromLengthList.size();
-    if (!fromLengthListSize || fromLengthListSize != toLengthList.size())
-        return;
-
-    SVGLengthContext lengthContext(m_contextElement);
-    for (unsigned i = 0; i < fromLengthListSize; ++i)
-        toLengthList[i].setValue(toLengthList[i].value(lengthContext) + fromLengthList[i].value(lengthContext), lengthContext);
-}
-
-static SVGLengthListValues parseLengthListFromString(SVGAnimationElement* animationElement, const String& string)
-{
-    SVGLengthListValues lengthList;
-    lengthList.parse(string, SVGLengthValue::lengthModeForAnimatedLengthAttribute(animationElement->attributeName()));
-    return lengthList;
-}
-
-void SVGAnimatedLengthListAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType* toAtEndOfDuration, SVGAnimatedType* animated)
-{
-    ASSERT(m_animationElement);
-    ASSERT(m_contextElement);
-
-    auto fromLengthList = (m_animationElement->animationMode() == AnimationMode::To ? animated : from)->as<SVGLengthListValues>();
-    auto toLengthList = to->as<SVGLengthListValues>();
-    const auto& toAtEndOfDurationLengthList = toAtEndOfDuration->as<SVGLengthListValues>();
-    auto& animatedLengthList = animated->as<SVGLengthListValues>();
-
-    // Apply CSS inheritance rules.
-    m_animationElement->adjustForInheritance<SVGLengthListValues>(parseLengthListFromString, m_animationElement->fromPropertyValueType(), fromLengthList, m_contextElement);
-    m_animationElement->adjustForInheritance<SVGLengthListValues>(parseLengthListFromString, m_animationElement->toPropertyValueType(), toLengthList, m_contextElement);
-
-    if (!m_animationElement->adjustFromToListValues<SVGLengthListValues>(fromLengthList, toLengthList, animatedLengthList, percentage))
-        return;
-
-    unsigned fromLengthListSize = fromLengthList.size();
-    unsigned toLengthListSize = toLengthList.size();
-    unsigned toAtEndOfDurationListSize = toAtEndOfDurationLengthList.size();
-
-    SVGLengthContext lengthContext(m_contextElement);
-    for (unsigned i = 0; i < toLengthListSize; ++i) {
-        float animatedNumber = animatedLengthList[i].value(lengthContext);
-        SVGLengthType unitType = toLengthList[i].unitType();
-        float effectiveFrom = 0;
-        if (fromLengthListSize) {
-            if (percentage < 0.5)
-                unitType = fromLengthList[i].unitType();
-            effectiveFrom = fromLengthList[i].value(lengthContext);
-        }
-        float effectiveToAtEnd = i < toAtEndOfDurationListSize ? toAtEndOfDurationLengthList[i].value(lengthContext) : 0;
-
-        m_animationElement->animateAdditiveNumber(percentage, repeatCount, effectiveFrom, toLengthList[i].value(lengthContext), effectiveToAtEnd, animatedNumber);
-        animatedLengthList[i].setValue(lengthContext, animatedNumber, m_lengthMode, unitType);
-    }
-}
-
-float SVGAnimatedLengthListAnimator::calculateDistance(const String&, const String&)
-{
-    // FIXME: Distance calculation is not possible for SVGLengthListValues right now. We need the distance for every single value.
-    return -1;
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedLengthListh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGAnimatedLengthList.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedLengthList.h 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGAnimatedLengthList.h    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,58 +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 "SVGAnimatedListPropertyTearOff.h"
-#include "SVGAnimatedTypeAnimator.h"
-#include "SVGAttributeAccessor.h"
-#include "SVGLength.h"
-#include "SVGLengthList.h"
-
-namespace WebCore {
-
-class SVGAnimationElement;
-
-using SVGAnimatedLengthList = SVGAnimatedListPropertyTearOff<SVGLengthListValues>;
-using SVGAnimatedLengthListAttribute = SVGAnimatedAttributeList<SVGAnimatedLengthList>;
-
-template<typename OwnerType>
-using SVGAnimatedLengthListAttributeAccessor = SVGAnimatedAttributeAccessor<OwnerType, SVGAnimatedLengthListAttribute, AnimatedLengthList>;
-
-class SVGAnimatedLengthListAnimator final : public SVGAnimatedTypeAnimator {
-public:
-    SVGAnimatedLengthListAnimator(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;
-
-private:
-    SVGLengthMode m_lengthMode;
-};
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatedTypeh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimatedType.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatedType.h       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGAnimatedType.h  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -81,8 +81,6 @@
</span><span class="cx">     AnimatedPropertyType type() const
</span><span class="cx">     {
</span><span class="cx">         static AnimatedPropertyType animatedTypes[] = {
</span><del>-            AnimatedLength,
-            AnimatedLengthList,
</del><span class="cx">             AnimatedPath,
</span><span class="cx">             AnimatedTransformList
</span><span class="cx">         };
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimationElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimationElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimationElement.cpp 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGAnimationElement.cpp    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -336,13 +336,9 @@
</span><span class="cx">     return value == sum && animationMode() != AnimationMode::To;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool SVGAnimationElement::isTargetAttributeCSSProperty(SVGElement* element, const QualifiedName& attributeName)
</del><ins>+bool SVGAnimationElement::isTargetAttributeCSSProperty(SVGElement* targetElement, const QualifiedName& attributeName)
</ins><span class="cx"> {
</span><del>-    if (element->isTextContent()
-        && (attributeName == SVGNames::xAttr || attributeName == SVGNames::yAttr))
-        return false;
-
-    return SVGElement::isAnimatableCSSProperty(attributeName);
</del><ins>+    return targetElement->isAnimatedStyleAttribute(attributeName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> SVGAnimationElement::ShouldApplyAnimation SVGAnimationElement::shouldApplyAnimation(SVGElement* targetElement, const QualifiedName& attributeName)
</span><span class="lines">@@ -645,13 +641,13 @@
</span><span class="cx">     computeCSSPropertyValue(&svgParent, cssPropertyID(attributeName.localName()), value);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool inheritsFromProperty(SVGElement*, const QualifiedName& attributeName, const String& value)
</del><ins>+static bool inheritsFromProperty(SVGElement* targetElement, const QualifiedName& attributeName, const String& value)
</ins><span class="cx"> {
</span><span class="cx">     static NeverDestroyed<const AtomicString> inherit("inherit", AtomicString::ConstructFromLiteral);
</span><span class="cx">     
</span><span class="cx">     if (value.isEmpty() || value != inherit)
</span><span class="cx">         return false;
</span><del>-    return SVGElement::isAnimatableCSSProperty(attributeName);
</del><ins>+    return targetElement->isAnimatedStyleAttribute(attributeName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void SVGAnimationElement::determinePropertyValueTypes(const String& from, const String& to)
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGAnimatorFactoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGAnimatorFactory.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGAnimatorFactory.h    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGAnimatorFactory.h       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -19,8 +19,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGAnimatedLength.h"
-#include "SVGAnimatedLengthList.h"
</del><span class="cx"> #include "SVGAnimatedPath.h"
</span><span class="cx"> #include "SVGAnimatedTransformList.h"
</span><span class="cx"> 
</span><span class="lines">@@ -30,6 +28,33 @@
</span><span class="cx"> 
</span><span class="cx"> class SVGAnimatorFactory {
</span><span class="cx"> public:
</span><ins>+    static bool isSupportedAttributeType(AnimatedPropertyType attributeType)
+    {
+        switch (attributeType) {
+        case AnimatedAngle:
+        case AnimatedBoolean:
+        case AnimatedColor:
+        case AnimatedEnumeration:
+        case AnimatedInteger:
+        case AnimatedIntegerOptionalInteger:
+        case AnimatedLength:
+        case AnimatedLengthList:
+        case AnimatedNumber:
+        case AnimatedNumberList:
+        case AnimatedNumberOptionalNumber:
+        case AnimatedPoints:
+        case AnimatedPreserveAspectRatio:
+        case AnimatedRect:
+        case AnimatedString:
+        case AnimatedUnknown:
+            return false;
+
+        case AnimatedPath:
+        case AnimatedTransformList:
+            return true;
+        }
+    }
+
</ins><span class="cx">     static std::unique_ptr<SVGAnimatedTypeAnimator> create(SVGAnimationElement* animationElement, SVGElement* contextElement, AnimatedPropertyType attributeType)
</span><span class="cx">     {
</span><span class="cx">         ASSERT(animationElement);
</span><span class="lines">@@ -42,6 +67,8 @@
</span><span class="cx">         case AnimatedEnumeration:
</span><span class="cx">         case AnimatedInteger:
</span><span class="cx">         case AnimatedIntegerOptionalInteger:
</span><ins>+        case AnimatedLength:
+        case AnimatedLengthList:
</ins><span class="cx">         case AnimatedNumber:
</span><span class="cx">         case AnimatedNumberList:
</span><span class="cx">         case AnimatedNumberOptionalNumber:
</span><span class="lines">@@ -49,18 +76,13 @@
</span><span class="cx">         case AnimatedPreserveAspectRatio:
</span><span class="cx">         case AnimatedRect:
</span><span class="cx">         case AnimatedString:
</span><del>-            return nullptr;
</del><ins>+        case AnimatedUnknown:
+            break;
</ins><span class="cx"> 
</span><del>-        case AnimatedLength:
-            return std::make_unique<SVGAnimatedLengthAnimator>(animationElement, contextElement);
-        case AnimatedLengthList:
-            return std::make_unique<SVGAnimatedLengthListAnimator>(animationElement, contextElement);
</del><span class="cx">         case AnimatedPath:
</span><span class="cx">             return std::make_unique<SVGAnimatedPathAnimator>(animationElement, contextElement);
</span><span class="cx">         case AnimatedTransformList:
</span><span class="cx">             return std::make_unique<SVGAnimatedTransformListAnimator>(animationElement, contextElement);
</span><del>-        case AnimatedUnknown:
-            break;
</del><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         ASSERT_NOT_REACHED();
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGCircleElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGCircleElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGCircleElement.cpp    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGCircleElement.cpp       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
</span><del>- * Copyright (C) 2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -35,7 +35,13 @@
</span><span class="cx">     , SVGExternalResourcesRequired(this)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::circleTag));
</span><del>-    registerAttributes();
</del><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::cxAttr, &SVGCircleElement::m_cx>();
+        PropertyRegistry::registerProperty<SVGNames::cyAttr, &SVGCircleElement::m_cy>();
+        PropertyRegistry::registerProperty<SVGNames::rAttr, &SVGCircleElement::m_r>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGCircleElement> SVGCircleElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -43,26 +49,16 @@
</span><span class="cx">     return adoptRef(*new SVGCircleElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGCircleElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::cxAttr, &SVGCircleElement::m_cx>();
-    registry.registerAttribute<SVGNames::cyAttr, &SVGCircleElement::m_cy>();
-    registry.registerAttribute<SVGNames::rAttr, &SVGCircleElement::m_r>();
-}
-
</del><span class="cx"> void SVGCircleElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::cxAttr)
</span><del>-        m_cx.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_cx->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::cyAttr)
</span><del>-        m_cy.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_cy->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::rAttr)
</span><del>-        m_r.setValue(SVGLengthValue::construct(LengthModeOther, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_r->setBaseValInternal(SVGLengthValue::construct(LengthModeOther, value, parseError, ForbidNegativeLengths));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -72,7 +68,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGCircleElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         invalidateSVGPresentationAttributeStyle();
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGCircleElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGCircleElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGCircleElement.h      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGCircleElement.h 2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGeometryElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="lines">@@ -33,30 +32,23 @@
</span><span class="cx"> public:
</span><span class="cx">     static Ref<SVGCircleElement> create(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& cx() const { return m_cx.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& cy() const { return m_cy.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& r() const { return m_r.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& cx() const { return m_cx->currentValue(); }
+    const SVGLengthValue& cy() const { return m_cy->currentValue(); }
+    const SVGLengthValue& r() const { return m_r->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> cxAnimated() { return m_cx.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> cyAnimated() { return m_cy.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> rAnimated() { return m_r.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& cxAnimated() { return m_cx; }
+    SVGAnimatedLength& cyAnimated() { return m_cy; }
+    SVGAnimatedLength& rAnimated() { return m_r; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGCircleElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGCircleElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</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<SVGCircleElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</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">@@ -67,9 +59,9 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_cx { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_cy { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_r { LengthModeOther };
</del><ins>+    Ref<SVGAnimatedLength> m_cx { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_cy { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_r { SVGAnimatedLength::create(this, LengthModeOther) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGCursorElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGCursorElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGCursorElement.cpp    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGCursorElement.cpp       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
</span><del>- * Copyright (C) 2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -40,7 +40,12 @@
</span><span class="cx">     , SVGURIReference(this)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::cursorTag));
</span><del>-    registerAttributes();
</del><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGCursorElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGCursorElement::m_y>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGCursorElement> SVGCursorElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -54,23 +59,14 @@
</span><span class="cx">         client->cursorElementRemoved(*this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGCursorElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGCursorElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGCursorElement::m_y>();
-}
-
</del><span class="cx"> void SVGCursorElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -92,7 +88,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGCursorElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         for (auto& client : m_clients)
</span><span class="cx">             client->cursorElementChanged(*this);
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGCursorElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGCursorElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGCursorElement.h      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGCursorElement.h 2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGTests.h"
</span><span class="lines">@@ -41,28 +40,21 @@
</span><span class="cx">     void addClient(CSSCursorImageValue&);
</span><span class="cx">     void removeClient(CSSCursorImageValue&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGCursorElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGCursorElement, SVGElement, SVGExternalResourcesRequired, SVGTests, SVGURIReference>;
</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<SVGCursorElement, SVGElement, SVGExternalResourcesRequired, SVGTests, SVGURIReference>;
</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">@@ -73,8 +65,8 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight };
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight) };
</ins><span class="cx">     HashSet<CSSCursorImageValue*> m_clients;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGElement.cpp  2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGElement.cpp     2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -762,6 +762,11 @@
</span><span class="cx">     return SVGPropertyAnimatorFactory::isKnownAttribute(attributeName) || isAnimatedPropertyAttribute(attributeName);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool SVGElement::isAnimatedStyleAttribute(const QualifiedName& attributeName) const
+{
+    return SVGPropertyAnimatorFactory::isKnownAttribute(attributeName) || propertyRegistry().isAnimatedStylePropertyAttribute(attributeName);
+}
+
</ins><span class="cx"> std::unique_ptr<SVGAttributeAnimator> SVGElement::createAnimator(const QualifiedName& attributeName, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
</span><span class="cx"> {
</span><span class="cx">     // Property animator, e.g. "fill" or "fill-opacity".
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGElement.h    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGElement.h       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -156,6 +156,7 @@
</span><span class="cx"> 
</span><span class="cx">     bool isAnimatedPropertyAttribute(const QualifiedName&) const;
</span><span class="cx">     bool isAnimatedAttribute(const QualifiedName&) const;
</span><ins>+    bool isAnimatedStyleAttribute(const QualifiedName&) const;
</ins><span class="cx"> 
</span><span class="cx">     void commitPropertyChange(SVGProperty*) override;
</span><span class="cx">     void commitPropertyChange(SVGAnimatedProperty&);
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGEllipseElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGEllipseElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGEllipseElement.cpp   2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGEllipseElement.cpp      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
</span><del>- * Copyright (C) 2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -35,7 +35,14 @@
</span><span class="cx">     , SVGExternalResourcesRequired(this)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::ellipseTag));
</span><del>-    registerAttributes();
</del><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::cxAttr, &SVGEllipseElement::m_cx>();
+        PropertyRegistry::registerProperty<SVGNames::cyAttr, &SVGEllipseElement::m_cy>();
+        PropertyRegistry::registerProperty<SVGNames::rxAttr, &SVGEllipseElement::m_rx>();
+        PropertyRegistry::registerProperty<SVGNames::ryAttr, &SVGEllipseElement::m_ry>();
+    });
</ins><span class="cx"> }    
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGEllipseElement> SVGEllipseElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -43,29 +50,18 @@
</span><span class="cx">     return adoptRef(*new SVGEllipseElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGEllipseElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::cxAttr, &SVGEllipseElement::m_cx>();
-    registry.registerAttribute<SVGNames::cyAttr, &SVGEllipseElement::m_cy>();
-    registry.registerAttribute<SVGNames::rxAttr, &SVGEllipseElement::m_rx>();
-    registry.registerAttribute<SVGNames::ryAttr, &SVGEllipseElement::m_ry>();
-}
-
</del><span class="cx"> void SVGEllipseElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::cxAttr)
</span><del>-        m_cx.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_cx->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::cyAttr)
</span><del>-        m_cy.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_cy->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::rxAttr)
</span><del>-        m_rx.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_rx->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</ins><span class="cx">     else if (name == SVGNames::ryAttr)
</span><del>-        m_ry.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_ry->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -75,7 +71,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGEllipseElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         invalidateSVGPresentationAttributeStyle();
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGEllipseElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGEllipseElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGEllipseElement.h     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGEllipseElement.h        2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGeometryElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="lines">@@ -33,32 +32,25 @@
</span><span class="cx"> public:
</span><span class="cx">     static Ref<SVGEllipseElement> create(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& cx() const { return m_cx.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& cy() const { return m_cy.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& rx() const { return m_rx.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& ry() const { return m_ry.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& cx() const { return m_cx->currentValue(); }
+    const SVGLengthValue& cy() const { return m_cy->currentValue(); }
+    const SVGLengthValue& rx() const { return m_rx->currentValue(); }
+    const SVGLengthValue& ry() const { return m_ry->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> cxAnimated() { return m_cx.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> cyAnimated() { return m_cy.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> rxAnimated() { return m_rx.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> ryAnimated() { return m_ry.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& cxAnimated() { return m_cx; }
+    SVGAnimatedLength& cyAnimated() { return m_cy; }
+    SVGAnimatedLength& rxAnimated() { return m_rx; }
+    SVGAnimatedLength& ryAnimated() { return m_ry; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGEllipseElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGEllipseElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</span><del>-    static AttributeOwnerProxy::AttributeRegistry& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
-    static void registerAttributes();
</del><span class="cx">     const SVGAttributeOwnerProxy& attributeOwnerProxy() const final { return m_attributeOwnerProxy; }
</span><span class="cx">     
</span><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGEllipseElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</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">@@ -69,10 +61,10 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_cx { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_cy { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_rx { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_ry { LengthModeHeight };
</del><ins>+    Ref<SVGAnimatedLength> m_cx { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_cy { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_rx { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_ry { SVGAnimatedLength::create(this, LengthModeHeight) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFilterElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFilterElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFilterElement.cpp    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGFilterElement.cpp       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -46,12 +46,15 @@
</span><span class="cx">     // Spec: If the x/y attribute is not specified, the effect is as if a value of "-10%" were specified.
</span><span class="cx">     // Spec: If the width/height attribute is not specified, the effect is as if a value of "120%" were specified.
</span><span class="cx">     ASSERT(hasTagName(SVGNames::filterTag));
</span><del>-    registerAttributes();
</del><span class="cx"> 
</span><span class="cx">     static std::once_flag onceFlag;
</span><span class="cx">     std::call_once(onceFlag, [] {
</span><span class="cx">         PropertyRegistry::registerProperty<SVGNames::filterUnitsAttr, SVGUnitTypes::SVGUnitType, &SVGFilterElement::m_filterUnits>();
</span><span class="cx">         PropertyRegistry::registerProperty<SVGNames::primitiveUnitsAttr, SVGUnitTypes::SVGUnitType, &SVGFilterElement::m_primitiveUnits>();
</span><ins>+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGFilterElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGFilterElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::widthAttr, &SVGFilterElement::m_width>();
+        PropertyRegistry::registerProperty<SVGNames::heightAttr, &SVGFilterElement::m_height>();
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -60,17 +63,6 @@
</span><span class="cx">     return adoptRef(*new SVGFilterElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGFilterElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGFilterElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGFilterElement::m_y>();
-    registry.registerAttribute<SVGNames::widthAttr, &SVGFilterElement::m_width>();
-    registry.registerAttribute<SVGNames::heightAttr, &SVGFilterElement::m_height>();
-}
-
</del><span class="cx"> void SVGFilterElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="lines">@@ -84,13 +76,13 @@
</span><span class="cx">         if (propertyValue > 0)
</span><span class="cx">             m_primitiveUnits->setBaseValInternal<SVGUnitTypes::SVGUnitType>(propertyValue);
</span><span class="cx">     } else if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::widthAttr)
</span><del>-        m_width.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_width->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::heightAttr)
</span><del>-        m_height.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_height->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -101,13 +93,13 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGFilterElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isAnimatedLengthAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isAnimatedLengthAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         invalidateSVGPresentationAttributeStyle();
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (isKnownAttribute(attrName) || SVGURIReference::isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName) || SVGURIReference::isKnownAttribute(attrName)) {
</ins><span class="cx">         if (auto* renderer = this->renderer())
</span><span class="cx">             renderer->setNeedsLayout();
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFilterElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFilterElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFilterElement.h      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGFilterElement.h 2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGURIReference.h"
</span><span class="lines">@@ -38,36 +37,27 @@
</span><span class="cx"> 
</span><span class="cx">     SVGUnitTypes::SVGUnitType filterUnits() const { return m_filterUnits->currentValue<SVGUnitTypes::SVGUnitType>(); }
</span><span class="cx">     SVGUnitTypes::SVGUnitType primitiveUnits() const { return m_primitiveUnits->currentValue<SVGUnitTypes::SVGUnitType>(); }
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
+    const SVGLengthValue& width() const { return m_width->currentValue(); }
+    const SVGLengthValue& height() const { return m_height->currentValue(); }
</ins><span class="cx"> 
</span><span class="cx">     SVGAnimatedEnumeration& filterUnitsAnimated() { return m_filterUnits; }
</span><span class="cx">     SVGAnimatedEnumeration& primitiveUnitsAnimated() { return m_primitiveUnits; }
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
+    SVGAnimatedLength& widthAnimated() { return m_width; }
+    SVGAnimatedLength& heightAnimated() { return m_height; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGFilterElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGFilterElement, SVGElement, SVGExternalResourcesRequired, SVGURIReference>;
</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<SVGFilterElement, SVGElement, SVGExternalResourcesRequired, SVGURIReference>;
</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);
-    }
-
-    static bool isAnimatedLengthAttribute(const QualifiedName& attributeName) { return AttributeOwnerProxy::isAnimatedLengthAttribute(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">     void childrenChanged(const ChildChange&) final;
</span><span class="lines">@@ -83,10 +73,10 @@
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     Ref<SVGAnimatedEnumeration> m_filterUnits { SVGAnimatedEnumeration::create(this, SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) };
</span><span class="cx">     Ref<SVGAnimatedEnumeration> m_primitiveUnits { SVGAnimatedEnumeration::create(this, SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE) };
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth, "-10%" };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight, "-10%" };
-    SVGAnimatedLengthAttribute m_width { LengthModeWidth, "120%" };
-    SVGAnimatedLengthAttribute m_height { LengthModeHeight, "120%" };
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth, "-10%") };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight, "-10%") };
+    Ref<SVGAnimatedLength> m_width { SVGAnimatedLength::create(this, LengthModeWidth, "120%") };
+    Ref<SVGAnimatedLength> m_height { SVGAnimatedLength::create(this, LengthModeHeight, "120%") };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFilterPrimitiveStandardAttributescpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp        2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.cpp   2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 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) 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,37 +36,28 @@
</span><span class="cx"> SVGFilterPrimitiveStandardAttributes::SVGFilterPrimitiveStandardAttributes(const QualifiedName& tagName, Document& document)
</span><span class="cx">     : SVGElement(tagName, document)
</span><span class="cx"> {
</span><del>-    registerAttributes();
-
</del><span class="cx">     static std::once_flag onceFlag;
</span><span class="cx">     std::call_once(onceFlag, [] {
</span><ins>+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGFilterPrimitiveStandardAttributes::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGFilterPrimitiveStandardAttributes::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::widthAttr, &SVGFilterPrimitiveStandardAttributes::m_width>();
+        PropertyRegistry::registerProperty<SVGNames::heightAttr, &SVGFilterPrimitiveStandardAttributes::m_height>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::resultAttr, &SVGFilterPrimitiveStandardAttributes::m_result>();
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGFilterPrimitiveStandardAttributes::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGFilterPrimitiveStandardAttributes::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGFilterPrimitiveStandardAttributes::m_y>();
-    registry.registerAttribute<SVGNames::widthAttr, &SVGFilterPrimitiveStandardAttributes::m_width>();
-    registry.registerAttribute<SVGNames::heightAttr, &SVGFilterPrimitiveStandardAttributes::m_height>();
-}
-
</del><span class="cx"> void SVGFilterPrimitiveStandardAttributes::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::widthAttr)
</span><del>-        m_width.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_width->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::heightAttr)
</span><del>-        m_height.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_height->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::resultAttr)
</span><span class="cx">         m_result->setBaseValInternal(value);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGFilterPrimitiveStandardAttributesh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h  2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGFilterPrimitiveStandardAttributes.h     2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include "RenderSVGResourceFilter.h"
</span><span class="cx"> #include "RenderSVGResourceFilterPrimitive.h"
</span><del>-#include "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="cx"> #include <wtf/RefPtr.h>
</span><span class="lines">@@ -48,16 +47,16 @@
</span><span class="cx"> 
</span><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGFilterPrimitiveStandardAttributes, SVGElement>;
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
+    const SVGLengthValue& width() const { return m_width->currentValue(); }
+    const SVGLengthValue& height() const { return m_height->currentValue(); }
</ins><span class="cx">     String result() const { return m_result->currentValue(); }
</span><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
+    SVGAnimatedLength& widthAnimated() { return m_width; }
+    SVGAnimatedLength& heightAnimated() { return m_height; }
</ins><span class="cx">     SVGAnimatedString& resultAnimated() { return m_result; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="lines">@@ -71,16 +70,9 @@
</span><span class="cx">     void primitiveAttributeChanged(const QualifiedName& attributeName);
</span><span class="cx"> 
</span><span class="cx"> private:
</span><del>-    static void registerAttributes();
</del><span class="cx">     const SVGAttributeOwnerProxy& attributeOwnerProxy() const override { return m_attributeOwnerProxy; }
</span><del>-
</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">     bool isFilterEffect() const override { return true; }
</span><span class="cx"> 
</span><span class="cx">     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
</span><span class="lines">@@ -91,10 +83,10 @@
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><span class="cx">     // Spec: If the x/y attribute is not specified, the effect is as if a value of "0%" were specified.
</span><span class="cx">     // Spec: If the width/height attribute is not specified, the effect is as if a value of "100%" were specified.
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth, "0%" };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight, "0%" };
-    SVGAnimatedLengthAttribute m_width { LengthModeWidth, "100%" };
-    SVGAnimatedLengthAttribute m_height { LengthModeHeight, "100%" };
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth, "0%") };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight, "0%") };
+    Ref<SVGAnimatedLength> m_width { SVGAnimatedLength::create(this, LengthModeWidth, "100%") };
+    Ref<SVGAnimatedLength> m_height { SVGAnimatedLength::create(this, LengthModeHeight, "100%") };
</ins><span class="cx">     Ref<SVGAnimatedString> m_result { SVGAnimatedString::create(this) };
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGForeignObjectElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGForeignObjectElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGForeignObjectElement.cpp     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGForeignObjectElement.cpp        2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2006-2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2006-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  * Copyright (C) 2008 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
</span><span class="cx">  *
</span><span class="lines">@@ -40,7 +40,13 @@
</span><span class="cx">     , SVGExternalResourcesRequired(this)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::foreignObjectTag));
</span><del>-    registerAttributes();
</del><ins>+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGForeignObjectElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGForeignObjectElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::widthAttr, &SVGForeignObjectElement::m_width>();
+        PropertyRegistry::registerProperty<SVGNames::heightAttr, &SVGForeignObjectElement::m_height>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGForeignObjectElement> SVGForeignObjectElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -48,29 +54,18 @@
</span><span class="cx">     return adoptRef(*new SVGForeignObjectElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGForeignObjectElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGForeignObjectElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGForeignObjectElement::m_y>();
-    registry.registerAttribute<SVGNames::widthAttr, &SVGForeignObjectElement::m_width>();
-    registry.registerAttribute<SVGNames::heightAttr, &SVGForeignObjectElement::m_height>();
-}
-
</del><span class="cx"> void SVGForeignObjectElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::widthAttr)
</span><del>-        m_width.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_width->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::heightAttr)
</span><del>-        m_height.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_height->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGForeignObjectElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGForeignObjectElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGForeignObjectElement.h       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGForeignObjectElement.h  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -19,7 +19,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGraphicsElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="lines">@@ -32,32 +31,25 @@
</span><span class="cx"> public:
</span><span class="cx">     static Ref<SVGForeignObjectElement> create(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
+    const SVGLengthValue& width() const { return m_width->currentValue(); }
+    const SVGLengthValue& height() const { return m_height->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
+    SVGAnimatedLength& widthAnimated() { return m_width; }
+    SVGAnimatedLength& heightAnimated() { return m_height; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGForeignObjectElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGForeignObjectElement, SVGGraphicsElement, SVGExternalResourcesRequired>;
</span><del>-    static AttributeOwnerProxy::AttributeRegistry& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
-    static void registerAttributes();
</del><span class="cx">     const SVGAttributeOwnerProxy& attributeOwnerProxy() const final { return m_attributeOwnerProxy; }
</span><span class="cx"> 
</span><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGForeignObjectElement, SVGGraphicsElement, SVGExternalResourcesRequired>;
</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">@@ -70,10 +62,10 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_width { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_height { LengthModeHeight };
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_width { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_height { SVGAnimatedLength::create(this, LengthModeHeight) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGImageElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGImageElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGImageElement.cpp     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGImageElement.cpp        2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -3,7 +3,7 @@
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Rob Buis <buis@kde.org>
</span><span class="cx">  * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org>
</span><span class="cx">  * Copyright (C) 2014 Adobe Systems Incorporated. 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">@@ -43,10 +43,12 @@
</span><span class="cx">     , SVGURIReference(this)
</span><span class="cx">     , m_imageLoader(*this)
</span><span class="cx"> {
</span><del>-    registerAttributes();
-
</del><span class="cx">     static std::once_flag onceFlag;
</span><span class="cx">     std::call_once(onceFlag, [] {
</span><ins>+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGImageElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGImageElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::widthAttr, &SVGImageElement::m_width>();
+        PropertyRegistry::registerProperty<SVGNames::heightAttr, &SVGImageElement::m_height>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::preserveAspectRatioAttr, &SVGImageElement::m_preserveAspectRatio>();
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -65,17 +67,6 @@
</span><span class="cx">     return !image || image->hasSingleSecurityOrigin();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGImageElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGImageElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGImageElement::m_y>();
-    registry.registerAttribute<SVGNames::widthAttr, &SVGImageElement::m_width>();
-    registry.registerAttribute<SVGNames::heightAttr, &SVGImageElement::m_height>();
-}
-
</del><span class="cx"> void SVGImageElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (name == SVGNames::preserveAspectRatioAttr) {
</span><span class="lines">@@ -88,13 +79,13 @@
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::widthAttr)
</span><del>-        m_width.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_width->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</ins><span class="cx">     else if (name == SVGNames::heightAttr)
</span><del>-        m_height.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_height->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGImageElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGImageElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGImageElement.h       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGImageElement.h  2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGraphicsElement.h"
</span><span class="cx"> #include "SVGImageLoader.h"
</span><span class="lines">@@ -37,16 +36,16 @@
</span><span class="cx">     bool hasSingleSecurityOrigin() const;
</span><span class="cx">     const AtomicString& imageSourceURL() const final;
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
+    const SVGLengthValue& width() const { return m_width->currentValue(); }
+    const SVGLengthValue& height() const { return m_height->currentValue(); }
</ins><span class="cx">     const SVGPreserveAspectRatioValue& preserveAspectRatio() const { return m_preserveAspectRatio->currentValue(); }
</span><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
+    SVGAnimatedLength& widthAnimated() { return m_width; }
+    SVGAnimatedLength& heightAnimated() { return m_height; }
</ins><span class="cx">     SVGAnimatedPreserveAspectRatio& preserveAspectRatioAnimated() { return m_preserveAspectRatio; }
</span><span class="cx"> 
</span><span class="cx"> private:
</span><span class="lines">@@ -53,18 +52,11 @@
</span><span class="cx">     SVGImageElement(const QualifiedName&, Document&);
</span><span class="cx">     
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGImageElement, SVGGraphicsElement, SVGExternalResourcesRequired, SVGURIReference>;
</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<SVGImageElement, SVGGraphicsElement, SVGExternalResourcesRequired, SVGURIReference>;
</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">@@ -81,10 +73,10 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_width { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_height { LengthModeHeight };
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_width { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_height { SVGAnimatedLength::create(this, LengthModeHeight) };
</ins><span class="cx">     Ref<SVGAnimatedPreserveAspectRatio> m_preserveAspectRatio { SVGAnimatedPreserveAspectRatio::create(this) };
</span><span class="cx">     SVGImageLoader m_imageLoader;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGLengthh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGLength.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGLength.h     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGLength.h        2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -26,11 +26,15 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "SVGLengthValue.h"
</span><del>-#include "SVGPropertyTearOff.h"
</del><ins>+#include "SVGValueProperty.h"
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class SVGLength : public SVGPropertyTearOff<SVGLengthValue> {
</del><ins>+class SVGLength : public SVGValueProperty<SVGLengthValue> {
+    using Base = SVGValueProperty<SVGLengthValue>;
+    using Base::Base;
+    using Base::m_value;
+
</ins><span class="cx"> public:
</span><span class="cx">     // Forward declare these enums in the w3c naming scheme, for IDL generation
</span><span class="cx">     enum {
</span><span class="lines">@@ -47,31 +51,42 @@
</span><span class="cx">         SVG_LENGTHTYPE_PC = LengthTypePC
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    static Ref<SVGLength> create(SVGLegacyAnimatedProperty& animatedProperty, SVGPropertyRole role, SVGLengthValue& value)
</del><ins>+    static Ref<SVGLength> create()
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new SVGLength(animatedProperty, role, value));
</del><ins>+        return adoptRef(*new SVGLength());
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    static Ref<SVGLength> create(const SVGLengthValue& initialValue = { })
</del><ins>+    static Ref<SVGLength> create(const SVGLengthValue& value)
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new SVGLength(initialValue));
</del><ins>+        return adoptRef(*new SVGLength(value));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    template<typename T> static ExceptionOr<Ref<SVGLength>> create(ExceptionOr<T>&& initialValue)
</del><ins>+    static Ref<SVGLength> create(SVGPropertyOwner* owner, SVGPropertyAccess access, const SVGLengthValue& value = { })
</ins><span class="cx">     {
</span><del>-        if (initialValue.hasException())
-            return initialValue.releaseException();
-        return create(initialValue.releaseReturnValue());
</del><ins>+        return adoptRef(*new SVGLength(owner, access, value));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    template<typename T>
+    static ExceptionOr<Ref<SVGLength>> create(ExceptionOr<T>&& value)
+    {
+        if (value.hasException())
+            return value.releaseException();
+        return adoptRef(*new SVGLength(value.releaseReturnValue()));
+    }
+
+    Ref<SVGLength> clone() const
+    {
+        return SVGLength::create(m_value);
+    }
+
</ins><span class="cx">     unsigned short unitType()
</span><span class="cx">     {
</span><del>-        return propertyReference().unitType();
</del><ins>+        return m_value.unitType();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ExceptionOr<float> valueForBindings()
</span><span class="cx">     {
</span><del>-        return propertyReference().valueForBindings(SVGLengthContext { contextElement() });
</del><ins>+        return m_value.valueForBindings(SVGLengthContext { contextElement() });
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ExceptionOr<void> setValueForBindings(float value)
</span><span class="lines">@@ -79,7 +94,7 @@
</span><span class="cx">         if (isReadOnly())
</span><span class="cx">             return Exception { NoModificationAllowedError };
</span><span class="cx"> 
</span><del>-        auto result = propertyReference().setValue(value, SVGLengthContext { contextElement() });
</del><ins>+        auto result = m_value.setValue(value, SVGLengthContext { contextElement() });
</ins><span class="cx">         if (result.hasException())
</span><span class="cx">             return result;
</span><span class="cx">         
</span><span class="lines">@@ -89,7 +104,7 @@
</span><span class="cx">     
</span><span class="cx">     float valueInSpecifiedUnits()
</span><span class="cx">     {
</span><del>-        return propertyReference().valueInSpecifiedUnits();
</del><ins>+        return m_value.valueInSpecifiedUnits();
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     ExceptionOr<void> setValueInSpecifiedUnits(float valueInSpecifiedUnits)
</span><span class="lines">@@ -97,23 +112,17 @@
</span><span class="cx">         if (isReadOnly())
</span><span class="cx">             return Exception { NoModificationAllowedError };
</span><span class="cx"> 
</span><del>-        propertyReference().setValueInSpecifiedUnits(valueInSpecifiedUnits);
</del><ins>+        m_value.setValueInSpecifiedUnits(valueInSpecifiedUnits);
</ins><span class="cx">         commitChange();
</span><del>-        
</del><span class="cx">         return { };
</span><span class="cx">     }
</span><span class="cx">     
</span><del>-    String valueAsString()
-    {
-        return propertyReference().valueAsString();
-    }
-
</del><span class="cx">     ExceptionOr<void> setValueAsString(const String& value)
</span><span class="cx">     {
</span><span class="cx">         if (isReadOnly())
</span><span class="cx">             return Exception { NoModificationAllowedError };
</span><span class="cx"> 
</span><del>-        auto result = propertyReference().setValueAsString(value);
</del><ins>+        auto result = m_value.setValueAsString(value);
</ins><span class="cx">         if (result.hasException())
</span><span class="cx">             return result;
</span><span class="cx">         
</span><span class="lines">@@ -126,7 +135,7 @@
</span><span class="cx">         if (isReadOnly())
</span><span class="cx">             return Exception { NoModificationAllowedError };
</span><span class="cx"> 
</span><del>-        auto result = propertyReference().newValueSpecifiedUnits(unitType, valueInSpecifiedUnits);
</del><ins>+        auto result = m_value.newValueSpecifiedUnits(unitType, valueInSpecifiedUnits);
</ins><span class="cx">         if (result.hasException())
</span><span class="cx">             return result;
</span><span class="cx">         
</span><span class="lines">@@ -139,7 +148,7 @@
</span><span class="cx">         if (isReadOnly())
</span><span class="cx">             return Exception { NoModificationAllowedError };
</span><span class="cx"> 
</span><del>-        auto result = propertyReference().convertToSpecifiedUnits(unitType, SVGLengthContext { contextElement() });
</del><ins>+        auto result = m_value.convertToSpecifiedUnits(unitType, SVGLengthContext { contextElement() });
</ins><span class="cx">         if (result.hasException())
</span><span class="cx">             return result;
</span><span class="cx">         
</span><span class="lines">@@ -146,17 +155,11 @@
</span><span class="cx">         commitChange();
</span><span class="cx">         return result;
</span><span class="cx">     }
</span><del>-
-private:
-    SVGLength(SVGLegacyAnimatedProperty& animatedProperty, SVGPropertyRole role, SVGLengthValue& value)
-        : SVGPropertyTearOff<SVGLengthValue>(&animatedProperty, role, value)
</del><ins>+    
+    String valueAsString() const override
</ins><span class="cx">     {
</span><ins>+        return m_value.valueAsString();
</ins><span class="cx">     }
</span><del>-
-    explicit SVGLength(const SVGLengthValue& initialValue)
-        : SVGPropertyTearOff<SVGLengthValue>(initialValue)
-    {
-    }
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGLengthListh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGLengthList.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGLengthList.h 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGLengthList.h    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2016 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2016-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -25,27 +25,92 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGAnimatedListPropertyTearOff.h"
-#include "SVGLengthListValues.h"
-#include "SVGListPropertyTearOff.h"
</del><ins>+#include "SVGLength.h"
+#include "SVGValuePropertyList.h"
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-class SVGLengthList : public SVGListPropertyTearOff<SVGLengthListValues> {
</del><ins>+class SVGLengthList : public SVGValuePropertyList<SVGLength> {
+    using Base = SVGValuePropertyList<SVGLength>;
+    using Base::Base;
+
</ins><span class="cx"> public:
</span><del>-    using AnimatedListPropertyTearOff = SVGAnimatedListPropertyTearOff<SVGLengthListValues>;
-    using ListWrapperCache = AnimatedListPropertyTearOff::ListWrapperCache;
</del><ins>+    static Ref<SVGLengthList> create(SVGLengthMode lengthMode = LengthModeOther)
+    {
+        return adoptRef(*new SVGLengthList(lengthMode));
+    }
</ins><span class="cx"> 
</span><del>-    static Ref<SVGLengthList> create(AnimatedListPropertyTearOff& animatedProperty, SVGPropertyRole role, SVGLengthListValues& values, ListWrapperCache& wrappers)
</del><ins>+    static Ref<SVGLengthList> create(SVGPropertyOwner* owner, SVGPropertyAccess access, SVGLengthMode lengthMode)
</ins><span class="cx">     {
</span><del>-        return adoptRef(*new SVGLengthList(animatedProperty, role, values, wrappers));
</del><ins>+        return adoptRef(*new SVGLengthList(owner, access, lengthMode));
</ins><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    static Ref<SVGLengthList> create(const SVGLengthList& other, SVGPropertyAccess access)
+    {
+        return adoptRef(*new SVGLengthList(other, access));
+    }
+
+    SVGLengthMode lengthMode() const { return m_lengthMode; }
+
+    bool parse(const String& value)
+    {
+        clearItems();
+
+        auto upconvertedCharacters = StringView(value).upconvertedCharacters();
+        const UChar* ptr = upconvertedCharacters;
+        const UChar* end = ptr + value.length();
+        while (ptr < end) {
+            const UChar* start = ptr;
+            while (ptr < end && *ptr != ',' && !isSVGSpace(*ptr))
+                ptr++;
+            if (ptr == start)
+                break;
+
+            String valueString(start, ptr - start);
+            SVGLengthValue value(m_lengthMode);
+            if (value.setValueAsString(valueString).hasException())
+                break;
+
+            append(SVGLength::create(value));
+            skipOptionalSVGSpacesOrDelimiter(ptr, end);
+        }
+
+        return ptr == end;
+    }
+
+    String valueAsString() const override
+    {
+        StringBuilder builder;
+
+        for (const auto& length : m_items) {
+            if (builder.length())
+                builder.append(' ');
+
+            builder.append(length->value().valueAsString());
+        }
+
+        return builder.toString();
+    }
+    
</ins><span class="cx"> private:
</span><del>-    SVGLengthList(AnimatedListPropertyTearOff& animatedProperty, SVGPropertyRole role, SVGLengthListValues& values, ListWrapperCache& wrappers)
-        : SVGListPropertyTearOff<SVGLengthListValues>(animatedProperty, role, values, wrappers)
</del><ins>+    SVGLengthList(SVGLengthMode lengthMode)
+        : m_lengthMode(lengthMode)
</ins><span class="cx">     {
</span><span class="cx">     }
</span><ins>+
+    SVGLengthList(SVGPropertyOwner* owner, SVGPropertyAccess access, SVGLengthMode lengthMode)
+        : Base(owner, access)
+        , m_lengthMode(lengthMode)
+    {
+    }
+
+    SVGLengthList(const SVGLengthList& other, SVGPropertyAccess access)
+        : Base(other, access)
+        , m_lengthMode(other.lengthMode())
+    {
+    }
+
+    SVGLengthMode m_lengthMode { LengthModeOther };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGLengthListValuescpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGLengthListValues.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGLengthListValues.cpp 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGLengthListValues.cpp    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,69 +0,0 @@
</span><del>-/*
- * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include "SVGLengthListValues.h"
-
-#include "SVGParserUtilities.h"
-#include <wtf/text/StringBuilder.h>
-
-namespace WebCore {
-
-void SVGLengthListValues::parse(const String& value, SVGLengthMode mode)
-{
-    clear();
-
-    auto upconvertedCharacters = StringView(value).upconvertedCharacters();
-    const UChar* ptr = upconvertedCharacters;
-    const UChar* end = ptr + value.length();
-    while (ptr < end) {
-        const UChar* start = ptr;
-        while (ptr < end && *ptr != ',' && !isSVGSpace(*ptr))
-            ptr++;
-        if (ptr == start)
-            break;
-
-        SVGLengthValue length(mode);
-        String valueString(start, ptr - start);
-        if (valueString.isEmpty())
-            return;
-        if (length.setValueAsString(valueString).hasException())
-            return;
-        append(length);
-        skipOptionalSVGSpacesOrDelimiter(ptr, end);
-    }
-}
-
-String SVGLengthListValues::valueAsString() const
-{
-    StringBuilder builder;
-
-    unsigned size = this->size();
-    for (unsigned i = 0; i < size; ++i) {
-        if (i > 0)
-            builder.append(' ');
-
-        builder.append(at(i).valueAsString());
-    }
-
-    return builder.toString();
-}
-
-}
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGLengthListValuesh"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebCore/svg/SVGLengthListValues.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGLengthListValues.h   2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGLengthListValues.h      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,59 +0,0 @@
</span><del>-/*
- * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGLengthValue.h"
-#include <wtf/Vector.h>
-
-namespace WebCore {
-
-class SVGLength;
-class SVGLengthList;
-
-class SVGLengthListValues final : public Vector<SVGLengthValue> {
-public:
-    void parse(const String& value, SVGLengthMode);
-    String valueAsString() const;
-};
-
-template<>
-struct SVGPropertyTraits<SVGLengthListValues> {
-    static SVGLengthListValues initialValue() { return { }; }
-    static SVGLengthListValues fromString(const String& string, SVGLengthMode lengthMode)
-    {
-        SVGLengthListValues list;
-        list.parse(string, lengthMode);
-        return list;
-    }
-    static Optional<SVGLengthListValues> parse(const QualifiedName& attrName, const String& string)
-    {
-        SVGLengthListValues list;
-        list.parse(string, SVGLengthValue::lengthModeForAnimatedLengthAttribute(attrName));
-        return list;
-    }
-    static String toString(const SVGLengthListValues& type) { return type.valueAsString(); }
-
-    using ListItemType = SVGLengthValue;
-    using ListItemTearOff = SVGLength;
-    using ListPropertyTearOff = SVGLengthList;
-};
-
-} // namespace WebCore
</del></span></pre></div>
<a id="trunkSourceWebCoresvgSVGLineElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGLineElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGLineElement.cpp      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGLineElement.cpp 2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
</span><del>- * Copyright (C) 2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -35,7 +35,14 @@
</span><span class="cx">     , SVGExternalResourcesRequired(this)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::lineTag));
</span><del>-    registerAttributes();
</del><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::x1Attr, &SVGLineElement::m_x1>();
+        PropertyRegistry::registerProperty<SVGNames::y1Attr, &SVGLineElement::m_y1>();
+        PropertyRegistry::registerProperty<SVGNames::x2Attr, &SVGLineElement::m_x2>();
+        PropertyRegistry::registerProperty<SVGNames::y2Attr, &SVGLineElement::m_y2>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGLineElement> SVGLineElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -43,29 +50,18 @@
</span><span class="cx">     return adoptRef(*new SVGLineElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGLineElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::x1Attr, &SVGLineElement::m_x1>();
-    registry.registerAttribute<SVGNames::y1Attr, &SVGLineElement::m_y1>();
-    registry.registerAttribute<SVGNames::x2Attr, &SVGLineElement::m_x2>();
-    registry.registerAttribute<SVGNames::y2Attr, &SVGLineElement::m_y2>();
-}
-
</del><span class="cx"> void SVGLineElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::x1Attr)
</span><del>-        m_x1.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x1->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::y1Attr)
</span><del>-        m_y1.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y1->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::x2Attr)
</span><del>-        m_x2.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x2->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::y2Attr)
</span><del>-        m_y2.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y2->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -75,7 +71,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGLineElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         updateRelativeLengthsInformation();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGLineElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGLineElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGLineElement.h        2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGLineElement.h   2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGeometryElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="lines">@@ -33,32 +32,25 @@
</span><span class="cx"> public:
</span><span class="cx">     static Ref<SVGLineElement> create(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x1() const { return m_x1.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y1() const { return m_y1.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& x2() const { return m_x2.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y2() const { return m_y2.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x1() const { return m_x1->currentValue(); }
+    const SVGLengthValue& y1() const { return m_y1->currentValue(); }
+    const SVGLengthValue& x2() const { return m_x2->currentValue(); }
+    const SVGLengthValue& y2() const { return m_y2->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> x1Animated() { return m_x1.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> y1Animated() { return m_y1.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> x2Animated() { return m_x2.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> y2Animated() { return m_y2.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& x1Animated() { return m_x1; }
+    SVGAnimatedLength& y1Animated() { return m_y1; }
+    SVGAnimatedLength& x2Animated() { return m_x2; }
+    SVGAnimatedLength& y2Animated() { return m_y2; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGLineElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGLineElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</span><del>-    static AttributeOwnerProxy::AttributeRegistry& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
-    static void registerAttributes();
</del><span class="cx">     const SVGAttributeOwnerProxy& attributeOwnerProxy() const final { return m_attributeOwnerProxy; }
</span><span class="cx"> 
</span><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGLineElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</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">@@ -68,10 +60,10 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x1 { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y1 { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_x2 { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y2 { LengthModeHeight };
</del><ins>+    Ref<SVGAnimatedLength> m_x1 { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y1 { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_x2 { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y2 { SVGAnimatedLength::create(this, LengthModeHeight) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGLinearGradientElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGLinearGradientElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGLinearGradientElement.cpp    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGLinearGradientElement.cpp       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx">  * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
</span><span class="cx">  * Copyright (C) 2008 Dirk Schulze <krit@webkit.org>
</span><span class="cx">  * Copyright (C) Research In Motion Limited 2010. 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">@@ -44,7 +44,14 @@
</span><span class="cx"> {
</span><span class="cx">     // Spec: If the x2 attribute is not specified, the effect is as if a value of "100%" were specified.
</span><span class="cx">     ASSERT(hasTagName(SVGNames::linearGradientTag));
</span><del>-    registerAttributes();
</del><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::x1Attr, &SVGLinearGradientElement::m_x1>();
+        PropertyRegistry::registerProperty<SVGNames::y1Attr, &SVGLinearGradientElement::m_y1>();
+        PropertyRegistry::registerProperty<SVGNames::x2Attr, &SVGLinearGradientElement::m_x2>();
+        PropertyRegistry::registerProperty<SVGNames::y2Attr, &SVGLinearGradientElement::m_y2>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGLinearGradientElement> SVGLinearGradientElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -52,29 +59,18 @@
</span><span class="cx">     return adoptRef(*new SVGLinearGradientElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGLinearGradientElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::x1Attr, &SVGLinearGradientElement::m_x1>();
-    registry.registerAttribute<SVGNames::y1Attr, &SVGLinearGradientElement::m_y1>();
-    registry.registerAttribute<SVGNames::x2Attr, &SVGLinearGradientElement::m_x2>();
-    registry.registerAttribute<SVGNames::y2Attr, &SVGLinearGradientElement::m_y2>();
-}
-
</del><span class="cx"> void SVGLinearGradientElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::x1Attr)
</span><del>-        m_x1.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x1->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::y1Attr)
</span><del>-        m_y1.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y1->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::x2Attr)
</span><del>-        m_x2.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x2->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::y2Attr)
</span><del>-        m_y2.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y2->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -83,7 +79,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGLinearGradientElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         updateRelativeLengthsInformation();
</span><span class="cx">         if (RenderObject* object = renderer())
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGLinearGradientElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGLinearGradientElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGLinearGradientElement.h      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGLinearGradientElement.h 2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGGradientElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="cx"> 
</span><span class="lines">@@ -36,32 +35,25 @@
</span><span class="cx"> 
</span><span class="cx">     bool collectGradientAttributes(LinearGradientAttributes&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x1() const { return m_x1.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y1() const { return m_y1.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& x2() const { return m_x2.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y2() const { return m_y2.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x1() const { return m_x1->currentValue(); }
+    const SVGLengthValue& y1() const { return m_y1->currentValue(); }
+    const SVGLengthValue& x2() const { return m_x2->currentValue(); }
+    const SVGLengthValue& y2() const { return m_y2->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> x1Animated() { return m_x1.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> y1Animated() { return m_y1.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> x2Animated() { return m_x2.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> y2Animated() { return m_y2.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& x1Animated() { return m_x1; }
+    SVGAnimatedLength& y1Animated() { return m_y1; }
+    SVGAnimatedLength& x2Animated() { return m_x2; }
+    SVGAnimatedLength& y2Animated() { return m_y2; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGLinearGradientElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGLinearGradientElement, SVGGradientElement>;
</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<SVGLinearGradientElement, SVGGradientElement>;
</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"> 
</span><span class="lines">@@ -71,10 +63,10 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x1 { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y1 { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_x2 { LengthModeWidth, "100%" };
-    SVGAnimatedLengthAttribute m_y2 { LengthModeHeight };
</del><ins>+    Ref<SVGAnimatedLength> m_x1 { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y1 { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_x2 { SVGAnimatedLength::create(this, LengthModeWidth, "100%") };
+    Ref<SVGAnimatedLength> m_y2 { SVGAnimatedLength::create(this, LengthModeHeight) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGMarkerElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGMarkerElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGMarkerElement.cpp    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGMarkerElement.cpp       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -40,10 +40,13 @@
</span><span class="cx"> {
</span><span class="cx">     // Spec: If the markerWidth/markerHeight attribute is not specified, the effect is as if a value of "3" were specified.
</span><span class="cx">     ASSERT(hasTagName(SVGNames::markerTag));
</span><del>-    registerAttributes();
</del><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::refXAttr, &SVGMarkerElement::m_refX>();
+        PropertyRegistry::registerProperty<SVGNames::refYAttr, &SVGMarkerElement::m_refY>();
+        PropertyRegistry::registerProperty<SVGNames::markerWidthAttr, &SVGMarkerElement::m_markerWidth>();
+        PropertyRegistry::registerProperty<SVGNames::markerHeightAttr, &SVGMarkerElement::m_markerHeight>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::markerUnitsAttr, SVGMarkerUnitsType, &SVGMarkerElement::m_markerUnits>();
</span><span class="cx">         PropertyRegistry::registerProperty<SVGNames::orientAttr, &SVGMarkerElement::m_orientAngle, &SVGMarkerElement::m_orientType>();
</span><span class="cx">     });
</span><span class="lines">@@ -59,17 +62,6 @@
</span><span class="cx">     return SVGFitToViewBox::viewBoxToViewTransform(viewBox(), preserveAspectRatio(), viewWidth, viewHeight);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGMarkerElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::refXAttr, &SVGMarkerElement::m_refX>();
-    registry.registerAttribute<SVGNames::refYAttr, &SVGMarkerElement::m_refY>();
-    registry.registerAttribute<SVGNames::markerWidthAttr, &SVGMarkerElement::m_markerWidth>();
-    registry.registerAttribute<SVGNames::markerHeightAttr, &SVGMarkerElement::m_markerHeight>();
-}
-
</del><span class="cx"> void SVGMarkerElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (name == SVGNames::markerUnitsAttr) {
</span><span class="lines">@@ -89,13 +81,13 @@
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::refXAttr)
</span><del>-        m_refX.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_refX->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::refYAttr)
</span><del>-        m_refY.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_refY->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::markerWidthAttr)
</span><del>-        m_markerWidth.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_markerWidth->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::markerHeightAttr)
</span><del>-        m_markerHeight.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_markerHeight->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -106,9 +98,9 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGMarkerElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><del>-        if (isAnimatedLengthAttribute(attrName))
</del><ins>+        if (PropertyRegistry::isAnimatedLengthAttribute(attrName))
</ins><span class="cx">             updateRelativeLengthsInformation();
</span><span class="cx">         if (RenderObject* object = renderer())
</span><span class="cx">             object->setNeedsLayout();
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGMarkerElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGMarkerElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGMarkerElement.h      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGMarkerElement.h 2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGFitToViewBox.h"
</span><span class="lines">@@ -53,18 +52,18 @@
</span><span class="cx">     void setOrientToAuto();
</span><span class="cx">     void setOrientToAngle(SVGAngle&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& refX() const { return m_refX.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& refY() const { return m_refY.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& markerWidth() const { return m_markerWidth.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& markerHeight() const { return m_markerHeight.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& refX() const { return m_refX->currentValue(); }
+    const SVGLengthValue& refY() const { return m_refY->currentValue(); }
+    const SVGLengthValue& markerWidth() const { return m_markerWidth->currentValue(); }
+    const SVGLengthValue& markerHeight() const { return m_markerHeight->currentValue(); }
</ins><span class="cx">     SVGMarkerUnitsType markerUnits() const { return m_markerUnits->currentValue<SVGMarkerUnitsType>(); }
</span><span class="cx">     const SVGAngleValue& orientAngle() const { return m_orientAngle->currentValue(); }
</span><span class="cx">     SVGMarkerOrientType orientType() const { return m_orientType->currentValue<SVGMarkerOrientType>(); }
</span><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> refXAnimated() { return m_refX.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> refYAnimated() { return m_refY.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> markerWidthAnimated() { return m_markerWidth.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> markerHeightAnimated() { return m_markerHeight.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& refXAnimated() { return m_refX; }
+    SVGAnimatedLength& refYAnimated() { return m_refY; }
+    SVGAnimatedLength& markerWidthAnimated() { return m_markerWidth; }
+    SVGAnimatedLength& markerHeightAnimated() { return m_markerHeight; }
</ins><span class="cx">     SVGAnimatedEnumeration& markerUnitsAnimated() { return m_markerUnits; }
</span><span class="cx">     SVGAnimatedAngle& orientAngleAnimated() { return m_orientAngle; }
</span><span class="cx">     Ref<SVGAnimatedEnumeration> orientTypeAnimated() { return m_orientType.copyRef(); }
</span><span class="lines">@@ -73,19 +72,11 @@
</span><span class="cx">     SVGMarkerElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGMarkerElement, SVGElement, SVGExternalResourcesRequired, SVGFitToViewBox>;
</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<SVGMarkerElement, SVGElement, SVGExternalResourcesRequired, SVGFitToViewBox>;
</span><span class="cx">     const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
</span><span class="cx"> 
</span><del>-    static bool isAnimatedLengthAttribute(const QualifiedName& attributeName) { return AttributeOwnerProxy::isAnimatedLengthAttribute(attributeName); }
-    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">@@ -102,10 +93,10 @@
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx"> 
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_refX { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_refY { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_markerWidth { LengthModeWidth, "3" };
-    SVGAnimatedLengthAttribute m_markerHeight { LengthModeHeight, "3" };
</del><ins>+    Ref<SVGAnimatedLength> m_refX { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_refY { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_markerWidth { SVGAnimatedLength::create(this, LengthModeWidth, "3") };
+    Ref<SVGAnimatedLength> m_markerHeight { SVGAnimatedLength::create(this, LengthModeHeight, "3") };
</ins><span class="cx">     Ref<SVGAnimatedEnumeration> m_markerUnits { SVGAnimatedEnumeration::create(this, SVGMarkerUnitsStrokeWidth) };
</span><span class="cx">     Ref<SVGAnimatedAngle> m_orientAngle { SVGAnimatedAngle::create(this) };
</span><span class="cx">     Ref<SVGAnimatedOrientType> m_orientType { SVGAnimatedOrientType::create(this, SVGMarkerOrientAngle) };
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGMaskElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGMaskElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGMaskElement.cpp      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGMaskElement.cpp 2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -5,7 +5,7 @@
</span><span class="cx">  * Copyright (C) 2009 Dirk Schulze <krit@webkit.org>
</span><span class="cx">  * Copyright (C) Research In Motion Limited 2009-2010. All rights reserved.
</span><span class="cx">  * Copyright (C) 2014 Adobe Systems Incorporated. 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">@@ -47,10 +47,13 @@
</span><span class="cx">     // Spec: If the x/y attribute is not specified, the effect is as if a value of "-10%" were specified.
</span><span class="cx">     // Spec: If the width/height attribute is not specified, the effect is as if a value of "120%" were specified.
</span><span class="cx">     ASSERT(hasTagName(SVGNames::maskTag));
</span><del>-    registerAttributes();
</del><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::xAttr, &SVGMaskElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGMaskElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::widthAttr, &SVGMaskElement::m_width>();
+        PropertyRegistry::registerProperty<SVGNames::heightAttr, &SVGMaskElement::m_height>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::maskUnitsAttr, SVGUnitTypes::SVGUnitType, &SVGMaskElement::m_maskUnits>();
</span><span class="cx">         PropertyRegistry::registerProperty<SVGNames::maskContentUnitsAttr, SVGUnitTypes::SVGUnitType, &SVGMaskElement::m_maskContentUnits>();
</span><span class="cx">     });
</span><span class="lines">@@ -61,17 +64,6 @@
</span><span class="cx">     return adoptRef(*new SVGMaskElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGMaskElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGMaskElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGMaskElement::m_y>();
-    registry.registerAttribute<SVGNames::widthAttr, &SVGMaskElement::m_width>();
-    registry.registerAttribute<SVGNames::heightAttr, &SVGMaskElement::m_height>();
-}
-
</del><span class="cx"> void SVGMaskElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (name == SVGNames::maskUnitsAttr) {
</span><span class="lines">@@ -90,13 +82,13 @@
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::widthAttr)
</span><del>-        m_width.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_width->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::heightAttr)
</span><del>-        m_height.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_height->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -107,13 +99,13 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGMaskElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isAnimatedLengthAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isAnimatedLengthAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         invalidateSVGPresentationAttributeStyle();
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         if (auto* renderer = this->renderer())
</span><span class="cx">             renderer->setNeedsLayout();
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGMaskElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGMaskElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGMaskElement.h        2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGMaskElement.h   2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -20,7 +20,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="lines">@@ -34,17 +33,17 @@
</span><span class="cx"> public:
</span><span class="cx">     static Ref<SVGMaskElement> create(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
+    const SVGLengthValue& width() const { return m_width->currentValue(); }
+    const SVGLengthValue& height() const { return m_height->currentValue(); }
</ins><span class="cx">     SVGUnitTypes::SVGUnitType maskUnits() const { return m_maskUnits->currentValue<SVGUnitTypes::SVGUnitType>(); }
</span><span class="cx">     SVGUnitTypes::SVGUnitType maskContentUnits() const { return m_maskContentUnits->currentValue<SVGUnitTypes::SVGUnitType>(); }
</span><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
+    SVGAnimatedLength& widthAnimated() { return m_width; }
+    SVGAnimatedLength& heightAnimated() { return m_height; }
</ins><span class="cx">     SVGAnimatedEnumeration& maskUnitsAnimated() { return m_maskUnits; }
</span><span class="cx">     SVGAnimatedEnumeration& maskContentUnitsAnimated() { return m_maskContentUnits; }
</span><span class="cx"> 
</span><span class="lines">@@ -59,7 +58,6 @@
</span><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGMaskElement, SVGElement, SVGExternalResourcesRequired, SVGTests>;
</span><span class="cx">     const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
</span><span class="cx"> 
</span><del>-    static bool isAnimatedLengthAttribute(const QualifiedName& attributeName) { return AttributeOwnerProxy::isAnimatedLengthAttribute(attributeName); }
</del><span class="cx">     static bool isKnownAttribute(const QualifiedName& attributeName)
</span><span class="cx">     {
</span><span class="cx">         return AttributeOwnerProxy::isKnownAttribute(attributeName) || PropertyRegistry::isKnownAttribute(attributeName);
</span><span class="lines">@@ -77,10 +75,10 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth, "-10%" };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight, "-10%" };
-    SVGAnimatedLengthAttribute m_width { LengthModeWidth, "120%" };
-    SVGAnimatedLengthAttribute m_height { LengthModeHeight, "120%" };
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth, "-10%") };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight, "-10%") };
+    Ref<SVGAnimatedLength> m_width { SVGAnimatedLength::create(this, LengthModeWidth, "120%") };
+    Ref<SVGAnimatedLength> m_height { SVGAnimatedLength::create(this, LengthModeHeight, "120%") };
</ins><span class="cx">     Ref<SVGAnimatedEnumeration> m_maskUnits { SVGAnimatedEnumeration::create(this, SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) };
</span><span class="cx">     Ref<SVGAnimatedEnumeration> m_maskContentUnits { SVGAnimatedEnumeration::create(this, SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE) };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPatternElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPatternElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPatternElement.cpp   2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGPatternElement.cpp      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -57,6 +57,10 @@
</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::xAttr, &SVGPatternElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGPatternElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::widthAttr, &SVGPatternElement::m_width>();
+        PropertyRegistry::registerProperty<SVGNames::heightAttr, &SVGPatternElement::m_height>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::patternUnitsAttr, SVGUnitTypes::SVGUnitType, &SVGPatternElement::m_patternUnits>();
</span><span class="cx">         PropertyRegistry::registerProperty<SVGNames::patternContentUnitsAttr, SVGUnitTypes::SVGUnitType, &SVGPatternElement::m_patternContentUnits>();
</span><span class="cx">     });
</span><span class="lines">@@ -72,10 +76,6 @@
</span><span class="cx">     auto& registry = attributeRegistry();
</span><span class="cx">     if (!registry.isEmpty())
</span><span class="cx">         return;
</span><del>-    registry.registerAttribute<SVGNames::xAttr, &SVGPatternElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGPatternElement::m_y>();
-    registry.registerAttribute<SVGNames::widthAttr, &SVGPatternElement::m_width>();
-    registry.registerAttribute<SVGNames::heightAttr, &SVGPatternElement::m_height>();
</del><span class="cx">     registry.registerAttribute<SVGNames::patternTransformAttr, &SVGPatternElement::m_patternTransform>();
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -104,13 +104,13 @@
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::widthAttr)
</span><del>-        m_width.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_width->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</ins><span class="cx">     else if (name == SVGNames::heightAttr)
</span><del>-        m_height.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_height->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -123,7 +123,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGPatternElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isAnimatedLengthAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isAnimatedLengthAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         invalidateSVGPresentationAttributeStyle();
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPatternElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPatternElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPatternElement.h     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGPatternElement.h        2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGAnimatedTransformList.h"
</span><span class="cx"> #include "SVGElement.h"
</span><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="lines">@@ -44,18 +43,18 @@
</span><span class="cx"> 
</span><span class="cx">     AffineTransform localCoordinateSpaceTransform(SVGLocatable::CTMScope) const final;
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
+    const SVGLengthValue& width() const { return m_width->currentValue(); }
+    const SVGLengthValue& height() const { return m_height->currentValue(); }
</ins><span class="cx">     SVGUnitTypes::SVGUnitType patternUnits() const { return m_patternUnits->currentValue<SVGUnitTypes::SVGUnitType>(); }
</span><span class="cx">     SVGUnitTypes::SVGUnitType patternContentUnits() const { return m_patternContentUnits->currentValue<SVGUnitTypes::SVGUnitType>(); }
</span><span class="cx">     const SVGTransformListValues& patternTransform() const { return m_patternTransform.currentValue(attributeOwnerProxy()); }
</span><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
+    SVGAnimatedLength& widthAnimated() { return m_width; }
+    SVGAnimatedLength& heightAnimated() { return m_height; }
</ins><span class="cx">     SVGAnimatedEnumeration& patternUnitsAnimated() { return m_patternUnits; }
</span><span class="cx">     SVGAnimatedEnumeration& patternContentUnitsAnimated() { return m_patternContentUnits; }
</span><span class="cx">     RefPtr<SVGAnimatedTransformList> patternTransformAnimated() { return m_patternTransform.animatedProperty(attributeOwnerProxy()); }
</span><span class="lines">@@ -71,7 +70,6 @@
</span><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGPatternElement, SVGElement, SVGExternalResourcesRequired, SVGFitToViewBox, SVGTests, SVGURIReference>;
</span><span class="cx">     const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
</span><span class="cx"> 
</span><del>-    static bool isAnimatedLengthAttribute(const QualifiedName& attributeName) { return AttributeOwnerProxy::isAnimatedLengthAttribute(attributeName); }
</del><span class="cx">     static bool isKnownAttribute(const QualifiedName& attributeName)
</span><span class="cx">     {
</span><span class="cx">         return AttributeOwnerProxy::isKnownAttribute(attributeName) || PropertyRegistry::isKnownAttribute(attributeName);
</span><span class="lines">@@ -89,10 +87,10 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_width { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_height { LengthModeHeight };
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_width { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_height { SVGAnimatedLength::create(this, LengthModeHeight) };
</ins><span class="cx">     Ref<SVGAnimatedEnumeration> m_patternUnits { SVGAnimatedEnumeration::create(this, SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX) };
</span><span class="cx">     Ref<SVGAnimatedEnumeration> m_patternContentUnits { SVGAnimatedEnumeration::create(this, SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE) };
</span><span class="cx">     SVGAnimatedTransformListAttribute m_patternTransform;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGPointh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGPoint.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGPoint.h      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGPoint.h 2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include "FloatPoint.h"
</span><span class="cx"> #include "SVGMatrix.h"
</span><ins>+#include "SVGPropertyTraits.h"
</ins><span class="cx"> #include "SVGValueProperty.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGRadialGradientElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGRadialGradientElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGRadialGradientElement.cpp    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGRadialGradientElement.cpp       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -4,7 +4,7 @@
</span><span class="cx">  * Copyright (C) 2008 Eric Seidel <eric@webkit.org>
</span><span class="cx">  * Copyright (C) 2008 Dirk Schulze <krit@webkit.org>
</span><span class="cx">  * Copyright (C) Research In Motion Limited 2010. 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">@@ -44,7 +44,16 @@
</span><span class="cx"> {
</span><span class="cx">     // Spec: If the cx/cy/r/fr attribute is not specified, the effect is as if a value of "50%" were specified.
</span><span class="cx">     ASSERT(hasTagName(SVGNames::radialGradientTag));
</span><del>-    registerAttributes();
</del><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::cxAttr, &SVGRadialGradientElement::m_cx>();
+        PropertyRegistry::registerProperty<SVGNames::cyAttr, &SVGRadialGradientElement::m_cy>();
+        PropertyRegistry::registerProperty<SVGNames::rAttr, &SVGRadialGradientElement::m_r>();
+        PropertyRegistry::registerProperty<SVGNames::fxAttr, &SVGRadialGradientElement::m_fx>();
+        PropertyRegistry::registerProperty<SVGNames::fyAttr, &SVGRadialGradientElement::m_fy>();
+        PropertyRegistry::registerProperty<SVGNames::frAttr, &SVGRadialGradientElement::m_fr>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGRadialGradientElement> SVGRadialGradientElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -52,35 +61,22 @@
</span><span class="cx">     return adoptRef(*new SVGRadialGradientElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGRadialGradientElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::cxAttr, &SVGRadialGradientElement::m_cx>();
-    registry.registerAttribute<SVGNames::cyAttr, &SVGRadialGradientElement::m_cy>();
-    registry.registerAttribute<SVGNames::rAttr, &SVGRadialGradientElement::m_r>();
-    registry.registerAttribute<SVGNames::fxAttr, &SVGRadialGradientElement::m_fx>();
-    registry.registerAttribute<SVGNames::fyAttr, &SVGRadialGradientElement::m_fy>();
-    registry.registerAttribute<SVGNames::frAttr, &SVGRadialGradientElement::m_fr>();
-}
-
</del><span class="cx"> void SVGRadialGradientElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::cxAttr)
</span><del>-        m_cx.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_cx->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::cyAttr)
</span><del>-        m_cy.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_cy->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::rAttr)
</span><del>-        m_r.setValue(SVGLengthValue::construct(LengthModeOther, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_r->setBaseValInternal(SVGLengthValue::construct(LengthModeOther, value, parseError, ForbidNegativeLengths));
</ins><span class="cx">     else if (name == SVGNames::fxAttr)
</span><del>-        m_fx.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_fx->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::fyAttr)
</span><del>-        m_fy.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_fy->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::frAttr)
</span><del>-        m_fr.setValue(SVGLengthValue::construct(LengthModeOther, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_fr->setBaseValInternal(SVGLengthValue::construct(LengthModeOther, value, parseError, ForbidNegativeLengths));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -89,7 +85,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGRadialGradientElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         updateRelativeLengthsInformation();
</span><span class="cx">         if (RenderObject* object = renderer())
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGRadialGradientElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGRadialGradientElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGRadialGradientElement.h      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGRadialGradientElement.h 2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGGradientElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="cx"> 
</span><span class="lines">@@ -36,26 +35,24 @@
</span><span class="cx"> 
</span><span class="cx">     bool collectGradientAttributes(RadialGradientAttributes&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& cx() const { return m_cx.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& cy() const { return m_cy.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& r() const { return m_r.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& fx() const { return m_fx.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& fy() const { return m_fy.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& fr() const { return m_fr.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& cx() const { return m_cx->currentValue(); }
+    const SVGLengthValue& cy() const { return m_cy->currentValue(); }
+    const SVGLengthValue& r() const { return m_r->currentValue(); }
+    const SVGLengthValue& fx() const { return m_fx->currentValue(); }
+    const SVGLengthValue& fy() const { return m_fy->currentValue(); }
+    const SVGLengthValue& fr() const { return m_fr->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> cxAnimated() { return m_cx.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> cyAnimated() { return m_cy.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> rAnimated() { return m_r.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> fxAnimated() { return m_fx.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> fyAnimated() { return m_fy.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> frAnimated() { return m_fr.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& cxAnimated() { return m_cx; }
+    SVGAnimatedLength& cyAnimated() { return m_cy; }
+    SVGAnimatedLength& rAnimated() { return m_r; }
+    SVGAnimatedLength& fxAnimated() { return m_fx; }
+    SVGAnimatedLength& fyAnimated() { return m_fy; }
+    SVGAnimatedLength& frAnimated() { return m_fr; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGRadialGradientElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGRadialGradientElement, SVGGradientElement>;
</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<SVGRadialGradientElement, SVGGradientElement>;
</span><span class="lines">@@ -70,12 +67,12 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_cx { LengthModeWidth, "50%" };
-    SVGAnimatedLengthAttribute m_cy { LengthModeHeight, "50%" };
-    SVGAnimatedLengthAttribute m_r { LengthModeOther, "50%" };
-    SVGAnimatedLengthAttribute m_fx { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_fy { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_fr { LengthModeOther, "0%" };
</del><ins>+    Ref<SVGAnimatedLength> m_cx { SVGAnimatedLength::create(this, LengthModeWidth, "50%") };
+    Ref<SVGAnimatedLength> m_cy { SVGAnimatedLength::create(this, LengthModeHeight, "50%") };
+    Ref<SVGAnimatedLength> m_r { SVGAnimatedLength::create(this, LengthModeOther, "50%") };
+    Ref<SVGAnimatedLength> m_fx { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_fy { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_fr { SVGAnimatedLength::create(this, LengthModeOther, "0%") };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGRectElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGRectElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGRectElement.cpp      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGRectElement.cpp 2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -2,7 +2,7 @@
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
</span><span class="cx">  * Copyright (C) 2014 Adobe Systems Incorporated. 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">@@ -36,7 +36,16 @@
</span><span class="cx">     , SVGExternalResourcesRequired(this)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::rectTag));
</span><del>-    registerAttributes();
</del><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGRectElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGRectElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::widthAttr, &SVGRectElement::m_width>();
+        PropertyRegistry::registerProperty<SVGNames::heightAttr, &SVGRectElement::m_height>();
+        PropertyRegistry::registerProperty<SVGNames::rxAttr, &SVGRectElement::m_rx>();
+        PropertyRegistry::registerProperty<SVGNames::ryAttr, &SVGRectElement::m_ry>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGRectElement> SVGRectElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -44,35 +53,22 @@
</span><span class="cx">     return adoptRef(*new SVGRectElement(tagName, document));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGRectElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGRectElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGRectElement::m_y>();
-    registry.registerAttribute<SVGNames::widthAttr, &SVGRectElement::m_width>();
-    registry.registerAttribute<SVGNames::heightAttr, &SVGRectElement::m_height>();
-    registry.registerAttribute<SVGNames::rxAttr, &SVGRectElement::m_rx>();
-    registry.registerAttribute<SVGNames::ryAttr, &SVGRectElement::m_ry>();
-}
-
</del><span class="cx"> void SVGRectElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::rxAttr)
</span><del>-        m_rx.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_rx->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</ins><span class="cx">     else if (name == SVGNames::ryAttr)
</span><del>-        m_ry.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_ry->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</ins><span class="cx">     else if (name == SVGNames::widthAttr)
</span><del>-        m_width.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_width->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</ins><span class="cx">     else if (name == SVGNames::heightAttr)
</span><del>-        m_height.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_height->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -82,7 +78,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGRectElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         invalidateSVGPresentationAttributeStyle();
</span><span class="cx">         return;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGRectElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGRectElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGRectElement.h        2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGRectElement.h   2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGeometryElement.h"
</span><span class="cx"> #include "SVGNames.h"
</span><span class="lines">@@ -33,36 +32,29 @@
</span><span class="cx"> public:
</span><span class="cx">     static Ref<SVGRectElement> create(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& rx() const { return m_rx.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& ry() const { return m_ry.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
+    const SVGLengthValue& width() const { return m_width->currentValue(); }
+    const SVGLengthValue& height() const { return m_height->currentValue(); }
+    const SVGLengthValue& rx() const { return m_rx->currentValue(); }
+    const SVGLengthValue& ry() const { return m_ry->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> rxAnimated() { return m_rx.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> ryAnimated() { return m_ry.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
+    SVGAnimatedLength& widthAnimated() { return m_width; }
+    SVGAnimatedLength& heightAnimated() { return m_height; }
+    SVGAnimatedLength& rxAnimated() { return m_rx; }
+    SVGAnimatedLength& ryAnimated() { return m_ry; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGRectElement(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGRectElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</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<SVGRectElement, SVGGeometryElement, SVGExternalResourcesRequired>;
</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">@@ -73,12 +65,12 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_width { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_height { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_rx { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_ry { LengthModeHeight};
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_width { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_height { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_rx { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_ry { SVGAnimatedLength::create(this, LengthModeHeight) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGSVGElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGSVGElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGSVGElement.cpp       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGSVGElement.cpp  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2010 Rob Buis <buis@kde.org>
</span><del>- * Copyright (C) 2007-2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2007-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  * Copyright (C) 2014 Adobe Systems Incorporated. All rights reserved.
</span><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="lines">@@ -58,8 +58,15 @@
</span><span class="cx">     , m_timeContainer(SMILTimeContainer::create(*this))
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::svgTag));
</span><del>-    registerAttributes();
</del><span class="cx">     document.registerForDocumentSuspensionCallbacks(*this);
</span><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGSVGElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGSVGElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::widthAttr, &SVGSVGElement::m_width>();
+        PropertyRegistry::registerProperty<SVGNames::heightAttr, &SVGSVGElement::m_height>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGSVGElement> SVGSVGElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -186,17 +193,6 @@
</span><span class="cx">         document().renderView()->repaint();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGSVGElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGSVGElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGSVGElement::m_y>();
-    registry.registerAttribute<SVGNames::widthAttr, &SVGSVGElement::m_width>();
-    registry.registerAttribute<SVGNames::heightAttr, &SVGSVGElement::m_height>();
-}
-
</del><span class="cx"> void SVGSVGElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (!nearestViewportElement()) {
</span><span class="lines">@@ -235,9 +231,9 @@
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::widthAttr) {
</span><span class="cx">         auto length = SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths);
</span><span class="cx">         if (parseError != NoError || value.isEmpty()) {
</span><span class="lines">@@ -245,7 +241,7 @@
</span><span class="cx">             // Not sure it's correct for the empty string or for something that can't be parsed.
</span><span class="cx">             length = SVGLengthValue(LengthModeWidth, "100%"_s);
</span><span class="cx">         }
</span><del>-        m_width.setValue(length);
</del><ins>+        m_width->setBaseValInternal(length);
</ins><span class="cx">     } else if (name == SVGNames::heightAttr) {
</span><span class="cx">         auto length = SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths);
</span><span class="cx">         if (parseError != NoError || value.isEmpty()) {
</span><span class="lines">@@ -253,7 +249,7 @@
</span><span class="cx">             // Not sure it's correct for the empty string or for something that can't be parsed.
</span><span class="cx">             length = SVGLengthValue(LengthModeHeight, "100%"_s);
</span><span class="cx">         }
</span><del>-        m_height.setValue(length);
</del><ins>+        m_height->setBaseValInternal(length);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="lines">@@ -266,7 +262,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGSVGElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx">         invalidateSVGPresentationAttributeStyle();
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGSVGElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGSVGElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGSVGElement.h 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGSVGElement.h    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -22,7 +22,6 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "FloatPoint.h"
</span><del>-#include "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGFitToViewBox.h"
</span><span class="cx"> #include "SVGGraphicsElement.h"
</span><span class="lines">@@ -118,15 +117,15 @@
</span><span class="cx"> 
</span><span class="cx">     AffineTransform viewBoxToViewTransform(float viewWidth, float viewHeight) const;
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
+    const SVGLengthValue& width() const { return m_width->currentValue(); }
+    const SVGLengthValue& height() const { return m_height->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
+    SVGAnimatedLength& widthAnimated() { return m_width; }
+    SVGAnimatedLength& heightAnimated() { return m_height; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGSVGElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -133,18 +132,11 @@
</span><span class="cx">     virtual ~SVGSVGElement();
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGSVGElement, SVGGraphicsElement, SVGExternalResourcesRequired, SVGFitToViewBox>;
</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<SVGSVGElement, SVGGraphicsElement, SVGExternalResourcesRequired, SVGFitToViewBox>;
</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">     bool selfHasRelativeLengths() const override;
</span><span class="lines">@@ -176,10 +168,10 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight};
-    SVGAnimatedLengthAttribute m_width { LengthModeWidth, "100%"_s };
-    SVGAnimatedLengthAttribute m_height { LengthModeHeight, "100%"_s };
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_width { SVGAnimatedLength::create(this, LengthModeWidth, "100%"_s) };
+    Ref<SVGAnimatedLength> m_height { SVGAnimatedLength::create(this, LengthModeHeight, "100%"_s) };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGTextContentElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGTextContentElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGTextContentElement.cpp       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGTextContentElement.cpp  2019-03-26 20:14:32 UTC (rev 243515)
</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, 2008 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">@@ -47,10 +47,9 @@
</span><span class="cx">     : SVGGraphicsElement(tagName, document)
</span><span class="cx">     , SVGExternalResourcesRequired(this)
</span><span class="cx"> {
</span><del>-    registerAttributes();
-
</del><span class="cx">     static std::once_flag onceFlag;
</span><span class="cx">     std::call_once(onceFlag, [] {
</span><ins>+        PropertyRegistry::registerProperty<SVGNames::textLengthAttr, &SVGTextContentElement::m_textLength>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::lengthAdjustAttr, SVGLengthAdjustType, &SVGTextContentElement::m_lengthAdjust>();
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -163,14 +162,6 @@
</span><span class="cx">     SVGGraphicsElement::collectStyleForPresentationAttribute(name, value, style);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGTextContentElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute(SVGAnimatedCustomLengthAttributeAccessor::singleton<SVGNames::textLengthAttr, &SVGTextContentElement::m_textLength>());
-}
-
</del><span class="cx"> void SVGTextContentElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="lines">@@ -180,7 +171,7 @@
</span><span class="cx">         if (propertyValue > 0)
</span><span class="cx">             m_lengthAdjust->setBaseValInternal<SVGLengthAdjustType>(propertyValue);
</span><span class="cx">     } else if (name == SVGNames::textLengthAttr)
</span><del>-        m_textLength.setValue(SVGLengthValue::construct(LengthModeOther, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_textLength->setBaseValInternal(SVGLengthValue::construct(LengthModeOther, value, parseError, ForbidNegativeLengths));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -190,9 +181,9 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGTextContentElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         if (attrName == SVGNames::textLengthAttr)
</span><del>-            m_specifiedTextLength = m_textLength.value();
</del><ins>+            m_specifiedTextLength = m_textLength->baseVal()->value();
</ins><span class="cx"> 
</span><span class="cx">         if (auto renderer = this->renderer()) {
</span><span class="cx">             InstanceInvalidationGuard guard(*this);
</span><span class="lines">@@ -205,6 +196,14 @@
</span><span class="cx">     SVGExternalResourcesRequired::svgAttributeChanged(attrName);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+SVGAnimatedLength& SVGTextContentElement::textLengthAnimated()
+{
+    static NeverDestroyed<SVGLengthValue> defaultTextLength(LengthModeOther);
+    if (m_textLength->baseVal()->value() == defaultTextLength)
+        m_textLength->baseVal()->value().newValueSpecifiedUnits(LengthTypeNumber, getComputedTextLength());
+    return m_textLength;
+}
+
</ins><span class="cx"> bool SVGTextContentElement::selfHasRelativeLengths() const
</span><span class="cx"> {
</span><span class="cx">     // Any element of the <text> subtree is advertized as using relative lengths.
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGTextContentElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGTextContentElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGTextContentElement.h 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGTextContentElement.h    2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGraphicsElement.h"
</span><span class="cx"> 
</span><span class="lines">@@ -83,7 +82,6 @@
</span><span class="cx">     ExceptionOr<void> selectSubString(unsigned charnum, unsigned nchars);
</span><span class="cx"> 
</span><span class="cx">     static SVGTextContentElement* elementFromRenderer(RenderObject*);
</span><del>-    const SVGLengthValue& specifiedTextLength() { return m_specifiedTextLength; }
</del><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGTextContentElement, SVGGraphicsElement, SVGExternalResourcesRequired>;
</span><span class="cx">     static AttributeOwnerProxy::AttributeRegistry& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
</span><span class="lines">@@ -90,10 +88,11 @@
</span><span class="cx">     
</span><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGTextContentElement, SVGGraphicsElement, SVGExternalResourcesRequired>;
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& textLength() const { return m_textLength.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& specifiedTextLength() const { return m_specifiedTextLength; }
+    const SVGLengthValue& textLength() const { return m_textLength->currentValue(); }
</ins><span class="cx">     SVGLengthAdjustType lengthAdjust() const { return m_lengthAdjust->currentValue<SVGLengthAdjustType>(); }
</span><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> textLengthAnimated() { return m_textLength.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& textLengthAnimated();
</ins><span class="cx">     SVGAnimatedEnumeration& lengthAdjustAnimated() { return m_lengthAdjust; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="lines">@@ -112,52 +111,11 @@
</span><span class="cx">     bool isTextContent() const final { 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);
-    }
-
-    class SVGAnimatedCustomLengthAttribute : public SVGAnimatedLengthAttribute {
-    public:
-        using SVGAnimatedLengthAttribute::operator=;
-
-        SVGAnimatedCustomLengthAttribute(SVGTextContentElement& element, SVGLengthMode lengthMode)
-            : SVGAnimatedLengthAttribute(lengthMode)
-            , m_element(element)
-        {
-        }
-
-        void synchronize(Element&, const QualifiedName& attributeName)
-        {
-            if (!shouldSynchronize())
-                return;
-            String string(SVGPropertyTraits<SVGLengthValue>::toString(m_element.m_specifiedTextLength));
-            static_cast<Element&>(m_element).setSynchronizedLazyAttribute(attributeName, string);
-        }
-
-        RefPtr<SVGAnimatedLength> animatedProperty(const SVGAttributeOwnerProxy& attributeOwnerProxy)
-        {
-            static NeverDestroyed<SVGLengthValue> defaultTextLength(LengthModeOther);
-            if (m_element.m_specifiedTextLength == defaultTextLength)
-                m_element.m_textLength.value().newValueSpecifiedUnits(LengthTypeNumber, m_element.getComputedTextLength());
-
-            setShouldSynchronize(true);
-            return static_reference_cast<SVGAnimatedLength>(attributeOwnerProxy.lookupOrCreateAnimatedProperty(*this).releaseNonNull());
-        }
-
-    private:
-        SVGTextContentElement& m_element;
-    };
-
-    using SVGAnimatedCustomLengthAttributeAccessor = SVGAnimatedAttributeAccessor<SVGTextContentElement, SVGAnimatedCustomLengthAttribute, AnimatedLength>;
-
</del><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedCustomLengthAttribute m_textLength { *this, LengthModeOther };
</del><ins>+    Ref<SVGAnimatedLength> m_textLength { SVGAnimatedLength::create(this, LengthModeOther) };
</ins><span class="cx">     Ref<SVGAnimatedEnumeration> m_lengthAdjust { SVGAnimatedEnumeration::create(this, SVGLengthAdjustSpacing) };
</span><span class="cx">     SVGLengthValue m_specifiedTextLength { LengthModeOther };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGTextPathElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGTextPathElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGTextPathElement.cpp  2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGTextPathElement.cpp     2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -1,7 +1,7 @@
</span><span class="cx"> /*
</span><span class="cx">  * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
</span><span class="cx">  * Copyright (C) 2010 Rob Buis <rwlbuis@gmail.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">@@ -38,10 +38,10 @@
</span><span class="cx">     , SVGURIReference(this)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasTagName(SVGNames::textPathTag));
</span><del>-    registerAttributes();
</del><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::startOffsetAttr, &SVGTextPathElement::m_startOffset>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::methodAttr, SVGTextPathMethodType, &SVGTextPathElement::m_method>();
</span><span class="cx">         PropertyRegistry::registerProperty<SVGNames::spacingAttr, SVGTextPathSpacingType, &SVGTextPathElement::m_spacing>();
</span><span class="cx">     });
</span><span class="lines">@@ -62,20 +62,12 @@
</span><span class="cx">     document().accessSVGExtensions().removeAllTargetReferencesForElement(*this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGTextPathElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::startOffsetAttr, &SVGTextPathElement::m_startOffset>();
-}
-
</del><span class="cx"> void SVGTextPathElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::startOffsetAttr)
</span><del>-        m_startOffset.setValue(SVGLengthValue::construct(LengthModeOther, value, parseError));
</del><ins>+        m_startOffset->setBaseValInternal(SVGLengthValue::construct(LengthModeOther, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::methodAttr) {
</span><span class="cx">         SVGTextPathMethodType propertyValue = SVGPropertyTraits<SVGTextPathMethodType>::fromString(value);
</span><span class="cx">         if (propertyValue > 0)
</span><span class="lines">@@ -94,7 +86,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGTextPathElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx"> 
</span><span class="cx">         if (attrName == SVGNames::startOffsetAttr)
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGTextPathElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGTextPathElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGTextPathElement.h    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGTextPathElement.h       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -111,11 +111,11 @@
</span><span class="cx"> 
</span><span class="cx">     static Ref<SVGTextPathElement> create(const QualifiedName&, Document&);
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& startOffset() const { return m_startOffset.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& startOffset() const { return m_startOffset->currentValue(); }
</ins><span class="cx">     SVGTextPathMethodType method() const { return m_method->currentValue<SVGTextPathMethodType>(); }
</span><span class="cx">     SVGTextPathSpacingType spacing() const { return m_spacing->currentValue<SVGTextPathSpacingType>(); }
</span><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> startOffsetAnimated() { return m_startOffset.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& startOffsetAnimated() { return m_startOffset; }
</ins><span class="cx">     SVGAnimatedEnumeration& methodAnimated() { return m_method; }
</span><span class="cx">     SVGAnimatedEnumeration& spacingAnimated() { return m_spacing; }
</span><span class="cx"> 
</span><span class="lines">@@ -127,18 +127,11 @@
</span><span class="cx">     virtual ~SVGTextPathElement();
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGTextPathElement, SVGTextContentElement, SVGURIReference>;
</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<SVGTextPathElement, SVGTextContentElement, SVGURIReference>;
</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"> 
</span><span class="lines">@@ -155,7 +148,7 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_startOffset { LengthModeOther };
</del><ins>+    Ref<SVGAnimatedLength> m_startOffset { SVGAnimatedLength::create(this, LengthModeOther) };
</ins><span class="cx">     Ref<SVGAnimatedEnumeration> m_method { SVGAnimatedEnumeration::create(this, SVGTextPathMethodAlign) };
</span><span class="cx">     Ref<SVGAnimatedEnumeration> m_spacing { SVGAnimatedEnumeration::create(this, SVGTextPathSpacingExact) };
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGTextPositioningElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGTextPositioningElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGTextPositioningElement.cpp   2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGTextPositioningElement.cpp      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx"> #include "RenderSVGResource.h"
</span><span class="cx"> #include "RenderSVGText.h"
</span><span class="cx"> #include "SVGAltGlyphElement.h"
</span><del>-#include "SVGLengthListValues.h"
</del><span class="cx"> #include "SVGNames.h"
</span><span class="cx"> #include "SVGTRefElement.h"
</span><span class="cx"> #include "SVGTSpanElement.h"
</span><span class="lines">@@ -41,56 +40,35 @@
</span><span class="cx"> SVGTextPositioningElement::SVGTextPositioningElement(const QualifiedName& tagName, Document& document)
</span><span class="cx">     : SVGTextContentElement(tagName, document)
</span><span class="cx"> {
</span><del>-    registerAttributes();
-    
</del><span class="cx">     static std::once_flag onceFlag;
</span><span class="cx">     std::call_once(onceFlag, [] {
</span><ins>+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGTextPositioningElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGTextPositioningElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::dxAttr, &SVGTextPositioningElement::m_dx>();
+        PropertyRegistry::registerProperty<SVGNames::dyAttr, &SVGTextPositioningElement::m_dy>();
</ins><span class="cx">         PropertyRegistry::registerProperty<SVGNames::rotateAttr, &SVGTextPositioningElement::m_rotate>();
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGTextPositioningElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGTextPositioningElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGTextPositioningElement::m_y>();
-    registry.registerAttribute<SVGNames::dxAttr, &SVGTextPositioningElement::m_dx>();
-    registry.registerAttribute<SVGNames::dyAttr, &SVGTextPositioningElement::m_dy>();
-}
-
</del><span class="cx"> void SVGTextPositioningElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     if (name == SVGNames::xAttr) {
</span><del>-        SVGLengthListValues newList;
-        newList.parse(value, LengthModeWidth);
-        m_x.detachAnimatedListWrappers(attributeOwnerProxy(), newList.size());
-        m_x.setValue(WTFMove(newList));
</del><ins>+        m_x->baseVal()->parse(value);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::yAttr) {
</span><del>-        SVGLengthListValues newList;
-        newList.parse(value, LengthModeHeight);
-        m_y.detachAnimatedListWrappers(attributeOwnerProxy(), newList.size());
-        m_y.setValue(WTFMove(newList));
</del><ins>+        m_y->baseVal()->parse(value);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::dxAttr) {
</span><del>-        SVGLengthListValues newList;
-        newList.parse(value, LengthModeWidth);
-        m_dx.detachAnimatedListWrappers(attributeOwnerProxy(), newList.size());
-        m_dx.setValue(WTFMove(newList));
</del><ins>+        m_dx->baseVal()->parse(value);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::dyAttr) {
</span><del>-        SVGLengthListValues newList;
-        newList.parse(value, LengthModeHeight);
-        m_dy.detachAnimatedListWrappers(attributeOwnerProxy(), newList.size());
-        m_dy.setValue(WTFMove(newList));
</del><ins>+        m_dy->baseVal()->parse(value);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -118,7 +96,7 @@
</span><span class="cx"> 
</span><span class="cx"> void SVGTextPositioningElement::svgAttributeChanged(const QualifiedName& attrName)
</span><span class="cx"> {
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         InstanceInvalidationGuard guard(*this);
</span><span class="cx"> 
</span><span class="cx">         if (attrName != SVGNames::rotateAttr)
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGTextPositioningElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGTextPositioningElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGTextPositioningElement.h     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGTextPositioningElement.h        2019-03-26 20:14:32 UTC (rev 243515)
</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 "SVGAnimatedLengthList.h"
</del><span class="cx"> #include "SVGTextContentElement.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -36,16 +35,16 @@
</span><span class="cx">     
</span><span class="cx">     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGTextPositioningElement, SVGTextContentElement>;
</span><span class="cx"> 
</span><del>-    const SVGLengthListValues& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthListValues& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthListValues& dx() const { return m_dx.currentValue(attributeOwnerProxy()); }
-    const SVGLengthListValues& dy() const { return m_dy.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthList& x() const { return m_x->currentValue(); }
+    const SVGLengthList& y() const { return m_y->currentValue(); }
+    const SVGLengthList& dx() const { return m_dx->currentValue(); }
+    const SVGLengthList& dy() const { return m_dy->currentValue(); }
</ins><span class="cx">     const SVGNumberList& rotate() const { return m_rotate->currentValue(); }
</span><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLengthList> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLengthList> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLengthList> dxAnimated() { return m_dx.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLengthList> dyAnimated() { return m_dy.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLengthList& xAnimated() { return m_x; }
+    SVGAnimatedLengthList& yAnimated() { return m_y; }
+    SVGAnimatedLengthList& dxAnimated() { return m_dx; }
+    SVGAnimatedLengthList& dyAnimated() { return m_dy; }
</ins><span class="cx">     SVGAnimatedNumberList& rotateAnimated() { return m_rotate; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><span class="lines">@@ -59,21 +58,14 @@
</span><span class="cx">     void collectStyleForPresentationAttribute(const QualifiedName&, const AtomicString&, MutableStyleProperties&) final;
</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>-    SVGAnimatedLengthListAttribute m_x;
-    SVGAnimatedLengthListAttribute m_y;
-    SVGAnimatedLengthListAttribute m_dx;
-    SVGAnimatedLengthListAttribute m_dy;
</del><ins>+    Ref<SVGAnimatedLengthList> m_x { SVGAnimatedLengthList::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLengthList> m_y { SVGAnimatedLengthList::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLengthList> m_dx { SVGAnimatedLengthList::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLengthList> m_dy { SVGAnimatedLengthList::create(this, LengthModeHeight) };
</ins><span class="cx">     Ref<SVGAnimatedNumberList> m_rotate { SVGAnimatedNumberList::create(this) };
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGUseElementcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGUseElement.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGUseElement.cpp       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGUseElement.cpp  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -5,7 +5,7 @@
</span><span class="cx">  * Copyright (C) 2011 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
</span><span class="cx">  * Copyright (C) 2012 University of Szeged
</span><span class="cx">  * Copyright (C) 2012 Renata Hodovan <reni@webkit.org>
</span><del>- * Copyright (C) 2015-2018 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2015-2019 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * This library is free software; you can redistribute it and/or
</span><span class="cx">  * modify it under the terms of the GNU Library General Public
</span><span class="lines">@@ -54,7 +54,14 @@
</span><span class="cx"> {
</span><span class="cx">     ASSERT(hasCustomStyleResolveCallbacks());
</span><span class="cx">     ASSERT(hasTagName(SVGNames::useTag));
</span><del>-    registerAttributes();
</del><ins>+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::xAttr, &SVGUseElement::m_x>();
+        PropertyRegistry::registerProperty<SVGNames::yAttr, &SVGUseElement::m_y>();
+        PropertyRegistry::registerProperty<SVGNames::widthAttr, &SVGUseElement::m_width>();
+        PropertyRegistry::registerProperty<SVGNames::heightAttr, &SVGUseElement::m_height>();
+    });
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> Ref<SVGUseElement> SVGUseElement::create(const QualifiedName& tagName, Document& document)
</span><span class="lines">@@ -68,29 +75,18 @@
</span><span class="cx">         m_externalDocument->removeClient(*this);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void SVGUseElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute<SVGNames::xAttr, &SVGUseElement::m_x>();
-    registry.registerAttribute<SVGNames::yAttr, &SVGUseElement::m_y>();
-    registry.registerAttribute<SVGNames::widthAttr, &SVGUseElement::m_width>();
-    registry.registerAttribute<SVGNames::heightAttr, &SVGUseElement::m_height>();
-}
-
</del><span class="cx"> void SVGUseElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
</span><span class="cx"> {
</span><span class="cx">     SVGParsingError parseError = NoError;
</span><span class="cx"> 
</span><span class="cx">     if (name == SVGNames::xAttr)
</span><del>-        m_x.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</del><ins>+        m_x->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::yAttr)
</span><del>-        m_y.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</del><ins>+        m_y->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError));
</ins><span class="cx">     else if (name == SVGNames::widthAttr)
</span><del>-        m_width.setValue(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_width->setBaseValInternal(SVGLengthValue::construct(LengthModeWidth, value, parseError, ForbidNegativeLengths));
</ins><span class="cx">     else if (name == SVGNames::heightAttr)
</span><del>-        m_height.setValue(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</del><ins>+        m_height->setBaseValInternal(SVGLengthValue::construct(LengthModeHeight, value, parseError, ForbidNegativeLengths));
</ins><span class="cx"> 
</span><span class="cx">     reportAttributeParsingError(parseError, name, value);
</span><span class="cx"> 
</span><span class="lines">@@ -163,7 +159,7 @@
</span><span class="cx"> {
</span><span class="cx">     InstanceInvalidationGuard guard(*this);
</span><span class="cx"> 
</span><del>-    if (isKnownAttribute(attrName)) {
</del><ins>+    if (PropertyRegistry::isKnownAttribute(attrName)) {
</ins><span class="cx">         updateRelativeLengthsInformation();
</span><span class="cx">         if (attrName == SVGNames::widthAttr || attrName == SVGNames::heightAttr) {
</span><span class="cx">             // FIXME: It's unnecessarily inefficient to update both width and height each time either is changed.
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGUseElementh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGUseElement.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGUseElement.h 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGUseElement.h    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -23,7 +23,6 @@
</span><span class="cx"> 
</span><span class="cx"> #include "CachedResourceHandle.h"
</span><span class="cx"> #include "CachedSVGDocumentClient.h"
</span><del>-#include "SVGAnimatedLength.h"
</del><span class="cx"> #include "SVGExternalResourcesRequired.h"
</span><span class="cx"> #include "SVGGraphicsElement.h"
</span><span class="cx"> #include "SVGURIReference.h"
</span><span class="lines">@@ -45,15 +44,15 @@
</span><span class="cx"> 
</span><span class="cx">     RenderElement* rendererClipChild() const;
</span><span class="cx"> 
</span><del>-    const SVGLengthValue& x() const { return m_x.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& y() const { return m_y.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& width() const { return m_width.currentValue(attributeOwnerProxy()); }
-    const SVGLengthValue& height() const { return m_height.currentValue(attributeOwnerProxy()); }
</del><ins>+    const SVGLengthValue& x() const { return m_x->currentValue(); }
+    const SVGLengthValue& y() const { return m_y->currentValue(); }
+    const SVGLengthValue& width() const { return m_width->currentValue(); }
+    const SVGLengthValue& height() const { return m_height->currentValue(); }
</ins><span class="cx"> 
</span><del>-    RefPtr<SVGAnimatedLength> xAnimated() { return m_x.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> yAnimated() { return m_y.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> widthAnimated() { return m_width.animatedProperty(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedLength> heightAnimated() { return m_height.animatedProperty(attributeOwnerProxy()); }
</del><ins>+    SVGAnimatedLength& xAnimated() { return m_x; }
+    SVGAnimatedLength& yAnimated() { return m_y; }
+    SVGAnimatedLength& widthAnimated() { return m_width; }
+    SVGAnimatedLength& heightAnimated() { return m_height; }
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     SVGUseElement(const QualifiedName&, Document&);
</span><span class="lines">@@ -65,18 +64,11 @@
</span><span class="cx">     void buildPendingResource() override;
</span><span class="cx"> 
</span><span class="cx">     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGUseElement, SVGGraphicsElement, SVGExternalResourcesRequired, SVGURIReference>;
</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<SVGUseElement, SVGGraphicsElement, SVGExternalResourcesRequired, SVGURIReference>;
</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"> 
</span><span class="lines">@@ -108,10 +100,10 @@
</span><span class="cx"> 
</span><span class="cx">     AttributeOwnerProxy m_attributeOwnerProxy { *this };
</span><span class="cx">     PropertyRegistry m_propertyRegistry { *this };
</span><del>-    SVGAnimatedLengthAttribute m_x { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_y { LengthModeHeight };
-    SVGAnimatedLengthAttribute m_width { LengthModeWidth };
-    SVGAnimatedLengthAttribute m_height { LengthModeHeight };
</del><ins>+    Ref<SVGAnimatedLength> m_x { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_y { SVGAnimatedLength::create(this, LengthModeHeight) };
+    Ref<SVGAnimatedLength> m_width { SVGAnimatedLength::create(this, LengthModeWidth) };
+    Ref<SVGAnimatedLength> m_height { SVGAnimatedLength::create(this, LengthModeHeight) };
</ins><span class="cx"> 
</span><span class="cx">     bool m_haveFiredLoadEvent { false };
</span><span class="cx">     bool m_shadowTreeNeedsUpdate { true };
</span></span></pre></div>
<a id="trunkSourceWebCoresvgSVGValueh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/SVGValue.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/SVGValue.h      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/SVGValue.h 2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -25,8 +25,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGLengthListValues.h"
-#include "SVGLengthValue.h"
</del><span class="cx"> #include "SVGPathByteStream.h"
</span><span class="cx"> #include "SVGTransformListValues.h"
</span><span class="cx"> 
</span><span class="lines">@@ -35,8 +33,6 @@
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> using SVGValueVariant = Variant<
</span><del>-    SVGLengthValue*,
-    SVGLengthListValues*,
</del><span class="cx">     SVGPathByteStream*,
</span><span class="cx">     SVGTransformListValues*
</span><span class="cx"> >;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAccessorImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -109,6 +109,53 @@
</span><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template<typename OwnerType>
</span><ins>+class SVGAnimatedLengthAccessor final : public SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedLength> {
+    using Base = SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedLength>;
+    using Base::property;
+
+public:
+    using Base::Base;
+    template<Ref<SVGAnimatedLength> OwnerType::*property>
+    constexpr static const SVGMemberAccessor<OwnerType>& singleton() { return Base::template singleton<SVGAnimatedLengthAccessor, property>(); }
+
+private:
+    bool isAnimatedLength() const override { return true; }
+
+    std::unique_ptr<SVGAttributeAnimator> createAnimator(OwnerType& owner, const QualifiedName& attributeName, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive) const final
+    {
+        SVGLengthMode lengthMode = property(owner)->baseVal()->value().unitMode();
+        return SVGAnimatedLengthAnimator::create(attributeName, property(owner), animationMode, calcMode, isAccumulated, isAdditive, lengthMode);
+    }
+
+    void appendAnimatedInstance(OwnerType& owner, SVGAttributeAnimator& animator) const final
+    {
+        static_cast<SVGAnimatedLengthAnimator&>(animator).appendAnimatedInstance(property(owner));
+    }
+};
+
+template<typename OwnerType>
+class SVGAnimatedLengthListAccessor final : public SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedLengthList> {
+    using Base = SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedLengthList>;
+    using Base::property;
+
+public:
+    using Base::Base;
+    template<Ref<SVGAnimatedLengthList> OwnerType::*property>
+    constexpr static const SVGMemberAccessor<OwnerType>& singleton() { return Base::template singleton<SVGAnimatedLengthListAccessor, property>(); }
+
+private:
+    std::unique_ptr<SVGAttributeAnimator> createAnimator(OwnerType& owner, const QualifiedName& attributeName, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive) const final
+    {
+        return SVGAnimatedLengthListAnimator::create(attributeName, property(owner), animationMode, calcMode, isAccumulated, isAdditive, LengthModeWidth);
+    }
+
+    void appendAnimatedInstance(OwnerType& owner, SVGAttributeAnimator& animator) const final
+    {
+        static_cast<SVGAnimatedLengthListAnimator&>(animator).appendAnimatedInstance(property(owner));
+    }
+};
+
+template<typename OwnerType>
</ins><span class="cx"> class SVGAnimatedNumberAccessor final : public SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedNumber> {
</span><span class="cx">     using Base = SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedNumber>;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAnimatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimator.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimator.h        2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimator.h   2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -75,6 +75,8 @@
</span><span class="cx"> 
</span><span class="cx">     void apply(SVGElement* targetElement) override
</span><span class="cx">     {
</span><ins>+        if (isAnimatedStylePropertyAniamtor(targetElement))
+            applyAnimatedStylePropertyChange(targetElement, m_animated->animValAsString());
</ins><span class="cx">         applyAnimatedPropertyChange(targetElement);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -88,6 +90,8 @@
</span><span class="cx">             instance->instanceStopAnimation();
</span><span class="cx"> 
</span><span class="cx">         applyAnimatedPropertyChange(targetElement);
</span><ins>+        if (isAnimatedStylePropertyAniamtor(targetElement))
+            removeAnimatedStyleProperty(targetElement);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     float calculateDistance(SVGElement* targetElement, const String& from, const String& to) const override
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyAnimatorImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -120,6 +120,48 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class SVGAnimatedLengthAnimator final : public SVGAnimatedPropertyAnimator<SVGAnimatedLength, SVGAnimationLengthFunction> {
+    using Base = SVGAnimatedPropertyAnimator<SVGAnimatedLength, SVGAnimationLengthFunction>;
+
+public:
+    SVGAnimatedLengthAnimator(const QualifiedName& attributeName, Ref<SVGAnimatedLength>& animated, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive, SVGLengthMode lengthMode)
+        : Base(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive, lengthMode)
+    {
+    }
+
+    static auto create(const QualifiedName& attributeName, Ref<SVGAnimatedLength>& animated, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive, SVGLengthMode lengthMode)
+    {
+        return std::make_unique<SVGAnimatedLengthAnimator>(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive, lengthMode);
+    }
+
+private:
+    void progress(SVGElement* targetElement, float percentage, unsigned repeatCount) final
+    {
+        m_function.progress(targetElement, percentage, repeatCount, m_animated->animVal()->value());
+    }
+};
+
+class SVGAnimatedLengthListAnimator final : public SVGAnimatedPropertyAnimator<SVGAnimatedLengthList, SVGAnimationLengthListFunction> {
+    using Base = SVGAnimatedPropertyAnimator<SVGAnimatedLengthList, SVGAnimationLengthListFunction>;
+
+public:
+    SVGAnimatedLengthListAnimator(const QualifiedName& attributeName, Ref<SVGAnimatedLengthList>& animated, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive, SVGLengthMode lengthMode)
+        : Base(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive, lengthMode)
+    {
+    }
+
+    static auto create(const QualifiedName& attributeName, Ref<SVGAnimatedLengthList>& animated, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive, SVGLengthMode lengthMode)
+    {
+        return std::make_unique<SVGAnimatedLengthListAnimator>(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive, lengthMode);
+    }
+
+private:
+    void progress(SVGElement* targetElement, float percentage, unsigned repeatCount) final
+    {
+        m_function.progress(targetElement, percentage, repeatCount, m_animated->animVal());
+    }
+};
+
</ins><span class="cx"> class SVGAnimatedNumberAnimator final : public SVGAnimatedPropertyAnimator<SVGAnimatedNumber, SVGAnimationNumberFunction> {
</span><span class="cx">     friend class SVGAnimatedPropertyPairAnimator<SVGAnimatedNumberAnimator, SVGAnimatedNumberAnimator>;
</span><span class="cx">     friend class SVGAnimatedNumberPairAnimator;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimatedPropertyImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h    2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h       2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -27,13 +27,13 @@
</span><span class="cx"> 
</span><span class="cx"> #include "SVGAngle.h"
</span><span class="cx"> #include "SVGAnimatedDecoratedProperty.h"
</span><del>-#include "SVGAnimatedLength.h"
-#include "SVGAnimatedLengthList.h"
</del><span class="cx"> #include "SVGAnimatedPrimitiveProperty.h"
</span><span class="cx"> #include "SVGAnimatedPropertyList.h"
</span><span class="cx"> #include "SVGAnimatedTransformList.h"
</span><span class="cx"> #include "SVGAnimatedValueProperty.h"
</span><span class="cx"> #include "SVGDecoratedEnumeration.h"
</span><ins>+#include "SVGLength.h"
+#include "SVGLengthList.h"
</ins><span class="cx"> #include "SVGMarkerTypes.h"
</span><span class="cx"> #include "SVGNumberList.h"
</span><span class="cx"> #include "SVGPointList.h"
</span><span class="lines">@@ -50,9 +50,11 @@
</span><span class="cx"> using SVGAnimatedEnumeration = SVGAnimatedDecoratedProperty<SVGDecoratedEnumeration, unsigned>;
</span><span class="cx"> 
</span><span class="cx"> using SVGAnimatedAngle = SVGAnimatedValueProperty<SVGAngle>;
</span><ins>+using SVGAnimatedLength = SVGAnimatedValueProperty<SVGLength>;
</ins><span class="cx"> using SVGAnimatedRect = SVGAnimatedValueProperty<SVGRect>;
</span><span class="cx"> using SVGAnimatedPreserveAspectRatio = SVGAnimatedValueProperty<SVGPreserveAspectRatio>;
</span><span class="cx"> 
</span><ins>+using SVGAnimatedLengthList = SVGAnimatedPropertyList<SVGLengthList>;
</ins><span class="cx"> using SVGAnimatedNumberList = SVGAnimatedPropertyList<SVGNumberList>;
</span><span class="cx"> using SVGAnimatedPointList = SVGAnimatedPropertyList<SVGPointList>;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveListFunctionImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunctionImpl.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunctionImpl.h       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveListFunctionImpl.h  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -26,6 +26,7 @@
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><span class="cx"> #include "SVGAnimationAdditiveListFunction.h"
</span><ins>+#include "SVGLengthList.h"
</ins><span class="cx"> #include "SVGPointList.h"
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -32,6 +33,69 @@
</span><span class="cx"> 
</span><span class="cx"> class SVGElement;
</span><span class="cx"> 
</span><ins>+class SVGAnimationLengthListFunction : public SVGAnimationAdditiveListFunction<SVGLengthList> {
+    using Base = SVGAnimationAdditiveListFunction<SVGLengthList>;
+
+public:
+    SVGAnimationLengthListFunction(AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive, SVGLengthMode lengthMode)
+        : Base(animationMode, calcMode, isAccumulated, isAdditive, lengthMode)
+    {
+    }
+
+    void setFromAndToValues(SVGElement*, const String& from, const String& to) override
+    {
+        m_from->parse(from);
+        m_to->parse(to);
+    }
+
+    void setToAtEndOfDurationValue(const String& toAtEndOfDuration) override
+    {
+        m_toAtEndOfDuration->parse(toAtEndOfDuration);
+    }
+
+    void progress(SVGElement* targetElement, float percentage, unsigned repeatCount, RefPtr<SVGLengthList>& animated)
+    {
+        if (!adjustAnimatedList(m_animationMode, percentage, animated))
+            return;
+
+        const Vector<Ref<SVGLength>>& fromItems = m_animationMode == AnimationMode::To ? animated->items() : m_from->items();
+        const Vector<Ref<SVGLength>>& toItems = m_to->items();
+        const Vector<Ref<SVGLength>>& toAtEndOfDurationItems = toAtEndOfDuration()->items();
+        Vector<Ref<SVGLength>>& animatedItems = animated->items();
+        SVGLengthMode lengthMode = animated->lengthMode();
+
+        SVGLengthContext lengthContext(targetElement);
+        for (unsigned i = 0; i < toItems.size(); ++i) {
+            SVGLengthType unitType = (i < fromItems.size() && percentage < 0.5 ? fromItems : toItems)[i]->value().unitType();
+
+            float from = i < fromItems.size() ? fromItems[i]->value().value(lengthContext) : 0;
+            float to = toItems[i]->value().value(lengthContext);
+            float toAtEndOfDuration = i < toAtEndOfDurationItems.size() ? toAtEndOfDurationItems[i]->value().value(lengthContext) : 0;
+            float value = animatedItems[i]->value().value(lengthContext);
+
+            value = Base::progress(percentage, repeatCount, from, to, toAtEndOfDuration, value);
+            animatedItems[i]->value().setValue(lengthContext, value, lengthMode, unitType);
+        }
+    }
+
+private:
+    void addFromAndToValues(SVGElement* targetElement) override
+    {
+        const Vector<Ref<SVGLength>>& fromItems = m_from->items();
+        const Vector<Ref<SVGLength>>& toItems = m_to->items();
+
+        if (!fromItems.size() || fromItems.size() != toItems.size())
+            return;
+
+        SVGLengthContext lengthContext(targetElement);
+        for (unsigned i = 0; i < fromItems.size(); ++i) {
+            const SVGLengthValue& fromValue = fromItems[i]->value();
+            SVGLengthValue& toValue = toItems[i]->value();
+            toValue.setValue(toValue.value(lengthContext) + fromValue.value(lengthContext), lengthContext);
+        }
+    }
+};
+
</ins><span class="cx"> class SVGAnimationNumberListFunction : public SVGAnimationAdditiveListFunction<SVGNumberList> {
</span><span class="cx"> public:
</span><span class="cx">     using Base = SVGAnimationAdditiveListFunction<SVGNumberList>;
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAnimationAdditiveValueFunctionImplh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveValueFunctionImpl.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveValueFunctionImpl.h      2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGAnimationAdditiveValueFunctionImpl.h 2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -148,6 +148,59 @@
</span><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+class SVGAnimationLengthFunction : public SVGAnimationAdditiveValueFunction<SVGLengthValue> {
+    using Base = SVGAnimationAdditiveValueFunction<SVGLengthValue>;
+
+public:
+    SVGAnimationLengthFunction(AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive, SVGLengthMode lengthMode)
+        : Base(animationMode, calcMode, isAccumulated, isAdditive)
+        , m_lengthMode(lengthMode)
+    {
+    }
+
+    void setFromAndToValues(SVGElement*, const String& from, const String& to) override
+    {
+        m_from = SVGLengthValue(m_lengthMode, from);
+        m_to = SVGLengthValue(m_lengthMode, to);
+    }
+
+    void setToAtEndOfDurationValue(const String& toAtEndOfDuration) override
+    {
+        m_toAtEndOfDuration = SVGLengthValue(m_lengthMode, toAtEndOfDuration);
+    }
+
+    void progress(SVGElement* targetElement, float percentage, unsigned repeatCount, SVGLengthValue& animated)
+    {
+        SVGLengthContext lengthContext(targetElement);
+        SVGLengthType unitType = percentage < 0.5 ? m_from.unitType() : m_to.unitType();
+
+        float from = (m_animationMode == AnimationMode::To ? animated : m_from).value(lengthContext);
+        float to = m_to.value(lengthContext);
+        float toAtEndOfDuration = this->toAtEndOfDuration().value(lengthContext);
+        float value = animated.value(lengthContext);
+
+        value = Base::progress(percentage, repeatCount, from, to, toAtEndOfDuration, value);
+        animated = { lengthContext, value, m_lengthMode, unitType };
+    }
+
+    float calculateDistance(SVGElement* targetElement, const String& from, const String& to) const override
+    {
+        SVGLengthContext lengthContext(targetElement);
+        auto fromLength = SVGLengthValue(m_lengthMode, from);
+        auto toLength = SVGLengthValue(m_lengthMode, to);
+        return fabsf(toLength.value(lengthContext) - fromLength.value(lengthContext));
+    }
+
+private:
+    void addFromAndToValues(SVGElement* targetElement) override
+    {
+        SVGLengthContext lengthContext(targetElement);
+        m_to.setValue(m_to.value(lengthContext) + m_from.value(lengthContext), lengthContext);
+    }
+
+    SVGLengthMode m_lengthMode;
+};
+
</ins><span class="cx"> class SVGAnimationNumberFunction : public SVGAnimationAdditiveValueFunction<float> {
</span><span class="cx">     friend class SVGAnimatedNumberPairAnimator;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAttributeAnimatorcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAttributeAnimator.cpp (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAttributeAnimator.cpp     2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGAttributeAnimator.cpp        2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -32,6 +32,11 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+bool SVGAttributeAnimator::isAnimatedStylePropertyAniamtor(const SVGElement* targetElement) const
+{
+    return targetElement->isAnimatedStyleAttribute(m_attributeName);
+}
+
</ins><span class="cx"> void SVGAttributeAnimator::applyAnimatedStylePropertyChange(SVGElement* element, CSSPropertyID id, const String& value)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(element);
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAttributeAnimatorh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAttributeAnimator.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAttributeAnimator.h       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGAttributeAnimator.h  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -74,6 +74,8 @@
</span><span class="cx">     virtual float calculateDistance(SVGElement*, const String&, const String&) const { return -1; }
</span><span class="cx"> 
</span><span class="cx"> protected:
</span><ins>+    bool isAnimatedStylePropertyAniamtor(const SVGElement*) const;
+
</ins><span class="cx">     static void applyAnimatedStylePropertyChange(SVGElement*, CSSPropertyID, const String& value);
</span><span class="cx">     static void removeAnimatedStyleProperty(SVGElement*, CSSPropertyID);
</span><span class="cx">     static void applyAnimatedPropertyChange(SVGElement*, const QualifiedName&);
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGAttributeRegistryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h       2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGAttributeRegistry.h  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -25,8 +25,6 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><del>-#include "SVGAnimatedLength.h"
-#include "SVGAnimatedLengthList.h"
</del><span class="cx"> #include "SVGAnimatedTransformList.h"
</span><span class="cx"> #include "SVGAttributeAccessor.h"
</span><span class="cx"> #include "SVGLegacyAnimatedProperty.h"
</span><span class="lines">@@ -51,18 +49,6 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     // Animatable attributes
</span><del>-    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, SVGAnimatedLengthAttribute OwnerType::*attribute>
-    void registerAttribute()
-    {
-        registerAttribute(SVGAnimatedLengthAttributeAccessor<OwnerType>::template singleton<attributeName, attribute>());
-    }
-
-    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, SVGAnimatedLengthListAttribute OwnerType::*attribute>
-    void registerAttribute()
-    {
-        registerAttribute(SVGAnimatedLengthListAttributeAccessor<OwnerType>::template singleton<attributeName, attribute>());
-    }
-
</del><span class="cx">     template<const LazyNeverDestroyed<const QualifiedName>& attributeName, SVGAnimatedTransformListAttribute OwnerType::*attribute>
</span><span class="cx">     void registerAttribute()
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGPropertyAnimatorFactoryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGPropertyAnimatorFactory.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGPropertyAnimatorFactory.h 2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGPropertyAnimatorFactory.h    2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -25,8 +25,11 @@
</span><span class="cx"> 
</span><span class="cx"> #pragma once
</span><span class="cx"> 
</span><ins>+#include "SVGLength.h"
</ins><span class="cx"> #include "SVGNames.h"
</span><span class="cx"> #include "SVGPrimitivePropertyAnimatorImpl.h"
</span><ins>+#include "SVGValuePropertyAnimatorImpl.h"
+#include "SVGValuePropertyListAnimatorImpl.h"
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -80,6 +83,16 @@
</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 createLengthAnimator(const QualifiedName& attributeName, Ref<SVGProperty>&& property, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
+    {
+        return SVGLengthAnimator::create(attributeName, WTFMove(property), animationMode, calcMode, isAccumulated, isAdditive);
+    }
+
+    static auto createLengthListAnimator(const QualifiedName& attributeName, Ref<SVGProperty>&& property, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
+    {
+        return SVGLengthListAnimator::create(attributeName, WTFMove(property), animationMode, calcMode, isAccumulated, isAdditive);
+    }
+
</ins><span class="cx">     static auto createNumberAnimator(const QualifiedName& attributeName, Ref<SVGProperty>&& property, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
</span><span class="cx">     {
</span><span class="cx">         return SVGNumberAnimator::create(attributeName,  WTFMove(property), animationMode, calcMode, isAccumulated, isAdditive);
</span><span class="lines">@@ -93,13 +106,22 @@
</span><span class="cx">     static const AttributeAnimatorCreator& attributeAnimatorCreator()
</span><span class="cx">     {
</span><span class="cx">         static NeverDestroyed<AttributeAnimatorCreator> map = AttributeAnimatorCreator({
</span><del>-            { SVGNames::colorAttr->impl(),          std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
-            { SVGNames::fillAttr->impl(),           std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
-            { SVGNames::flood_colorAttr->impl(),    std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
-            { SVGNames::lighting_colorAttr->impl(), std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
-            { SVGNames::stop_colorAttr->impl(),     std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
-            { SVGNames::strokeAttr->impl(),         std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
</del><ins>+            { SVGNames::colorAttr->impl(),              std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
+            { SVGNames::fillAttr->impl(),               std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
+            { SVGNames::flood_colorAttr->impl(),        std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
+            { SVGNames::lighting_colorAttr->impl(),     std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
+            { SVGNames::stop_colorAttr->impl(),         std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
+            { SVGNames::strokeAttr->impl(),             std::make_pair(SVGValueProperty<Color>::create, SVGPropertyAnimatorFactory::createColorAnimator) },
</ins><span class="cx"> 
</span><ins>+            { SVGNames::font_sizeAttr->impl(),          std::make_pair([]() { return SVGLength::create(); }, SVGPropertyAnimatorFactory::createLengthAnimator) },
+            { SVGNames::kerningAttr->impl(),            std::make_pair([]() { return SVGLength::create(); }, SVGPropertyAnimatorFactory::createLengthAnimator) },
+            { SVGNames::letter_spacingAttr->impl(),     std::make_pair([]() { return SVGLength::create(); }, SVGPropertyAnimatorFactory::createLengthAnimator) },
+            { SVGNames::stroke_dashoffsetAttr->impl(),  std::make_pair([]() { return SVGLength::create(); }, SVGPropertyAnimatorFactory::createLengthAnimator) },
+            { SVGNames::stroke_widthAttr->impl(),       std::make_pair([]() { return SVGLength::create(); }, SVGPropertyAnimatorFactory::createLengthAnimator) },
+            { SVGNames::word_spacingAttr->impl(),       std::make_pair([]() { return SVGLength::create(); }, SVGPropertyAnimatorFactory::createLengthAnimator) },
+
+            { SVGNames::stroke_dasharrayAttr->impl(),   std::make_pair([]() { return SVGLengthList::create(); }, SVGPropertyAnimatorFactory::createLengthListAnimator) },
+            
</ins><span class="cx">             { SVGNames::fill_opacityAttr->impl(),       std::make_pair(SVGValueProperty<float>::create, SVGPropertyAnimatorFactory::createNumberAnimator) },
</span><span class="cx">             { SVGNames::flood_opacityAttr->impl(),      std::make_pair(SVGValueProperty<float>::create, SVGPropertyAnimatorFactory::createNumberAnimator) },
</span><span class="cx">             { SVGNames::opacityAttr->impl(),            std::make_pair(SVGValueProperty<float>::create, SVGPropertyAnimatorFactory::createNumberAnimator) },
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGPropertyOwnerRegistryh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h (243514 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h   2019-03-26 19:29:02 UTC (rev 243514)
+++ trunk/Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -66,7 +66,19 @@
</span><span class="cx">     {
</span><span class="cx">         registerProperty(attributeName, SVGAnimatedIntegerAccessor<OwnerType>::template singleton<property>());
</span><span class="cx">     }
</span><ins>+    
+    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedLength> OwnerType::*property>
+    static void registerProperty()
+    {
+        registerProperty(attributeName, SVGAnimatedLengthAccessor<OwnerType>::template singleton<property>());
+    }
</ins><span class="cx"> 
</span><ins>+    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedLengthList> OwnerType::*property>
+    static void registerProperty()
+    {
+        registerProperty(attributeName, SVGAnimatedLengthListAccessor<OwnerType>::template singleton<property>());
+    }
+
</ins><span class="cx">     template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedNumber> OwnerType::*property>
</span><span class="cx">     static void registerProperty()
</span><span class="cx">     {
</span></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGValuePropertyAnimatorhfromrev243514trunkSourceWebCoresvgSVGValueh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/svg/properties/SVGValuePropertyAnimator.h (from rev 243514, trunk/Source/WebCore/svg/SVGValue.h) (0 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGValuePropertyAnimator.h                           (rev 0)
+++ trunk/Source/WebCore/svg/properties/SVGValuePropertyAnimator.h      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -0,0 +1,64 @@
</span><ins>+/*
+ * Copyright (C) 2018-2019 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGPropertyAnimator.h"
+
+namespace WebCore {
+
+template<typename PropertyType, typename AnimationFunction>
+class SVGValuePropertyAnimator : public SVGPropertyAnimator<AnimationFunction> {
+    using Base = SVGPropertyAnimator<AnimationFunction>;
+    using Base::Base;
+    using Base::applyAnimatedStylePropertyChange;
+    using Base::m_function;
+
+public:
+    template<typename... Arguments>
+    SVGValuePropertyAnimator(const QualifiedName& attributeName, Ref<SVGProperty>&& property, Arguments&&... arguments)
+        : Base(attributeName, std::forward<Arguments>(arguments)...)
+        , m_property(static_reference_cast<PropertyType>(WTFMove(property)))
+    {
+    }
+
+    void progress(SVGElement* targetElement, float percentage, unsigned repeatCount) override
+    {
+        m_function.progress(targetElement, percentage, repeatCount, m_property->value());
+    }
+
+    void apply(SVGElement* targetElement) override
+    {
+        applyAnimatedStylePropertyChange(targetElement, m_property->valueAsString());
+    }
+
+protected:
+    using Base::computeCSSPropertyValue;
+    using Base::m_attributeName;
+
+    Ref<PropertyType> m_property;
+};
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGValuePropertyAnimatorImplhfromrev243514trunkSourceWebCoresvgSVGValueh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/svg/properties/SVGValuePropertyAnimatorImpl.h (from rev 243514, trunk/Source/WebCore/svg/SVGValue.h) (0 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGValuePropertyAnimatorImpl.h                               (rev 0)
+++ trunk/Source/WebCore/svg/properties/SVGValuePropertyAnimatorImpl.h  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -0,0 +1,55 @@
</span><ins>+/*
+ * Copyright (C) 2018-2019 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGAnimationFunction.h"
+#include "SVGValuePropertyAnimator.h"
+
+namespace WebCore {
+
+class SVGLengthAnimator final : public SVGValuePropertyAnimator<SVGLength, SVGAnimationLengthFunction> {
+    using Base = SVGValuePropertyAnimator<SVGLength, SVGAnimationLengthFunction>;
+    using Base::Base;
+    using Base::m_attributeName;
+    using Base::m_property;
+
+public:
+    static auto create(const QualifiedName& attributeName, Ref<SVGProperty>&& property, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
+    {
+        return std::make_unique<SVGLengthAnimator>(attributeName, WTFMove(property), animationMode, calcMode, isAccumulated, isAdditive, LengthModeOther);
+    }
+
+    void start(SVGElement* targetElement) override
+    {
+        String baseValue = computeCSSPropertyValue(targetElement, cssPropertyID(m_attributeName.localName()));
+        SVGLengthValue value(LengthModeOther);
+        if (!value.setValueAsString(baseValue).hasException())
+            m_property->setValue(value);
+    }
+};
+
+}
+
</ins></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGValuePropertyListAnimatorhfromrev243514trunkSourceWebCoresvgSVGValueh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/svg/properties/SVGValuePropertyListAnimator.h (from rev 243514, trunk/Source/WebCore/svg/SVGValue.h) (0 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGValuePropertyListAnimator.h                               (rev 0)
+++ trunk/Source/WebCore/svg/properties/SVGValuePropertyListAnimator.h  2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -0,0 +1,64 @@
</span><ins>+/*
+ * Copyright (C) 2018-2019 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGPropertyAnimator.h"
+
+namespace WebCore {
+
+template<typename ListType, typename AnimationFunction>
+class SVGValuePropertyListAnimator : public SVGPropertyAnimator<AnimationFunction> {
+    using Base = SVGPropertyAnimator<AnimationFunction>;
+    using Base::Base;
+    using Base::applyAnimatedStylePropertyChange;
+    using Base::m_function;
+
+public:
+    template<typename... Arguments>
+    SVGValuePropertyListAnimator(const QualifiedName& attributeName, Ref<SVGProperty>&& property, Arguments&&... arguments)
+        : Base(attributeName, std::forward<Arguments>(arguments)...)
+        , m_list(static_reference_cast<ListType>(WTFMove(property)))
+    {
+    }
+
+    void progress(SVGElement* targetElement, float percentage, unsigned repeatCount) override
+    {
+        m_function.progress(targetElement, percentage, repeatCount, m_list);
+    }
+
+    void apply(SVGElement* targetElement) override
+    {
+        applyAnimatedStylePropertyChange(targetElement, m_list->valueAsString());
+    }
+
+protected:
+    using Base::computeCSSPropertyValue;
+    using Base::m_attributeName;
+
+    RefPtr<ListType> m_list;
+};
+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoresvgpropertiesSVGValuePropertyListAnimatorImplhfromrev243514trunkSourceWebCoresvgSVGValueh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/svg/properties/SVGValuePropertyListAnimatorImpl.h (from rev 243514, trunk/Source/WebCore/svg/SVGValue.h) (0 => 243515)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/svg/properties/SVGValuePropertyListAnimatorImpl.h                           (rev 0)
+++ trunk/Source/WebCore/svg/properties/SVGValuePropertyListAnimatorImpl.h      2019-03-26 20:14:32 UTC (rev 243515)
</span><span class="lines">@@ -0,0 +1,53 @@
</span><ins>+/*
+ * Copyright (C) 2018-2019 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGAnimationFunction.h"
+#include "SVGValuePropertyListAnimator.h"
+
+namespace WebCore {
+
+class SVGLengthListAnimator final : public SVGValuePropertyListAnimator<SVGLengthList, SVGAnimationLengthListFunction> {
+    using Base = SVGValuePropertyListAnimator<SVGLengthList, SVGAnimationLengthListFunction>;
+    using Base::Base;
+    using Base::m_attributeName;
+    using Base::m_list;
+
+public:
+    static auto create(const QualifiedName& attributeName, Ref<SVGProperty>&& property, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
+    {
+        return std::make_unique<SVGLengthListAnimator>(attributeName, WTFMove(property), animationMode, calcMode, isAccumulated, isAdditive, LengthModeOther);
+    }
+
+    void start(SVGElement* targetElement) override
+    {
+        String baseValue = computeCSSPropertyValue(targetElement, cssPropertyID(m_attributeName.localName()));
+        if (!m_list->parse(baseValue))
+            m_list->clearItems();
+    }
+};
+
+}
</ins></span></pre>
</div>
</div>

</body>
</html>