Unreviewed, rolling out r242963.
[WebKit-https.git] / Source / WebCore / svg / properties / SVGLegacyAnimatedProperty.h
1 /*
2  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
3  * Copyright (C) 2013 Samsung Electronics. All rights reserved.
4  * Copyright (C) 2016-2018 Apple Inc. All rights reserved.
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public License
17  * along with this library; see the file COPYING.LIB.  If not, write to
18  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  * Boston, MA 02110-1301, USA.
20  */
21
22 #pragma once
23
24 #include "QualifiedName.h"
25 #include "SVGAnimatedPropertyDescription.h"
26 #include "SVGAnimatedPropertyType.h"
27 #include <wtf/RefCounted.h>
28
29 namespace WebCore {
30
31 class SVGElement;
32 class SVGLegacyProperty;
33
34 class SVGLegacyAnimatedProperty : public RefCounted<SVGLegacyAnimatedProperty> {
35 public:
36     virtual ~SVGLegacyAnimatedProperty();
37     virtual bool isAnimating() const { return false; }
38     virtual bool isAnimatedListTearOff() const { return false; }
39
40     SVGElement* contextElement() const { return m_contextElement.get(); }
41     const QualifiedName& attributeName() const { return m_attributeName; }
42     AnimatedPropertyType animatedPropertyType() const { return m_animatedPropertyType; }
43     bool isReadOnly() const { return m_isReadOnly; }
44     void setIsReadOnly() { m_isReadOnly = true; }
45
46     void commitChange();
47
48     template<typename TearOffType, typename PropertyType, AnimatedPropertyType animatedType>
49     static RefPtr<SVGLegacyAnimatedProperty> lookupOrCreateAnimatedProperty(SVGElement& element, const QualifiedName& attributeName, const AtomicString& identifier, PropertyType& property, AnimatedPropertyState animatedState)
50     {
51         SVGAnimatedPropertyDescription key(&element, identifier);
52
53         auto result = animatedPropertyCache().add(key, nullptr);
54         if (!result.isNewEntry)
55             return result.iterator->value;
56
57         auto wrapper = TearOffType::create(&element, attributeName, animatedType, property);
58         if (animatedState == PropertyIsReadOnly)
59             wrapper->setIsReadOnly();
60
61         // Cache the raw pointer but return a RefPtr<>. This will break the cyclic reference
62         // between SVGAnimatedProperty and SVGElement once the property pointer is not needed.
63         result.iterator->value = wrapper.ptr();
64         return static_reference_cast<SVGLegacyAnimatedProperty>(wrapper);
65     }
66
67     static RefPtr<SVGLegacyAnimatedProperty> lookupAnimatedProperty(const SVGElement& element, const AtomicString& identifier)
68     {
69         SVGAnimatedPropertyDescription key(const_cast<SVGElement*>(&element), identifier);
70         return animatedPropertyCache().get(key);
71     }
72
73 protected:
74     SVGLegacyAnimatedProperty(SVGElement*, const QualifiedName&, AnimatedPropertyType);
75
76 private:
77     // Caching facilities.
78     using Cache = HashMap<SVGAnimatedPropertyDescription, SVGLegacyAnimatedProperty*, SVGAnimatedPropertyDescriptionHash, SVGAnimatedPropertyDescriptionHashTraits>;
79     static Cache& animatedPropertyCache()
80     {
81         static NeverDestroyed<Cache> cache;
82         return cache;
83     }
84
85     RefPtr<SVGElement> m_contextElement;
86     const QualifiedName& m_attributeName;
87     AnimatedPropertyType m_animatedPropertyType;
88
89 protected:
90     bool m_isReadOnly { false };
91 };
92
93 } // namespace WebCore