Use modern for-loops in WebCore/svg.
[WebKit-https.git] / Source / WebCore / svg / SVGCursorElement.cpp
1 /*
2  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #include "config.h"
22 #include "SVGCursorElement.h"
23
24 #include "Document.h"
25 #include "SVGNames.h"
26 #include "XLinkNames.h"
27 #include <wtf/NeverDestroyed.h>
28
29 namespace WebCore {
30
31 // Animated property definitions
32 DEFINE_ANIMATED_LENGTH(SVGCursorElement, SVGNames::xAttr, X, x)
33 DEFINE_ANIMATED_LENGTH(SVGCursorElement, SVGNames::yAttr, Y, y)
34 DEFINE_ANIMATED_STRING(SVGCursorElement, XLinkNames::hrefAttr, Href, href)
35 DEFINE_ANIMATED_BOOLEAN(SVGCursorElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
36
37 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGCursorElement)
38     REGISTER_LOCAL_ANIMATED_PROPERTY(x)
39     REGISTER_LOCAL_ANIMATED_PROPERTY(y)
40     REGISTER_LOCAL_ANIMATED_PROPERTY(href)
41     REGISTER_LOCAL_ANIMATED_PROPERTY(externalResourcesRequired)
42     REGISTER_PARENT_ANIMATED_PROPERTIES(SVGTests)
43 END_REGISTER_ANIMATED_PROPERTIES
44
45 inline SVGCursorElement::SVGCursorElement(const QualifiedName& tagName, Document& document)
46     : SVGElement(tagName, document)
47     , m_x(LengthModeWidth)
48     , m_y(LengthModeHeight)
49 {
50     ASSERT(hasTagName(SVGNames::cursorTag));
51     registerAnimatedPropertiesForSVGCursorElement();
52 }
53
54 Ref<SVGCursorElement> SVGCursorElement::create(const QualifiedName& tagName, Document& document)
55 {
56     return adoptRef(*new SVGCursorElement(tagName, document));
57 }
58
59 SVGCursorElement::~SVGCursorElement()
60 {
61     for (auto& client : m_clients)
62         client->cursorElementRemoved();
63 }
64
65 bool SVGCursorElement::isSupportedAttribute(const QualifiedName& attrName)
66 {
67     static NeverDestroyed<HashSet<QualifiedName>> supportedAttributes;
68     if (supportedAttributes.get().isEmpty()) {
69         SVGTests::addSupportedAttributes(supportedAttributes);
70         SVGExternalResourcesRequired::addSupportedAttributes(supportedAttributes);
71         SVGURIReference::addSupportedAttributes(supportedAttributes);
72         supportedAttributes.get().add(SVGNames::xAttr);
73         supportedAttributes.get().add(SVGNames::yAttr);
74     }
75     return supportedAttributes.get().contains<SVGAttributeHashTranslator>(attrName);
76 }
77
78 void SVGCursorElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
79 {
80     SVGParsingError parseError = NoError;
81
82     if (name == SVGNames::xAttr)
83         setXBaseValue(SVGLength::construct(LengthModeWidth, value, parseError));
84     else if (name == SVGNames::yAttr)
85         setYBaseValue(SVGLength::construct(LengthModeHeight, value, parseError));
86
87     reportAttributeParsingError(parseError, name, value);
88
89     SVGElement::parseAttribute(name, value);
90     SVGTests::parseAttribute(name, value);
91     SVGExternalResourcesRequired::parseAttribute(name, value);
92     SVGURIReference::parseAttribute(name, value);
93 }
94
95 void SVGCursorElement::addClient(SVGElement* element)
96 {
97     m_clients.add(element);
98     element->setCursorElement(this);
99 }
100
101 void SVGCursorElement::removeClient(SVGElement* element)
102 {
103     if (m_clients.remove(element))
104         element->cursorElementRemoved();
105 }
106
107 void SVGCursorElement::removeReferencedElement(SVGElement* element)
108 {
109     m_clients.remove(element);
110 }
111
112 void SVGCursorElement::svgAttributeChanged(const QualifiedName& attrName)
113 {
114     if (!isSupportedAttribute(attrName)) {
115         SVGElement::svgAttributeChanged(attrName);
116         return;
117     }
118
119     InstanceInvalidationGuard guard(*this);
120     for (auto& client : m_clients)
121         client->setNeedsStyleRecalc();
122 }
123
124 void SVGCursorElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const
125 {
126     SVGElement::addSubresourceAttributeURLs(urls);
127
128     addSubresourceURL(urls, document().completeURL(href()));
129 }
130
131 }