Skip to content

Commit 4ed1b1a

Browse files
committed
url/anchor hostname setter handling got some fixes
1 parent 6d31076 commit 4ed1b1a

5 files changed

Lines changed: 172 additions & 33 deletions

File tree

src/main/java/org/htmlunit/BrowserVersionFeatures.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,6 @@ public enum BrowserVersionFeatures {
168168
@BrowserFeature({FF, FF_ESR})
169169
HTTP_HEADER_PRIORITY,
170170

171-
/** The anchor hostname setter ignores blank url's. */
172-
@BrowserFeature({FF, FF_ESR})
173-
JS_ANCHOR_HOSTNAME_IGNORE_BLANK,
174-
175171
/**
176172
* The anchor pathname detects url's starting with one letter as file url's
177173
* and replaces them with the file protocol. */

src/main/java/org/htmlunit/javascript/host/URL.java

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
*/
1515
package org.htmlunit.javascript.host;
1616

17-
import static org.htmlunit.BrowserVersionFeatures.JS_ANCHOR_HOSTNAME_IGNORE_BLANK;
18-
1917
import java.net.MalformedURLException;
2018
import java.util.List;
2119
import java.util.UUID;
@@ -259,15 +257,28 @@ public String getHostname() {
259257
* @throws MalformedURLException if the resulting URL is malformed
260258
*/
261259
@JsxSetter
262-
public void setHostname(final String hostname) throws MalformedURLException {
263-
if (getBrowserVersion().hasFeature(JS_ANCHOR_HOSTNAME_IGNORE_BLANK)) {
264-
if (!org.htmlunit.util.StringUtils.isBlank(hostname)) {
265-
url_ = UrlUtils.getUrlWithNewHost(url_, hostname);
260+
public void setHostname(String hostname) {
261+
if (hostname != null) {
262+
if (hostname.indexOf(' ') > -1) {
263+
return;
266264
}
265+
266+
final int idx = hostname.indexOf('#');
267+
if (idx > -1) {
268+
hostname = hostname.substring(0, idx);
269+
}
270+
}
271+
272+
if (org.htmlunit.util.StringUtils.isEmptyOrNull(hostname)) {
273+
return;
267274
}
268-
else if (!org.htmlunit.util.StringUtils.isEmptyOrNull(hostname)) {
275+
276+
try {
269277
url_ = UrlUtils.getUrlWithNewHost(url_, hostname);
270278
}
279+
catch (final MalformedURLException e) {
280+
// do nothing
281+
}
271282
}
272283

273284
/**

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

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
*/
1515
package org.htmlunit.javascript.host.html;
1616

17-
import static org.htmlunit.BrowserVersionFeatures.JS_ANCHOR_HOSTNAME_IGNORE_BLANK;
1817
import static org.htmlunit.BrowserVersionFeatures.JS_ANCHOR_PATHNAME_DETECT_WIN_DRIVES_URL_REPLACE;
1918
import static org.htmlunit.BrowserVersionFeatures.JS_ANCHOR_PATHNAME_PREFIX_WIN_DRIVES_URL;
2019
import static org.htmlunit.BrowserVersionFeatures.JS_ANCHOR_PROTOCOL_COLON_UPPER_CASE_DRIVE_LETTERS;
@@ -343,15 +342,28 @@ public String getHostname() {
343342
* @see <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement/hostname">MDN Documentation</a>
344343
*/
345344
@JsxSetter
346-
public void setHostname(final String hostname) throws Exception {
347-
if (getBrowserVersion().hasFeature(JS_ANCHOR_HOSTNAME_IGNORE_BLANK)) {
348-
if (!StringUtils.isBlank(hostname)) {
349-
setUrl(UrlUtils.getUrlWithNewHost(getUrl(), hostname));
345+
public void setHostname(String hostname) throws Exception {
346+
if (hostname != null) {
347+
if (hostname.indexOf(' ') > -1) {
348+
return;
349+
}
350+
351+
final int idx = hostname.indexOf('#');
352+
if (idx > -1) {
353+
hostname = hostname.substring(0, idx);
350354
}
351355
}
352-
else if (!StringUtils.isEmptyOrNull(hostname)) {
356+
357+
if (org.htmlunit.util.StringUtils.isEmptyOrNull(hostname)) {
358+
return;
359+
}
360+
361+
try {
353362
setUrl(UrlUtils.getUrlWithNewHost(getUrl(), hostname));
354363
}
364+
catch (final MalformedURLException e) {
365+
// do nothing
366+
}
355367
}
356368

357369
/**

src/test/java/org/htmlunit/javascript/host/URLTest.java

Lines changed: 83 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -536,24 +536,19 @@ public void host() throws Exception {
536536
@Test
537537
@Alerts(DEFAULT = {"developer.mozilla.org",
538538
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host",
539-
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host",
540539
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host"},
541540
CHROME = {"developer.mozilla.org",
542541
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host",
543-
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host",
544-
"%20%20", "https://%20%20/en-US/docs/Web/API/URL/host"},
542+
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host"},
545543
EDGE = {"developer.mozilla.org",
546544
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host",
547-
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host",
548-
"%20%20", "https://%20%20/en-US/docs/Web/API/URL/host"})
545+
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host"})
549546
@HtmlUnitNYI(CHROME = {"developer.mozilla.org",
550547
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host",
551-
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host",
552-
"%20%20", "https:// /en-US/docs/Web/API/URL/host"},
548+
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host"},
553549
EDGE = {"developer.mozilla.org",
554550
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host",
555-
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host",
556-
"%20%20", "https:// /en-US/docs/Web/API/URL/host"})
551+
"htmlunit-dev.org", "https://htmlunit-dev.org/en-US/docs/Web/API/URL/host"})
557552
public void hostname() throws Exception {
558553
final String html = DOCTYPE_HTML
559554
+ "<html>\n"
@@ -572,10 +567,89 @@ public void hostname() throws Exception {
572567
+ " u.hostname = 'htmlunit-dev.org';\n"
573568
+ " log(u.hostname);\n"
574569
+ " log(u.toString());\n"
570+
+ " }\n"
571+
+ " }\n"
572+
+ " </script>\n"
573+
+ "</head>\n"
574+
+ "<body onload='test()'>\n"
575+
+ "</body>\n"
576+
+ "</html>";
577+
loadPageVerifyTitle2(html);
578+
}
579+
580+
/**
581+
* @throws Exception if the test fails
582+
*/
583+
@Test
584+
@Alerts(DEFAULT = {"developer.mozilla.org",
585+
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host",
586+
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host"},
587+
CHROME = {"developer.mozilla.org",
588+
"%20%20", "https://%20%20/en-US/docs/Web/API/URL/host",
589+
"html%20unit", "https://html%20unit/en-US/docs/Web/API/URL/host"},
590+
EDGE = {"developer.mozilla.org",
591+
"%20%20", "https://%20%20/en-US/docs/Web/API/URL/host",
592+
"html%20unit", "https://html%20unit/en-US/docs/Web/API/URL/host"})
593+
@HtmlUnitNYI(
594+
CHROME = {"developer.mozilla.org",
595+
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host",
596+
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host"},
597+
EDGE = {"developer.mozilla.org",
598+
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host",
599+
"developer.mozilla.org", "https://developer.mozilla.org/en-US/docs/Web/API/URL/host"})
600+
public void hostnameBlank() throws Exception {
601+
final String html = DOCTYPE_HTML
602+
+ "<html>\n"
603+
+ "<head>\n"
604+
+ " <script>\n"
605+
+ LOG_TITLE_FUNCTION
606+
+ " function test() {\n"
607+
+ " if (typeof window.URL === 'function') {\n"
608+
+ " var u = new URL('https://developer.mozilla.org:443/en-US/docs/Web/API/URL/host');\n"
609+
+ " log(u.hostname);\n"
575610

576611
+ " u.hostname = ' ';\n"
577612
+ " log(u.hostname);\n"
578613
+ " log(u.toString());\n"
614+
615+
+ " u.hostname = 'html unit';\n"
616+
+ " log(u.hostname);\n"
617+
+ " log(u.toString());\n"
618+
+ " }\n"
619+
+ " }\n"
620+
+ " </script>\n"
621+
+ "</head>\n"
622+
+ "<body onload='test()'>\n"
623+
+ "</body>\n"
624+
+ "</html>";
625+
loadPageVerifyTitle2(html);
626+
}
627+
628+
/**
629+
* @throws Exception if the test fails
630+
*/
631+
@Test
632+
@Alerts({"developer.mozilla.org",
633+
"html", "https://html/en-US/docs/Web/API/URL/host",
634+
"html", "https://html/en-US/docs/Web/API/URL/host"})
635+
public void hostnameInvalid() throws Exception {
636+
final String html = DOCTYPE_HTML
637+
+ "<html>\n"
638+
+ "<head>\n"
639+
+ " <script>\n"
640+
+ LOG_TITLE_FUNCTION
641+
+ " function test() {\n"
642+
+ " if (typeof window.URL === 'function') {\n"
643+
+ " var u = new URL('https://developer.mozilla.org:443/en-US/docs/Web/API/URL/host');\n"
644+
+ " log(u.hostname);\n"
645+
646+
+ " u.hostname = 'html#unit';\n"
647+
+ " log(u.hostname);\n"
648+
+ " log(u.toString());\n"
649+
650+
+ " u.hostname = '#htmlunit';\n"
651+
+ " log(u.hostname);\n"
652+
+ " log(u.toString());\n"
579653
+ " }\n"
580654
+ " }\n"
581655
+ " </script>\n"

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

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1560,15 +1560,21 @@ public void readWriteAnchorHostname() throws Exception {
15601560
*/
15611561
@Test
15621562
@Alerts(DEFAULT = {"localhost", "localhost", "http://localhost:§§URL§§/foo.html#O",
1563+
"localhost", "http://localhost:§§URL§§/foo.html#O",
15631564
"localhost", "http://localhost:§§URL§§/foo.html#O"},
15641565
CHROME = {"localhost", "localhost", "http://localhost:§§URL§§/foo.html#O",
1565-
"%20%20%20%20", "http://%20%20%20%20:§§URL§§/foo.html#O"},
1566+
"%20%20", "http://%20%20:§§URL§§/foo.html#O",
1567+
"html%20unit", "http://html%20unit:§§URL§§/foo.html#O"},
15661568
EDGE = {"localhost", "localhost", "http://localhost:§§URL§§/foo.html#O",
1567-
"%20%20%20%20", "http://%20%20%20%20:§§URL§§/foo.html#O"})
1568-
@HtmlUnitNYI(CHROME = {"localhost", "localhost", "http://localhost:§§URL§§/foo.html#O",
1569-
"%20%20%20%20", "http:// :§§URL§§/foo.html#O"},
1570-
EDGE = {"localhost", "localhost", "http://localhost:§§URL§§/foo.html#O",
1571-
"%20%20%20%20", "http:// :§§URL§§/foo.html#O"})
1569+
"%20%20", "http://%20%20:§§URL§§/foo.html#O",
1570+
"html%20unit", "http://html%20unit:§§URL§§/foo.html#O"})
1571+
@HtmlUnitNYI(
1572+
CHROME = {"localhost", "localhost", "http://localhost:§§URL§§/foo.html#O",
1573+
"localhost", "http://localhost:§§URL§§/foo.html#O",
1574+
"localhost", "http://localhost:§§URL§§/foo.html#O"},
1575+
EDGE = {"localhost", "localhost", "http://localhost:§§URL§§/foo.html#O",
1576+
"localhost", "http://localhost:§§URL§§/foo.html#O",
1577+
"localhost", "http://localhost:§§URL§§/foo.html#O"})
15721578
public void readWriteAnchorHostnameEmpty() throws Exception {
15731579
final String html = DOCTYPE_HTML
15741580
+ "<html>\n"
@@ -1583,7 +1589,47 @@ public void readWriteAnchorHostnameEmpty() throws Exception {
15831589
+ " log(tester.hostname);\n"
15841590
+ " log(tester.href);\n"
15851591

1586-
+ " tester.hostname = ' ';\n"
1592+
+ " tester.hostname = ' ';\n"
1593+
+ " log(tester.hostname);\n"
1594+
+ " log(tester.href);\n"
1595+
1596+
+ " tester.hostname = 'html unit';\n"
1597+
+ " log(tester.hostname);\n"
1598+
+ " log(tester.href);\n"
1599+
+ " }\n"
1600+
+ " </script>\n"
1601+
+ " <head>\n"
1602+
+ " <body onload='test()'>\n"
1603+
+ " <a id='tester' href='foo.html#O'>link 1</a>\n"
1604+
+ " </body>\n"
1605+
+ "</html>";
1606+
1607+
expandExpectedAlertsVariables("" + PORT);
1608+
loadPageVerifyTitle2(html);
1609+
}
1610+
1611+
/**
1612+
* @throws Exception if an error occurs
1613+
*/
1614+
@Test
1615+
@Alerts(DEFAULT = {"localhost",
1616+
"html", "http://html:22222/foo.html#O",
1617+
"html", "http://html:22222/foo.html#O"})
1618+
public void readWriteAnchorHostnameInvalid() throws Exception {
1619+
final String html = DOCTYPE_HTML
1620+
+ "<html>\n"
1621+
+ " <head>\n"
1622+
+ " <script>\n"
1623+
+ LOG_TITLE_FUNCTION
1624+
+ " function test() {\n"
1625+
+ " var tester = document.getElementById('tester');\n"
1626+
+ " log(tester.hostname);\n"
1627+
1628+
+ " tester.hostname = 'html#unit';\n"
1629+
+ " log(tester.hostname);\n"
1630+
+ " log(tester.href);\n"
1631+
1632+
+ " tester.hostname = '#htmlunit';\n"
15871633
+ " log(tester.hostname);\n"
15881634
+ " log(tester.href);\n"
15891635
+ " }\n"

0 commit comments

Comments
 (0)