1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.html;
16
17 import java.io.PrintWriter;
18 import java.io.StringWriter;
19 import java.util.Map;
20
21 import org.htmlunit.SgmlPage;
22 import org.htmlunit.javascript.AbstractJavaScriptEngine;
23 import org.htmlunit.javascript.PostponedAction;
24 import org.htmlunit.javascript.host.dom.Document;
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 public class HtmlScript extends HtmlElement implements ScriptElement {
50
51
52 public static final String TAG_NAME = "script";
53
54 private boolean executed_;
55 private boolean createdByDomParser_;
56
57
58
59
60
61
62
63
64 HtmlScript(final String qualifiedName, final SgmlPage page,
65 final Map<String, DomAttr> attributes) {
66 super(qualifiedName, page, attributes);
67 }
68
69
70
71
72
73
74
75
76
77 public final String getCharsetAttribute() {
78 return getAttributeDirect("charset");
79 }
80
81
82
83
84 @Override
85 public final String getScriptCharset() {
86 return getAttributeDirect("charset");
87 }
88
89
90
91
92
93
94
95
96
97 public final String getTypeAttribute() {
98 return getAttributeDirect(TYPE_ATTRIBUTE);
99 }
100
101
102
103
104
105
106
107
108
109 public final String getLanguageAttribute() {
110 return getAttributeDirect("language");
111 }
112
113
114
115
116
117
118
119
120
121 public final String getSrcAttribute() {
122 return getSrcAttributeNormalized();
123 }
124
125
126
127
128 @Override
129 public final String getScriptSource() {
130 return getSrcAttributeNormalized();
131 }
132
133
134
135
136
137 public final String getEventAttribute() {
138 return getAttributeDirect("event");
139 }
140
141
142
143
144
145 public final String getHtmlForAttribute() {
146 return getAttributeDirect("for");
147 }
148
149
150
151
152
153
154
155
156
157 public final String getDeferAttribute() {
158 return getAttributeDirect("defer");
159 }
160
161
162
163
164 @Override
165 public boolean isDeferred() {
166 return getDeferAttribute() != ATTRIBUTE_NOT_DEFINED;
167 }
168
169
170
171
172 @Override
173 public boolean mayBeDisplayed() {
174 return false;
175 }
176
177
178
179
180
181 @Override
182 protected void setAttributeNS(final String namespaceURI, final String qualifiedName, final String attributeValue,
183 final boolean notifyAttributeChangeListeners, final boolean notifyMutationObservers) {
184 final String qualifiedNameLC = org.htmlunit.util.StringUtils.toRootLowerCase(qualifiedName);
185
186 if (namespaceURI != null || !SRC_ATTRIBUTE.equals(qualifiedNameLC)) {
187 super.setAttributeNS(namespaceURI, qualifiedNameLC, attributeValue, notifyAttributeChangeListeners,
188 notifyMutationObservers);
189 return;
190 }
191
192
193 final String oldValue = getAttribute(qualifiedNameLC);
194 super.setAttributeNS(null, qualifiedNameLC, attributeValue, notifyAttributeChangeListeners,
195 notifyMutationObservers);
196
197 if (isAttachedToPage() && oldValue.isEmpty() && getFirstChild() == null) {
198 final PostponedAction action = new PostponedAction(getPage(), "HtmlScript.setAttributeNS") {
199 @Override
200 public void execute() {
201 ScriptElementSupport.executeScriptIfNeeded(HtmlScript.this, false, false);
202 }
203 };
204 final AbstractJavaScriptEngine<?> engine = getPage().getWebClient().getJavaScriptEngine();
205 engine.addPostponedAction(action);
206 }
207 }
208
209
210
211
212
213
214 @Override
215 public void onAllChildrenAddedToPage(final boolean postponed) {
216 ScriptElementSupport.onAllChildrenAddedToPage(this, postponed);
217 }
218
219
220
221
222 private String getScriptCode() {
223 final Iterable<DomNode> textNodes = getChildren();
224 final StringBuilder scriptCode = new StringBuilder();
225 for (final DomNode node : textNodes) {
226 if (node instanceof DomText) {
227 final DomText domText = (DomText) node;
228 scriptCode.append(domText.getData());
229 }
230 }
231 return scriptCode.toString();
232 }
233
234
235
236
237
238
239 @Override
240 protected boolean isEmptyXmlTagExpanded() {
241 return true;
242 }
243
244
245
246
247 @Override
248 protected void printChildrenAsXml(final String indent, final PrintWriter printWriter) {
249 final DomCharacterData textNode = (DomCharacterData) getFirstChild();
250 if (textNode == null) {
251 return;
252 }
253
254 final String data = textNode.getData();
255 if (data.contains("//<![CDATA[")) {
256 printWriter.print(data);
257 printWriter.print("\r\n");
258 }
259 else {
260 printWriter.print("//<![CDATA[");
261 printWriter.print("\r\n");
262 printWriter.print(data);
263 printWriter.print("\r\n");
264 printWriter.print("//]]>");
265 printWriter.print("\r\n");
266 }
267 }
268
269
270
271
272
273
274
275 public void resetExecuted() {
276 executed_ = false;
277 }
278
279 @Override
280 public void processImportNode(final Document doc) {
281 super.processImportNode(doc);
282
283 executed_ = true;
284 }
285
286
287
288
289
290 @Override
291 public String toString() {
292 final StringWriter writer = new StringWriter();
293 final PrintWriter printWriter = new PrintWriter(writer);
294
295 printWriter.print(getClass().getSimpleName());
296 printWriter.print("[<");
297 printOpeningTagContentAsXml(printWriter);
298 printWriter.print(">");
299 printWriter.print(getScriptCode());
300 printWriter.print("]");
301 printWriter.flush();
302 return writer.toString();
303 }
304
305
306
307
308 @Override
309 public DisplayStyle getDefaultStyleDisplay() {
310 return DisplayStyle.NONE;
311 }
312
313
314
315
316 @Override
317 public void markAsCreatedByDomParser() {
318 createdByDomParser_ = true;
319 }
320
321
322
323
324 @Override
325 public boolean wasCreatedByDomParser() {
326 return createdByDomParser_;
327 }
328
329
330
331
332 @Override
333 public boolean isExecuted() {
334 return executed_;
335 }
336
337
338
339
340 @Override
341 public void setExecuted(final boolean executed) {
342 executed_ = executed;
343 }
344 }