4693e816773404c6b9385f69f887723da8ff39c0
[WebKit-https.git] / Source / WebCore / html / HTMLScriptElement.cpp
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  *           (C) 2001 Dirk Mueller (mueller@kde.org)
5  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #include "config.h"
24 #include "HTMLScriptElement.h"
25
26 #include "Attribute.h"
27 #include "Document.h"
28 #include "Event.h"
29 #include "EventNames.h"
30 #include "HTMLNames.h"
31 #include "ScriptEventListener.h"
32 #include "Text.h"
33
34 namespace WebCore {
35
36 using namespace HTMLNames;
37
38 inline HTMLScriptElement::HTMLScriptElement(const QualifiedName& tagName, Document* document, bool wasInsertedByParser, bool alreadyStarted)
39     : HTMLElement(tagName, document)
40     , ScriptElement(this, wasInsertedByParser, alreadyStarted)
41 {
42     ASSERT(hasTagName(scriptTag));
43 }
44
45 PassRefPtr<HTMLScriptElement> HTMLScriptElement::create(const QualifiedName& tagName, Document* document, bool wasInsertedByParser)
46 {
47     return adoptRef(new HTMLScriptElement(tagName, document, wasInsertedByParser, false));
48 }
49
50 bool HTMLScriptElement::isURLAttribute(Attribute* attr) const
51 {
52     return attr->name() == srcAttr || HTMLElement::isURLAttribute(attr);
53 }
54
55 void HTMLScriptElement::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
56 {
57     ScriptElement::childrenChanged();
58     HTMLElement::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
59 }
60
61 void HTMLScriptElement::attributeChanged(Attribute* attr)
62 {
63     if (attr->name() == asyncAttr)
64         handleAsyncAttribute();
65     HTMLElement::attributeChanged(attr);
66 }
67
68 void HTMLScriptElement::parseAttribute(Attribute* attr)
69 {
70     const QualifiedName& attrName = attr->name();
71
72     if (attrName == srcAttr)
73         handleSourceAttribute(attr->value());
74     else if (attrName == onloadAttr)
75         setAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(this, attr));
76     else if (attrName == onbeforeloadAttr)
77         setAttributeEventListener(eventNames().beforeloadEvent, createAttributeEventListener(this, attr));
78     else
79         HTMLElement::parseAttribute(attr);
80 }
81
82 void HTMLScriptElement::insertedIntoDocument()
83 {
84     HTMLElement::insertedIntoDocument();
85     ScriptElement::insertedIntoDocument();
86 }
87
88 void HTMLScriptElement::setText(const String &value)
89 {
90     ExceptionCode ec = 0;
91     int numChildren = childNodeCount();
92
93     if (numChildren == 1 && firstChild()->isTextNode()) {
94         toText(firstChild())->setData(value, ec);
95         return;
96     }
97
98     if (numChildren > 0)
99         removeChildren();
100
101     appendChild(document()->createTextNode(value.impl()), ec);
102 }
103
104 void HTMLScriptElement::setAsync(bool async)
105 {
106     setBooleanAttribute(asyncAttr, async);
107     handleAsyncAttribute();
108 }
109
110 bool HTMLScriptElement::async() const
111 {
112     return fastHasAttribute(asyncAttr) || forceAsync();
113 }
114
115 KURL HTMLScriptElement::src() const
116 {
117     return document()->completeURL(sourceAttributeValue());
118 }
119
120 void HTMLScriptElement::addSubresourceAttributeURLs(ListHashSet<KURL>& urls) const
121 {
122     HTMLElement::addSubresourceAttributeURLs(urls);
123
124     addSubresourceURL(urls, src());
125 }
126
127 String HTMLScriptElement::sourceAttributeValue() const
128 {
129     return getAttribute(srcAttr).string();
130 }
131
132 String HTMLScriptElement::charsetAttributeValue() const
133 {
134     return getAttribute(charsetAttr).string();
135 }
136
137 String HTMLScriptElement::typeAttributeValue() const
138 {
139     return getAttribute(typeAttr).string();
140 }
141
142 String HTMLScriptElement::languageAttributeValue() const
143 {
144     return getAttribute(languageAttr).string();
145 }
146
147 String HTMLScriptElement::forAttributeValue() const
148 {
149     return getAttribute(forAttr).string();
150 }
151
152 String HTMLScriptElement::eventAttributeValue() const
153 {
154     return getAttribute(eventAttr).string();
155 }
156
157 bool HTMLScriptElement::asyncAttributeValue() const
158 {
159     return fastHasAttribute(asyncAttr);
160 }
161
162 bool HTMLScriptElement::deferAttributeValue() const
163 {
164     return fastHasAttribute(deferAttr);
165 }
166
167 bool HTMLScriptElement::hasSourceAttribute() const
168 {
169     return fastHasAttribute(srcAttr);
170 }
171
172 void HTMLScriptElement::dispatchLoadEvent()
173 {
174     ASSERT(!haveFiredLoadEvent());
175     setHaveFiredLoadEvent(true);
176
177     dispatchEvent(Event::create(eventNames().loadEvent, false, false));
178 }
179
180 PassRefPtr<Element> HTMLScriptElement::cloneElementWithoutAttributesAndChildren()
181 {
182     return adoptRef(new HTMLScriptElement(tagQName(), document(), false, alreadyStarted()));
183 }
184
185 }