REGRESSION(r160389): SVG test assertion extravaganza.
[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
23 #if ENABLE(SVG)
24 #include "SVGScriptElement.h"
25
26 #include "Attribute.h"
27 #include "Document.h"
28 #include "Event.h"
29 #include "EventNames.h"
30 #include "HTMLNames.h"
31 #include "SVGAnimatedStaticPropertyTearOff.h"
32 #include "SVGElementInstance.h"
33 #include "XLinkNames.h"
34
35 namespace WebCore {
36
37 // Animated property definitions
38 DEFINE_ANIMATED_STRING(SVGScriptElement, XLinkNames::hrefAttr, Href, href)
39 DEFINE_ANIMATED_BOOLEAN(SVGScriptElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
40
41 BEGIN_REGISTER_ANIMATED_PROPERTIES(SVGScriptElement)
42     REGISTER_LOCAL_ANIMATED_PROPERTY(href)
43     REGISTER_LOCAL_ANIMATED_PROPERTY(externalResourcesRequired)
44 END_REGISTER_ANIMATED_PROPERTIES
45
46 inline SVGScriptElement::SVGScriptElement(const QualifiedName& tagName, Document& document, bool wasInsertedByParser, bool alreadyStarted)
47     : SVGElement(tagName, document)
48     , ScriptElement(this, wasInsertedByParser, alreadyStarted)
49     , m_svgLoadEventTimer(this, &SVGElement::svgLoadEventTimerFired)
50 {
51     ASSERT(hasTagName(SVGNames::scriptTag));
52     registerAnimatedPropertiesForSVGScriptElement();
53 }
54
55 PassRefPtr<SVGScriptElement> SVGScriptElement::create(const QualifiedName& tagName, Document& document, bool insertedByParser)
56 {
57     return adoptRef(new SVGScriptElement(tagName, document, insertedByParser, false));
58 }
59
60 bool SVGScriptElement::isSupportedAttribute(const QualifiedName& attrName)
61 {
62     DEFINE_STATIC_LOCAL(HashSet<QualifiedName>, supportedAttributes, ());
63     if (supportedAttributes.isEmpty()) {
64         SVGURIReference::addSupportedAttributes(supportedAttributes);
65         SVGExternalResourcesRequired::addSupportedAttributes(supportedAttributes);
66         supportedAttributes.add(SVGNames::typeAttr);
67         supportedAttributes.add(HTMLNames::onerrorAttr);
68     }
69     return supportedAttributes.contains<SVGAttributeHashTranslator>(attrName);
70 }
71
72 void SVGScriptElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
73 {
74     if (!isSupportedAttribute(name)) {
75         SVGElement::parseAttribute(name, value);
76         return;
77     }
78
79     if (name == SVGNames::typeAttr)
80         return;
81
82     if (name == HTMLNames::onerrorAttr) {
83         setAttributeEventListener(eventNames().errorEvent, name, value);
84         return;
85     }
86
87     if (SVGURIReference::parseAttribute(name, value))
88         return;
89     if (SVGExternalResourcesRequired::parseAttribute(name, value))
90         return;
91
92     ASSERT_NOT_REACHED();
93 }
94
95 void SVGScriptElement::svgAttributeChanged(const QualifiedName& attrName)
96 {
97     if (!isSupportedAttribute(attrName)) {
98         SVGElement::svgAttributeChanged(attrName);
99         return;
100     }
101
102     SVGElementInstance::InvalidationGuard invalidationGuard(this);
103
104     if (attrName == SVGNames::typeAttr || attrName == HTMLNames::onerrorAttr)
105         return;
106
107     if (SVGURIReference::isKnownAttribute(attrName)) {
108         handleSourceAttribute(href());
109         return;
110     }
111
112     if (SVGExternalResourcesRequired::handleAttributeChange(this, attrName))
113         return;
114
115     ASSERT_NOT_REACHED();
116 }
117
118 Node::InsertionNotificationRequest SVGScriptElement::insertedInto(ContainerNode& rootParent)
119 {
120     SVGElement::insertedInto(rootParent);
121     ScriptElement::insertedInto(rootParent);
122     if (rootParent.inDocument())
123         SVGExternalResourcesRequired::insertedIntoDocument(this);
124     return InsertionDone;
125 }
126
127 void SVGScriptElement::childrenChanged(const ChildChange& change)
128 {
129     SVGElement::childrenChanged(change);
130     ScriptElement::childrenChanged();
131 }
132
133 bool SVGScriptElement::isURLAttribute(const Attribute& attribute) const
134 {
135     return attribute.name() == sourceAttributeValue();
136 }
137
138 void SVGScriptElement::finishParsingChildren()
139 {
140     SVGElement::finishParsingChildren();
141     SVGExternalResourcesRequired::finishParsingChildren();
142 }
143
144 void SVGScriptElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const
145 {
146     SVGElement::addSubresourceAttributeURLs(urls);
147
148     addSubresourceURL(urls, document().completeURL(href()));
149 }
150
151 String SVGScriptElement::sourceAttributeValue() const
152 {
153     return href();
154 }
155
156 String SVGScriptElement::charsetAttributeValue() const
157 {
158     return String();
159 }
160
161 String SVGScriptElement::typeAttributeValue() const
162 {
163     return getAttribute(SVGNames::typeAttr).string();
164 }
165
166 String SVGScriptElement::languageAttributeValue() const
167 {
168     return String();
169 }
170
171 String SVGScriptElement::forAttributeValue() const
172 {
173     return String();
174 }
175
176 String SVGScriptElement::eventAttributeValue() const
177 {
178     return String();
179 }
180
181 bool SVGScriptElement::asyncAttributeValue() const
182 {
183     return false;
184 }
185
186 bool SVGScriptElement::deferAttributeValue() const
187 {
188     return false;
189 }
190
191 bool SVGScriptElement::hasSourceAttribute() const
192 {
193     return hasAttribute(XLinkNames::hrefAttr);
194 }
195
196 PassRefPtr<Element> SVGScriptElement::cloneElementWithoutAttributesAndChildren()
197 {
198     return adoptRef(new SVGScriptElement(tagQName(), document(), false, alreadyStarted()));
199 }
200
201 }
202
203 #endif // ENABLE(SVG)