Node: removedFrom() and insertedInto() should use references.
[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     int numChildren = childNodeCount();
85
86     if (numChildren == 1 && firstChild()->isTextNode()) {
87         toText(firstChild())->setData(value, IGNORE_EXCEPTION);
88         return;
89     }
90
91     if (numChildren > 0)
92         removeChildren();
93
94     appendChild(document().createTextNode(value.impl()), IGNORE_EXCEPTION);
95 }
96
97 void HTMLScriptElement::setAsync(bool async)
98 {
99     setBooleanAttribute(asyncAttr, async);
100     handleAsyncAttribute();
101 }
102
103 bool HTMLScriptElement::async() const
104 {
105     return fastHasAttribute(asyncAttr) || forceAsync();
106 }
107
108 URL HTMLScriptElement::src() const
109 {
110     return document().completeURL(sourceAttributeValue());
111 }
112
113 void HTMLScriptElement::addSubresourceAttributeURLs(ListHashSet<URL>& urls) const
114 {
115     HTMLElement::addSubresourceAttributeURLs(urls);
116
117     addSubresourceURL(urls, src());
118 }
119
120 String HTMLScriptElement::sourceAttributeValue() const
121 {
122     return getAttribute(srcAttr).string();
123 }
124
125 String HTMLScriptElement::charsetAttributeValue() const
126 {
127     return getAttribute(charsetAttr).string();
128 }
129
130 String HTMLScriptElement::typeAttributeValue() const
131 {
132     return getAttribute(typeAttr).string();
133 }
134
135 String HTMLScriptElement::languageAttributeValue() const
136 {
137     return getAttribute(languageAttr).string();
138 }
139
140 String HTMLScriptElement::forAttributeValue() const
141 {
142     return getAttribute(forAttr).string();
143 }
144
145 String HTMLScriptElement::eventAttributeValue() const
146 {
147     return getAttribute(eventAttr).string();
148 }
149
150 bool HTMLScriptElement::asyncAttributeValue() const
151 {
152     return fastHasAttribute(asyncAttr);
153 }
154
155 bool HTMLScriptElement::deferAttributeValue() const
156 {
157     return fastHasAttribute(deferAttr);
158 }
159
160 bool HTMLScriptElement::hasSourceAttribute() const
161 {
162     return fastHasAttribute(srcAttr);
163 }
164
165 void HTMLScriptElement::dispatchLoadEvent()
166 {
167     ASSERT(!haveFiredLoadEvent());
168     setHaveFiredLoadEvent(true);
169
170     dispatchEvent(Event::create(eventNames().loadEvent, false, false));
171 }
172
173 PassRefPtr<Element> HTMLScriptElement::cloneElementWithoutAttributesAndChildren()
174 {
175     return adoptRef(new HTMLScriptElement(tagQName(), document(), false, alreadyStarted()));
176 }
177
178 }