SVGElementAnimatedPropertyList SVGAnimatedTypeAnimator::findAnimatedPropertiesForAttributeName(SVGElement& targetElement, const QualifiedName& attributeName)
{
    SVGElementAnimatedPropertyList result;

    if (!SVGAnimatedType::supportsAnimVal(m_type))
        return result;

    auto& propertyMap = targetElement.localAttributeToPropertyMap();
    auto targetProperties = propertyMap.properties(targetElement, attributeName);

    if (targetProperties.isEmpty())
        return result;

    result.append(SVGElementAnimatedProperties { &targetElement, WTF::move(targetProperties) });

    for (SVGElement* instance : targetElement.instances())
        result.append(SVGElementAnimatedProperties { instance, propertyMap.properties(*instance, attributeName) });

#if !ASSERT_DISABLED
    for (auto& animatedProperties : result) {
        for (auto& property : animatedProperties.properties) {
            if (property->animatedPropertyType() != m_type) {
                ASSERT(m_type == AnimatedAngle);
                ASSERT(property->animatedPropertyType() == AnimatedEnumeration);
            }
        }
    }
#endif

    return result;
}
SVGElementAnimatedPropertyList SVGAnimatedTypeAnimator::findAnimatedPropertiesForAttributeName(SVGElement* targetElement, const QualifiedName& attributeName)
{
    ASSERT(targetElement);

    SVGElementAnimatedPropertyList propertiesByInstance;

    Vector<RefPtr<SVGAnimatedProperty> > targetProperties;
    targetElement->localAttributeToPropertyMap().animatedPropertiesForAttribute(targetElement, attributeName, targetProperties);

    if (!SVGAnimatedType::supportsAnimVal(m_type))
        return SVGElementAnimatedPropertyList();

    SVGElementAnimatedProperties propertiesPair(targetElement, targetProperties);
    propertiesByInstance.append(propertiesPair);

    const HashSet<SVGElementInstance*>& instances = targetElement->instancesForElement();
    const HashSet<SVGElementInstance*>::const_iterator end = instances.end();
    for (HashSet<SVGElementInstance*>::const_iterator it = instances.begin(); it != end; ++it) {
        SVGElement* shadowTreeElement = (*it)->shadowTreeElement();
        if (!shadowTreeElement)
            continue;

        Vector<RefPtr<SVGAnimatedProperty> > instanceProperties;
        targetElement->localAttributeToPropertyMap().animatedPropertiesForAttribute(shadowTreeElement, attributeName, instanceProperties);

        SVGElementAnimatedProperties instancePropertiesPair(shadowTreeElement, instanceProperties);
        propertiesByInstance.append(instancePropertiesPair);
    }

#if !ASSERT_DISABLED
    SVGElementAnimatedPropertyList::const_iterator propertiesEnd = propertiesByInstance.end();
    for (SVGElementAnimatedPropertyList::const_iterator it = propertiesByInstance.begin(); it != propertiesEnd; ++it) {
        size_t propertiesSize = it->properties.size();
        for (size_t i = 0; i < propertiesSize; ++i) {
            RefPtr<SVGAnimatedProperty> property = it->properties[i];
            if (property->animatedPropertyType() != m_type) {
                ASSERT(m_type == AnimatedAngle);
                ASSERT(property->animatedPropertyType() == AnimatedEnumeration);
            }
        }
    }
#endif

    return propertiesByInstance;
}