diff options
Diffstat (limited to 'Source/WebCore/svg/properties/SVGAnimatedProperty.h')
-rw-r--r-- | Source/WebCore/svg/properties/SVGAnimatedProperty.h | 42 |
1 files changed, 22 insertions, 20 deletions
diff --git a/Source/WebCore/svg/properties/SVGAnimatedProperty.h b/Source/WebCore/svg/properties/SVGAnimatedProperty.h index 93f076b2b..b39772b41 100644 --- a/Source/WebCore/svg/properties/SVGAnimatedProperty.h +++ b/Source/WebCore/svg/properties/SVGAnimatedProperty.h @@ -1,6 +1,7 @@ /* * Copyright (C) Research In Motion Limited 2010. All rights reserved. * Copyright (C) 2013 Samsung Electronics. All rights reserved. + * Copyright (C) 2016 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 @@ -18,10 +19,8 @@ * Boston, MA 02110-1301, USA. */ -#ifndef SVGAnimatedProperty_h -#define SVGAnimatedProperty_h +#pragma once -#if ENABLE(SVG) #include "SVGAnimatedPropertyDescription.h" #include "SVGPropertyInfo.h" #include <wtf/RefCounted.h> @@ -29,19 +28,21 @@ namespace WebCore { class SVGElement; +class SVGProperty; class SVGAnimatedProperty : public RefCounted<SVGAnimatedProperty> { public: SVGElement* contextElement() const { return m_contextElement.get(); } const QualifiedName& attributeName() const { return m_attributeName; } AnimatedPropertyType animatedPropertyType() const { return m_animatedPropertyType; } - bool isAnimating() const { return m_isAnimating; } bool isReadOnly() const { return m_isReadOnly; } void setIsReadOnly() { m_isReadOnly = true; } void commitChange(); + virtual bool isAnimating() const { return false; } virtual bool isAnimatedListTearOff() const { return false; } + virtual void propertyWillBeDeleted(const SVGProperty&) { } // Caching facilities. typedef HashMap<SVGAnimatedPropertyDescription, SVGAnimatedProperty*, SVGAnimatedPropertyDescriptionHash, SVGAnimatedPropertyDescriptionHashTraits> Cache; @@ -49,22 +50,27 @@ public: virtual ~SVGAnimatedProperty(); template<typename OwnerType, typename TearOffType, typename PropertyType> - static PassRefPtr<TearOffType> lookupOrCreateWrapper(OwnerType* element, const SVGPropertyInfo* info, PropertyType& property) + static Ref<TearOffType> lookupOrCreateWrapper(OwnerType* element, const SVGPropertyInfo* info, PropertyType& property) { ASSERT(info); SVGAnimatedPropertyDescription key(element, info->propertyIdentifier); - RefPtr<SVGAnimatedProperty> wrapper = animatedPropertyCache()->get(key); - if (!wrapper) { - wrapper = TearOffType::create(element, info->attributeName, info->animatedPropertyType, property); - if (info->animatedPropertyState == PropertyIsReadOnly) - wrapper->setIsReadOnly(); - animatedPropertyCache()->set(key, wrapper.get()); - } - return static_pointer_cast<TearOffType>(wrapper); + + auto result = animatedPropertyCache()->add(key, nullptr); + if (!result.isNewEntry) + return static_cast<TearOffType&>(*result.iterator->value); + + Ref<SVGAnimatedProperty> wrapper = TearOffType::create(element, info->attributeName, info->animatedPropertyType, property); + if (info->animatedPropertyState == PropertyIsReadOnly) + wrapper->setIsReadOnly(); + + // Cache the raw pointer but return a Ref<>. This will break the cyclic reference + // between SVGAnimatedProperty and SVGElement once the property pointer is not needed. + result.iterator->value = wrapper.ptr(); + return static_reference_cast<TearOffType>(wrapper); } template<typename OwnerType, typename TearOffType> - static TearOffType* lookupWrapper(OwnerType* element, const SVGPropertyInfo* info) + static RefPtr<TearOffType> lookupWrapper(OwnerType* element, const SVGPropertyInfo* info) { ASSERT(info); SVGAnimatedPropertyDescription key(element, info->propertyIdentifier); @@ -72,7 +78,7 @@ public: } template<typename OwnerType, typename TearOffType> - static TearOffType* lookupWrapper(const OwnerType* element, const SVGPropertyInfo* info) + static RefPtr<TearOffType> lookupWrapper(const OwnerType* element, const SVGPropertyInfo* info) { return lookupWrapper<OwnerType, TearOffType>(const_cast<OwnerType*>(element), info); } @@ -88,11 +94,7 @@ private: AnimatedPropertyType m_animatedPropertyType; protected: - bool m_isAnimating; bool m_isReadOnly; }; -} - -#endif // ENABLE(SVG) -#endif // SVGAnimatedProperty_h +} // namespace WebCore |