Use #pragma once in WebCore
[WebKit-https.git] / Source / WebCore / svg / SVGScriptElement.cpp
1 /*
2  * Copyright (C) 2004, 2005, 2008 Nikolas Zimmermann <zimmermann@kde.org>
3  * Copyright (C) 2004, 2005, 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 "SVGScriptElement.h"
23
24 #include "Document.h"
25 #include "Event.h"
26 #include "EventNames.h"
27 #include "HTMLNames.h"
28 #include "SVGAnimatedStaticPropertyTearOff.h"
29 #include "XLinkNames.h"
30
31 namespace WebCore {
32
33 // Animated property definitions
34 DEFINE_ANIMATED_STRING(SVGScriptElement, XLinkNames::hrefAttr, Href, href)
35 DEFINE_ANIMATED_BOOLEAN(SVGScriptElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
36
37 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGScriptElement)
38     REGISTER_LOCAL_ANIMATED_PROPERTY(href)
39     REGISTER_LOCAL_ANIMATED_PROPERTY(externalResourcesRequired)
40 END_REGISTER_ANIMATED_PROPERTIES
41
42 inline SVGScriptElement::SVGScriptElement(const QualifiedName& tagName, Document& document, bool wasInsertedByParser, bool alreadyStarted)
43     : SVGElement(tagName, document)
44     , ScriptElement(*this, wasInsertedByParser, alreadyStarted)
45     , m_svgLoadEventTimer(*this, &SVGElement::svgLoadEventTimerFired)
46 {
47     ASSERT(hasTagName(SVGNames::scriptTag));
48     registerAnimatedPropertiesForSVGScriptElement();
49 }
50
51 Ref<SVGScriptElement> SVGScriptElement::create(const QualifiedName& tagName, Document& document, bool insertedByParser)
52 {
53     return adoptRef(*new SVGScriptElement(tagName, document, insertedByParser, false));
54 }
55
56 void SVGScriptElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
57 {
58     SVGElement::parseAttribute(name, value);
59     SVGURIReference::parseAttribute(name, value);
60     SVGExternalResourcesRequired::parseAttribute(name, value);
61 }
62
63 void SVGScriptElement::svgAttributeChanged(const QualifiedName& attrName)
64 {
65     InstanceInvalidationGuard guard(*this);
66
67     if (SVGURIReference::isKnownAttribute(attrName)) {
68         handleSourceAttribute(href());
69         return;
70     }
71
72     SVGExternalResourcesRequired::handleAttributeChange(this, attrName);
73     SVGElement::svgAttributeChanged(attrName);
74 }
75
76 Node::InsertionNotificationRequest SVGScriptElement::insertedInto(ContainerNode& rootParent)
77 {
78     SVGElement::insertedInto(rootParent);
79     if (rootParent.inDocument())
80         SVGExternalResourcesRequired::insertedIntoDocument(this);
81     return shouldCallFinishedInsertingSubtree(rootParent) ? InsertionShouldCallFinishedInsertingSubtree : InsertionDone;
82 }
83
84 void SVGScriptElement::finishedInsertingSubtree()
85 {
86     ScriptElement::finishedInsertingSubtree();
87 }
88
89 void SVGScriptElement::childrenChanged(const ChildChange& change)
90 {
91     SVGElement::childrenChanged(change);
92     ScriptElement::childrenChanged();
93 }
94
95 bool SVGScriptElement::isURLAttribute(const Attribute& attribute) const
96 {
97     return attribute.name() == sourceAttributeValue();
98 }
99
100 void SVGScriptElement::finishParsingChildren()
101 {
102     SVGElement::finishParsingChildren();
103     SVGExternalResourcesRequired::finishParsingChildren();
104 }
105
106 void SVGScriptElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const
107 {
108     SVGElement::addSubresourceAttributeURLs(urls);
109
110     addSubresourceURL(urls, document().completeURL(href()));
111 }
112
113 String SVGScriptElement::sourceAttributeValue() const
114 {
115     return href();
116 }
117
118 String SVGScriptElement::charsetAttributeValue() const
119 {
120     return String();
121 }
122
123 String SVGScriptElement::typeAttributeValue() const
124 {
125     return getAttribute(SVGNames::typeAttr).string();
126 }
127
128 String SVGScriptElement::languageAttributeValue() const
129 {
130     return String();
131 }
132
133 String SVGScriptElement::forAttributeValue() const
134 {
135     return String();
136 }
137
138 String SVGScriptElement::eventAttributeValue() const
139 {
140     return String();
141 }
142
143 bool SVGScriptElement::asyncAttributeValue() const
144 {
145     return false;
146 }
147
148 bool SVGScriptElement::deferAttributeValue() const
149 {
150     return false;
151 }
152
153 bool SVGScriptElement::hasSourceAttribute() const
154 {
155     return hasAttribute(XLinkNames::hrefAttr);
156 }
157
158 Ref<Element> SVGScriptElement::cloneElementWithoutAttributesAndChildren(Document& targetDocument)
159 {
160     return adoptRef(*new SVGScriptElement(tagQName(), targetDocument, false, alreadyStarted()));
161 }
162
163 #ifndef NDEBUG
164 bool SVGScriptElement::filterOutAnimatableAttribute(const QualifiedName& name) const
165 {
166     return name == SVGNames::typeAttr;
167 }
168 #endif
169
170 }