Rename Node::childNodeCount() to countChildNodes() and avoid inefficient uses
[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 "Text.h"
32 #include <wtf/Ref.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, bool alreadyStarted)
46 {
47     return adoptRef(new HTMLScriptElement(tagName, document, wasInsertedByParser, alreadyStarted));
48 }
49
50 bool HTMLScriptElement::isURLAttribute(const Attribute& attribute) const
51 {
52     return attribute.name() == srcAttr || HTMLElement::isURLAttribute(attribute);
53 }
54
55 void HTMLScriptElement::childrenChanged(const ChildChange& change)
56 {
57     HTMLElement::childrenChanged(change);
58     ScriptElement::childrenChanged();
59 }
60
61 void HTMLScriptElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
62 {
63     if (name == srcAttr)
64         handleSourceAttribute(value);
65     else if (name == asyncAttr)
66         handleAsyncAttribute();
67     else if (name == onbeforeloadAttr)
68         setAttributeEventListener(eventNames().beforeloadEvent, name, value);
69     else
70         HTMLElement::parseAttribute(name, value);
71 }
72
73 Node::InsertionNotificationRequest HTMLScriptElement::insertedInto(ContainerNode& insertionPoint)
74 {
75     HTMLElement::insertedInto(insertionPoint);
76     ScriptElement::insertedInto(insertionPoint);
77     return InsertionDone;
78 }
79
80 void HTMLScriptElement::setText(const String &value)
81 {
82     Ref<HTMLScriptElement> protectFromMutationEvents(*this);
83
84     if (hasOneChild() && firstChild()->isTextNode()) {
85         toText(firstChild())->setData(value, IGNORE_EXCEPTION);
86         return;
87     }
88
89     if (hasChildNodes())
90         removeChildren();
91
92     appendChild(document().createTextNode(value.impl()), IGNORE_EXCEPTION);
93 }
94
95 void HTMLScriptElement::setAsync(bool async)
96 {
97     setBooleanAttribute(asyncAttr, async);
98     handleAsyncAttribute();
99 }
100
101 bool HTMLScriptElement::async() const
102 {
103     return fastHasAttribute(asyncAttr) || forceAsync();
104 }
105
106 URL HTMLScriptElement::src() const
107 {
108     return document().completeURL(sourceAttributeValue());
109 }
110
111 void HTMLScriptElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const
112 {
113     HTMLElement::addSubresourceAttributeURLs(urls);
114
115     addSubresourceURL(urls, src());
116 }
117
118 String HTMLScriptElement::sourceAttributeValue() const
119 {
120     return getAttribute(srcAttr).string();
121 }
122
123 String HTMLScriptElement::charsetAttributeValue() const
124 {
125     return getAttribute(charsetAttr).string();
126 }
127
128 String HTMLScriptElement::typeAttributeValue() const
129 {
130     return getAttribute(typeAttr).string();
131 }
132
133 String HTMLScriptElement::languageAttributeValue() const
134 {
135     return getAttribute(languageAttr).string();
136 }
137
138 String HTMLScriptElement::forAttributeValue() const
139 {
140     return getAttribute(forAttr).string();
141 }
142
143 String HTMLScriptElement::eventAttributeValue() const
144 {
145     return getAttribute(eventAttr).string();
146 }
147
148 bool HTMLScriptElement::asyncAttributeValue() const
149 {
150     return fastHasAttribute(asyncAttr);
151 }
152
153 bool HTMLScriptElement::deferAttributeValue() const
154 {
155     return fastHasAttribute(deferAttr);
156 }
157
158 bool HTMLScriptElement::hasSourceAttribute() const
159 {
160     return fastHasAttribute(srcAttr);
161 }
162
163 void HTMLScriptElement::dispatchLoadEvent()
164 {
165     ASSERT(!haveFiredLoadEvent());
166     setHaveFiredLoadEvent(true);
167
168     dispatchEvent(Event::create(eventNames().loadEvent, false, false));
169 }
170
171 PassRefPtr<Element> HTMLScriptElement::cloneElementWithoutAttributesAndChildren()
172 {
173     return adoptRef(new HTMLScriptElement(tagQName(), document(), false, alreadyStarted()));
174 }
175
176 }