1 /*
2 * Copyright (c) 2002-2025 Gargoyle Software Inc.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 * https://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 package org.htmlunit.svg;
16
17 import java.util.Map;
18
19 import org.htmlunit.SgmlPage;
20 import org.htmlunit.html.DomAttr;
21 import org.htmlunit.html.ScriptElement;
22 import org.htmlunit.html.ScriptElementSupport;
23 import org.htmlunit.util.StringUtils;
24
25 /**
26 * Wrapper for the SVG element {@code script}.
27 *
28 * @author Ahmed Ashour
29 */
30 public class SvgScript extends SvgElement implements ScriptElement {
31
32 /** The tag represented by this element. */
33 public static final String TAG_NAME = "script";
34 private boolean executed_;
35 private boolean createdByDomParser_;
36
37 /**
38 * Creates a new instance.
39 *
40 * @param namespaceURI the URI that identifies an XML namespace
41 * @param qualifiedName the qualified name of the element type to instantiate
42 * @param page the page that contains this element
43 * @param attributes the initial attributes
44 */
45 SvgScript(final String namespaceURI, final String qualifiedName, final SgmlPage page,
46 final Map<String, DomAttr> attributes) {
47 super(namespaceURI, qualifiedName, page, attributes);
48 }
49
50 /**
51 * {@inheritDoc}
52 */
53 @Override
54 public boolean isExecuted() {
55 return executed_;
56 }
57
58 /**
59 * {@inheritDoc}
60 */
61 @Override
62 public void setExecuted(final boolean executed) {
63 executed_ = executed;
64 }
65
66 /**
67 * Returns the value of the attribute {@code src}. Refer to the
68 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
69 * documentation for details on the use of this attribute.
70 *
71 * @return the value of the attribute {@code src}
72 * or an empty string if that attribute isn't defined.
73 */
74 public final String getSrcAttribute() {
75 return getSrcAttributeNormalized();
76 }
77
78 /**
79 * {@inheritDoc}
80 */
81 @Override
82 public final String getScriptSource() {
83 return getSrcAttributeNormalized();
84 }
85
86 /**
87 * Helper for src retrieval and normalization.
88 *
89 * @return the value of the attribute {@code src} with all line breaks removed
90 * or an empty string if that attribute isn't defined.
91 */
92 protected final String getSrcAttributeNormalized() {
93 final String attrib = getAttributeDirect(SRC_ATTRIBUTE);
94 if (ATTRIBUTE_NOT_DEFINED == attrib) {
95 return attrib;
96 }
97
98 return StringUtils.replaceChars(attrib, "\r\n", "");
99 }
100
101 /**
102 * Returns the value of the attribute {@code charset}. Refer to the
103 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
104 * documentation for details on the use of this attribute.
105 *
106 * @return the value of the attribute {@code charset}
107 * or an empty string if that attribute isn't defined.
108 */
109 public final String getCharsetAttribute() {
110 return getAttributeDirect("charset");
111 }
112
113 /**
114 * {@inheritDoc}
115 */
116 @Override
117 public final String getScriptCharset() {
118 return getAttributeDirect("charset");
119 }
120
121 /**
122 * Returns the value of the attribute {@code defer}. Refer to the
123 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
124 * documentation for details on the use of this attribute.
125 *
126 * @return the value of the attribute {@code defer}
127 * or an empty string if that attribute isn't defined.
128 */
129 public final String getDeferAttribute() {
130 return getAttributeDirect("defer");
131 }
132
133 /**
134 * {@inheritDoc}
135 */
136 @Override
137 public boolean isDeferred() {
138 return ATTRIBUTE_NOT_DEFINED != getDeferAttribute();
139 }
140
141 /**
142 * Executes the <code>onreadystatechange</code> handler as well as executing
143 * the script itself, if necessary. {@inheritDoc}
144 */
145 @Override
146 public void onAllChildrenAddedToPage(final boolean postponed) {
147 ScriptElementSupport.onAllChildrenAddedToPage(this, postponed);
148 }
149
150 /**
151 * {@inheritDoc}
152 */
153 @Override
154 public void markAsCreatedByDomParser() {
155 createdByDomParser_ = true;
156 }
157
158 /**
159 * {@inheritDoc}
160 */
161 @Override
162 public boolean wasCreatedByDomParser() {
163 return createdByDomParser_;
164 }
165 }