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.html;
16
17 import java.util.Map;
18
19 import org.htmlunit.SgmlPage;
20 import org.htmlunit.css.ComputedCssStyleDeclaration;
21 import org.htmlunit.javascript.host.event.Event;
22
23 /**
24 * Wrapper for the HTML element "body".
25 *
26 * @author Mike Bowler
27 * @author David K. Taylor
28 * @author Christian Sell
29 * @author Ahmed Ashour
30 * @author Frank Danek
31 */
32 public class HtmlBody extends HtmlElement {
33
34 /** The HTML tag represented by this element. */
35 public static final String TAG_NAME = "body";
36
37 /** Whether or not this body is temporary (created because the <code>body</code> tag has not yet been parsed). */
38 private final boolean temporary_;
39
40 /**
41 * Creates a new instance.
42 *
43 * @param qualifiedName the qualified name of the element type to instantiate
44 * @param page the page that contains this element
45 * @param attributes the initial attributes
46 * @param temporary whether or not this body is temporary (created because the <code>body</code>
47 * tag does not exist or has not yet been parsed)
48 */
49 public HtmlBody(final String qualifiedName, final SgmlPage page,
50 final Map<String, DomAttr> attributes, final boolean temporary) {
51
52 super(qualifiedName, page, attributes);
53
54 temporary_ = temporary;
55 }
56
57 /**
58 * Returns the value of the attribute {@code onload}. Refer to the
59 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
60 * documentation for details on the use of this attribute.
61 *
62 * @return the value of the attribute {@code onload} or an empty string if that attribute isn't defined
63 */
64 public final String getOnLoadAttribute() {
65 return getAttributeDirect("onload");
66 }
67
68 /**
69 * Returns the value of the attribute {@code onunload}. Refer to the
70 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
71 * documentation for details on the use of this attribute.
72 *
73 * @return the value of the attribute {@code onunload} or an empty string if that attribute isn't defined
74 */
75 public final String getOnUnloadAttribute() {
76 return getAttributeDirect("onunload");
77 }
78
79 /**
80 * Returns the value of the attribute {@code background}. Refer to the
81 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
82 * documentation for details on the use of this attribute.
83 *
84 * @return the value of the attribute {@code background} or an empty string if that attribute isn't defined
85 */
86 public final String getBackgroundAttribute() {
87 return getAttributeDirect("background");
88 }
89
90 /**
91 * Returns the value of the attribute {@code bgcolor}. Refer to the
92 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
93 * documentation for details on the use of this attribute.
94 *
95 * @return the value of the attribute {@code bgcolor} or an empty string if that attribute isn't defined
96 */
97 public final String getBgcolorAttribute() {
98 return getAttributeDirect("bgcolor");
99 }
100
101 /**
102 * Returns the value of the attribute {@code text}. 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 text} or an empty string if that attribute isn't defined
107 */
108 public final String getTextAttribute() {
109 return getAttributeDirect("text");
110 }
111
112 /**
113 * Returns the value of the attribute {@code link}. Refer to the
114 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
115 * documentation for details on the use of this attribute.
116 *
117 * @return the value of the attribute {@code link} or an empty string if that attribute isn't defined
118 */
119 public final String getLinkAttribute() {
120 return getAttributeDirect("link");
121 }
122
123 /**
124 * Returns the value of the attribute {@code vlink}. Refer to the
125 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
126 * documentation for details on the use of this attribute.
127 *
128 * @return the value of the attribute {@code vlink} or an empty string if that attribute isn't defined
129 */
130 public final String getVlinkAttribute() {
131 return getAttributeDirect("vlink");
132 }
133
134 /**
135 * Returns the value of the attribute {@code alink}. Refer to the
136 * <a href="http://www.w3.org/TR/html401/">HTML 4.01</a>
137 * documentation for details on the use of this attribute.
138 *
139 * @return the value of the attribute {@code alink} or an empty string if that attribute isn't defined
140 */
141 public final String getAlinkAttribute() {
142 return getAttributeDirect("alink");
143 }
144
145 /**
146 * Returns {@code true} if this body is temporary (created because the <code>body</code> tag
147 * has not yet been parsed).
148 *
149 * @return {@code true} if this body is temporary (created because the <code>body</code> tag
150 * has not yet been parsed)
151 */
152 public final boolean isTemporary() {
153 return temporary_;
154 }
155
156 /**
157 * {@inheritDoc}
158 */
159 @Override
160 public boolean handles(final Event event) {
161 if (Event.TYPE_BLUR.equals(event.getType()) || Event.TYPE_FOCUS.equals(event.getType())) {
162 return true;
163 }
164 return super.handles(event);
165 }
166
167 /**
168 * {@inheritDoc}
169 */
170 @Override
171 @SuppressWarnings("PMD.AvoidDuplicateLiterals")
172 public void setDefaults(final ComputedCssStyleDeclaration style) {
173 style.setDefaultLocalStyleAttribute("margin-left", "8px");
174 style.setDefaultLocalStyleAttribute("margin-right", "8px");
175 style.setDefaultLocalStyleAttribute("margin-top", "8px");
176 style.setDefaultLocalStyleAttribute("margin-bottom", "8px");
177 }
178 }