SVGViewSpec objects should mark relevant SVG elements
[WebKit-https.git] / Source / WebCore / svg / properties / SVGAttributeOwnerProxyImpl.h
1 /*
2  * Copyright (C) 2018 Apple Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #include "SVGAttributeOwnerProxy.h"
29 #include "SVGAttributeRegistry.h"
30
31 namespace WebCore {
32
33 template<typename OwnerType, typename... BaseTypes>
34 class SVGAttributeOwnerProxyImpl : public SVGAttributeOwnerProxy {
35 public:
36     using AttributeRegistry = SVGAttributeRegistry<OwnerType, BaseTypes...>;
37
38     SVGAttributeOwnerProxyImpl(OwnerType& owner, SVGElement& element, AnimatedPropertyState animatedState = PropertyIsReadWrite)
39         : SVGAttributeOwnerProxy(element)
40         , m_owner(owner)
41         , m_animatedState(animatedState)
42     {
43         // This is the OwnerProxy constructor for the non SVGElement based owners, e.g. SVGTests.
44     }
45
46     SVGAttributeOwnerProxyImpl(OwnerType& owner)
47         : SVGAttributeOwnerProxy(owner)
48         , m_owner(owner)
49     {
50         static_assert(std::is_base_of<SVGElement, OwnerType>::value, "The owner of SVGAttributeOwnerProxy should be derived from SVGElement.");
51     }
52
53     static AttributeRegistry& attributeRegistry()
54     {
55         return AttributeRegistry::singleton();
56     }
57
58     static bool isKnownAttribute(const QualifiedName& attributeName)
59     {
60         return attributeRegistry().isKnownAttribute(attributeName);
61     }
62
63     static bool isAnimatedLengthAttribute(const QualifiedName& attributeName)
64     {
65         return attributeRegistry().isAnimatedLengthAttribute(attributeName);
66     }
67
68 private:
69     void synchronizeAttributes() const override
70     {
71         attributeRegistry().synchronizeAttributes(m_owner, *m_element);
72     }
73
74     void synchronizeAttribute(const QualifiedName& attributeName) const override
75     {
76         attributeRegistry().synchronizeAttribute(m_owner, *m_element, attributeName);
77     }
78
79     Vector<AnimatedPropertyType> animatedTypes(const QualifiedName& attributeName) const override
80     {
81         return attributeRegistry().animatedTypes(attributeName);
82     }
83
84     RefPtr<SVGAnimatedProperty> lookupOrCreateAnimatedProperty(const SVGAttribute& attribute) const override
85     {
86         return attributeRegistry().lookupOrCreateAnimatedProperty(m_owner, *m_element, attribute, m_animatedState);
87     }
88
89     RefPtr<SVGAnimatedProperty> lookupAnimatedProperty(const SVGAttribute& attribute) const override
90     {
91         return attributeRegistry().lookupAnimatedProperty(m_owner, *m_element, attribute);
92     }
93
94     Vector<RefPtr<SVGAnimatedProperty>> lookupOrCreateAnimatedProperties(const QualifiedName& attributeName) const override
95     {
96         return attributeRegistry().lookupOrCreateAnimatedProperties(m_owner, *m_element, attributeName, m_animatedState);
97     }
98
99     OwnerType& m_owner;
100     AnimatedPropertyState m_animatedState { PropertyIsReadWrite };
101 };
102
103 }