Skip to content

Commit 2aa4fee

Browse files
committed
improved implementation of the hidden attribute setter
1 parent 0eedbca commit 2aa4fee

File tree

4 files changed

+211
-7
lines changed

4 files changed

+211
-7
lines changed

src/changes/changes.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@
88

99
<body>
1010
<release version="4.3.0" date="xxxx, 2024" description="Chrome/Edge 126, Firefox 127, Bugfixes">
11+
<action type="add" dev="rbri">
12+
Improved implementation of the hidden attribute setter.
13+
</action>
14+
<action type="fix" dev="rbri">
15+
core-js: another hack on the const handling (in most cases const no treated like let - this is not correct
16+
but avoids the 'constant redefinition' parser error).
17+
</action>
1118
<action type="add" dev="rbri">
1219
Sarissa 0.9.9.7 tests added.
1320
</action>

src/main/java/org/htmlunit/html/HtmlElement.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@ public String value() {
143143
protected static final String ATTRIBUTE_REQUIRED = "required";
144144
/** Constant 'checked'. */
145145
protected static final String ATTRIBUTE_CHECKED = "checked";
146+
/** Constant 'hidden'. */
147+
protected static final String ATTRIBUTE_HIDDEN = "hidden";
146148

147149
/** The listeners which are to be notified of attribute changes. */
148150
private final List<HtmlAttributeChangeListener> attributeListeners_ = new ArrayList<>();
@@ -1211,7 +1213,34 @@ private String getXPathToken() {
12111213
* @return true if the hidden attribute is set.
12121214
*/
12131215
public boolean isHidden() {
1214-
return ATTRIBUTE_NOT_DEFINED != getAttributeDirect("hidden");
1216+
return ATTRIBUTE_NOT_DEFINED != getAttributeDirect(ATTRIBUTE_HIDDEN);
1217+
}
1218+
1219+
/**
1220+
* Sets the {@code hidden} property.
1221+
* @param hidden the {@code hidden} property
1222+
*/
1223+
public void setHidden(final String hidden) {
1224+
if ("false".equalsIgnoreCase(hidden)) {
1225+
removeAttribute(ATTRIBUTE_HIDDEN);
1226+
}
1227+
1228+
if (StringUtils.isNotEmpty(hidden)) {
1229+
setAttribute(ATTRIBUTE_HIDDEN, "");
1230+
}
1231+
}
1232+
1233+
/**
1234+
* Sets the {@code hidden} property.
1235+
* @param hidden the {@code hidden} property
1236+
*/
1237+
public void setHidden(final boolean hidden) {
1238+
if (hidden) {
1239+
setAttribute("hidden", "");
1240+
return;
1241+
}
1242+
1243+
removeAttribute("hidden");
12151244
}
12161245

12171246
/**

src/main/java/org/htmlunit/javascript/host/html/HTMLElement.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1607,13 +1607,12 @@ public boolean isHidden() {
16071607
* @param hidden the {@code hidden} value
16081608
*/
16091609
@JsxSetter
1610-
public void setHidden(final boolean hidden) {
1611-
if (hidden) {
1612-
getDomNodeOrDie().setAttribute("hidden", "hidden");
1613-
}
1614-
else {
1615-
getDomNodeOrDie().removeAttribute("hidden");
1610+
public void setHidden(final Object hidden) {
1611+
if (hidden instanceof Boolean) {
1612+
getDomNodeOrDie().setHidden((Boolean) hidden);
1613+
return;
16161614
}
1615+
getDomNodeOrDie().setHidden(JavaScriptEngine.toString(hidden));
16171616
}
16181617

16191618
/**

src/test/java/org/htmlunit/javascript/host/html/HTMLElementTest.java

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5442,6 +5442,175 @@ public void hidden() throws Exception {
54425442
loadPageVerifyTitle2(html);
54435443
}
54445444

5445+
/**
5446+
* @throws Exception if an error occurs
5447+
*/
5448+
@Test
5449+
@Alerts(DEFAULT = {"1 null/false", "2 /true", "3 /true", "4 hidden/true", "5 true/true", "6 false/true",
5450+
"7 until-found/until-found", "8 show/true", "9 Until-Found/true", "10 HIDDEN/true"},
5451+
FF = {"1 null/false", "2 /true", "3 /true", "4 hidden/true", "5 true/true", "6 false/true",
5452+
"7 until-found/true", "8 show/true", "9 Until-Found/true", "10 HIDDEN/true"},
5453+
FF_ESR = {"1 null/false", "2 /true", "3 /true", "4 hidden/true", "5 true/true", "6 false/true",
5454+
"7 until-found/true", "8 show/true", "9 Until-Found/true", "10 HIDDEN/true"})
5455+
@HtmlUnitNYI(CHROME = {"1 null/false", "2 /true", "3 /true", "4 hidden/true", "5 true/true", "6 false/true",
5456+
"7 until-found/true", "8 show/true", "9 Until-Found/true", "10 HIDDEN/true"},
5457+
EDGE = {"1 null/false", "2 /true", "3 /true", "4 hidden/true", "5 true/true", "6 false/true",
5458+
"7 until-found/true", "8 show/true", "9 Until-Found/true", "10 HIDDEN/true"})
5459+
public void hiddenGet() throws Exception {
5460+
final String html
5461+
= "<html><body>\n"
5462+
+ "<p id='p1'>p1</p>\n"
5463+
+ "<p id='p2' hidden>p2</p>\n"
5464+
+ "<p id='p3' hidden=''>p3</p>\n"
5465+
+ "<p id='p4' hidden='hidden'>p4</p>\n"
5466+
+ "<p id='p5' hidden='true'>p5</p>\n"
5467+
+ "<p id='p6' hidden='false'>p6</p>\n"
5468+
+ "<p id='p7' hidden='until-found'>p7</p>\n"
5469+
+ "<p id='p8' hidden='show'>p8</p>\n"
5470+
5471+
+ "<p id='p9' hidden='Until-Found'>p9</p>\n"
5472+
+ "<p id='p10' hidden='HIDDEN'>p10</p>\n"
5473+
5474+
+ "<script>\n"
5475+
+ LOG_TITLE_FUNCTION
5476+
+ "var p1 = document.getElementById('p1');\n"
5477+
+ "var p2 = document.getElementById('p2');\n"
5478+
+ "var p3 = document.getElementById('p3');\n"
5479+
+ "var p4 = document.getElementById('p4');\n"
5480+
+ "var p5 = document.getElementById('p5');\n"
5481+
+ "var p6 = document.getElementById('p6');\n"
5482+
+ "var p7 = document.getElementById('p7');\n"
5483+
+ "var p8 = document.getElementById('p8');\n"
5484+
+ "var p9 = document.getElementById('p9');\n"
5485+
+ "var p10 = document.getElementById('p10');\n"
5486+
5487+
+ "log('1 ' + p1.getAttribute('hidden') + '/' + p1.hidden);\n"
5488+
+ "log('2 ' + p2.getAttribute('hidden') + '/' + p2.hidden);\n"
5489+
+ "log('3 ' + p3.getAttribute('hidden') + '/' + p3.hidden);\n"
5490+
+ "log('4 ' + p4.getAttribute('hidden') + '/' + p4.hidden);\n"
5491+
+ "log('5 ' + p5.getAttribute('hidden') + '/' + p5.hidden);\n"
5492+
+ "log('6 ' + p6.getAttribute('hidden') + '/' + p6.hidden);\n"
5493+
+ "log('7 ' + p7.getAttribute('hidden') + '/' + p7.hidden);\n"
5494+
+ "log('8 ' + p8.getAttribute('hidden') + '/' + p8.hidden);\n"
5495+
+ "log('9 ' + p9.getAttribute('hidden') + '/' + p9.hidden);\n"
5496+
+ "log('10 ' + p10.getAttribute('hidden') + '/' + p10.hidden);\n"
5497+
+ "</script>\n"
5498+
+ "</body></html>";
5499+
5500+
loadPageVerifyTitle2(html);
5501+
}
5502+
5503+
/**
5504+
* @throws Exception if an error occurs
5505+
*/
5506+
@Test
5507+
@Alerts(DEFAULT = {"1 null/false", "2 null/false", "3 /true", "4 /true", "5 null/false",
5508+
"6 null/false", "7 /true", "8 /true",
5509+
"9 null/false", "10 /true", "11 /true",
5510+
"12 null/false", "13 until-found/until-found",
5511+
"14 null/false", "15 until-found/until-found",
5512+
"16 null/false", "17 /true"},
5513+
FF = {"1 null/false", "2 null/false", "3 /true", "4 /true", "5 null/false",
5514+
"6 null/false", "7 /true", "8 /true",
5515+
"9 null/false", "10 /true", "11 /true",
5516+
"12 null/false", "13 /true",
5517+
"14 null/false", "15 /true",
5518+
"16 null/false", "17 /true"},
5519+
FF_ESR = {"1 null/false", "2 null/false", "3 /true", "4 /true", "5 null/false",
5520+
"6 null/false", "7 /true", "8 /true",
5521+
"9 null/false", "10 /true", "11 /true",
5522+
"12 null/false", "13 /true",
5523+
"14 null/false", "15 /true",
5524+
"16 null/false", "17 /true"})
5525+
@HtmlUnitNYI(CHROME = {"1 null/false", "2 null/false", "3 /true", "4 /true", "5 null/false",
5526+
"6 null/false", "7 /true", "8 /true",
5527+
"9 null/false", "10 /true", "11 /true",
5528+
"12 null/false", "13 /true",
5529+
"14 null/false", "15 /true",
5530+
"16 null/false", "17 /true"},
5531+
EDGE = {"1 null/false", "2 null/false", "3 /true", "4 /true", "5 null/false",
5532+
"6 null/false", "7 /true", "8 /true",
5533+
"9 null/false", "10 /true", "11 /true",
5534+
"12 null/false", "13 /true",
5535+
"14 null/false", "15 /true",
5536+
"16 null/false", "17 /true"})
5537+
public void hiddenSet() throws Exception {
5538+
final String html
5539+
= "<html><body>\n"
5540+
+ "<p id='p1'>p1</p>\n"
5541+
+ "<p id='p2'>p2</p>\n"
5542+
+ "<p id='p3'>p3</p>\n"
5543+
+ "<p id='p4'>p4</p>\n"
5544+
+ "<p id='p5'>p5</p>\n"
5545+
+ "<p id='p6'>p6</p>\n"
5546+
5547+
+ "<script>\n"
5548+
+ LOG_TITLE_FUNCTION
5549+
+ "function set(p, value) {\n"
5550+
+ " try {\n"
5551+
+ " p.hidden = value;\n"
5552+
+ " } catch(e) {\n"
5553+
+ " log('!');\n"
5554+
+ " }\n"
5555+
+ "}\n"
5556+
+ "var p1 = document.getElementById('p1');\n"
5557+
+ "var p2 = document.getElementById('p2');\n"
5558+
+ "var p3 = document.getElementById('p3');\n"
5559+
+ "var p4 = document.getElementById('p4');\n"
5560+
+ "var p5 = document.getElementById('p5');\n"
5561+
+ "var p6 = document.getElementById('p6');\n"
5562+
5563+
+ "log('1 ' + p1.getAttribute('hidden') + '/' + p1.hidden);\n"
5564+
5565+
+ "set(p1, '');\n"
5566+
+ "log('2 ' + p1.getAttribute('hidden') + '/' + p1.hidden);\n"
5567+
5568+
+ "set(p1, 'hidden');\n"
5569+
+ "log('3 ' + p1.getAttribute('hidden') + '/' + p1.hidden);\n"
5570+
5571+
+ "set(p1, 'false');\n"
5572+
+ "log('4 ' + p1.getAttribute('hidden') + '/' + p1.hidden);\n"
5573+
5574+
+ "set(p1, false);\n"
5575+
+ "log('5 ' + p1.getAttribute('hidden') + '/' + p1.hidden);\n"
5576+
5577+
// p2
5578+
+ "log('6 ' + p2.getAttribute('hidden') + '/' + p2.hidden);\n"
5579+
+ "set(p2, 'true');\n"
5580+
+ "log('7 ' + p2.getAttribute('hidden') + '/' + p2.hidden);\n"
5581+
5582+
+ "set(p2, 'show');\n"
5583+
+ "log('8 ' + p2.getAttribute('hidden') + '/' + p2.hidden);\n"
5584+
5585+
// p3
5586+
+ "log('9 ' + p3.getAttribute('hidden') + '/' + p3.hidden);\n"
5587+
+ "set(p3, true);\n"
5588+
+ "log('10 ' + p3.getAttribute('hidden') + '/' + p3.hidden);\n"
5589+
5590+
+ "set(p3, 'show');\n"
5591+
+ "log('11 ' + p3.getAttribute('hidden') + '/' + p3.hidden);\n"
5592+
5593+
// p4
5594+
+ "log('12 ' + p4.getAttribute('hidden') + '/' + p4.hidden);\n"
5595+
+ "set(p4, 'until-found');\n"
5596+
+ "log('13 ' + p4.getAttribute('hidden') + '/' + p4.hidden);\n"
5597+
5598+
// p5
5599+
+ "log('14 ' + p5.getAttribute('hidden') + '/' + p5.hidden);\n"
5600+
+ "set(p5, 'Until-Found');\n"
5601+
+ "log('15 ' + p5.getAttribute('hidden') + '/' + p5.hidden);\n"
5602+
5603+
// p6
5604+
+ "log('16 ' + p6.getAttribute('hidden') + '/' + p6.hidden);\n"
5605+
+ "set(p6, 'HIDDEN');\n"
5606+
+ "log('17 ' + p6.getAttribute('hidden') + '/' + p6.hidden);\n"
5607+
5608+
+ "</script>\n"
5609+
+ "</body></html>";
5610+
5611+
loadPageVerifyTitle2(html);
5612+
}
5613+
54455614
/**
54465615
* @throws Exception if the test fails
54475616
*/

0 commit comments

Comments
 (0)