WebCore: hostname and host are mixed up when manipulating anchor elements.
authoryael.aharon@nokia.com <yael.aharon@nokia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Sep 2009 17:53:00 +0000 (17:53 +0000)
committeryael.aharon@nokia.com <yael.aharon@nokia.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 4 Sep 2009 17:53:00 +0000 (17:53 +0000)
https://bugs.webkit.org/show_bug.cgi?id=28954

Patch by Yael Aharon <yael.aharon@nokia.com> on 2009-09-04
Reviewed by Darin Adler.

Swapped the implementation of host and hostname, and made sure not to return
the port number if it is default for the given protocol.
FireFox also avoids returning the protocol number if it is default.

Test: fast/dom/Element/hostname-host.html

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@48063 268f45cc-cd09-0410-ab3c-d52691b4dbfc

LayoutTests/ChangeLog
LayoutTests/fast/dom/Element/hostname-host-expected.txt [new file with mode: 0644]
LayoutTests/fast/dom/Element/hostname-host.html [new file with mode: 0644]
WebCore/ChangeLog
WebCore/html/HTMLAnchorElement.cpp
WebCore/page/SecurityOrigin.cpp
WebCore/page/SecurityOrigin.h

index 3d53bcbf8bdd4788e664f5882be12b52439851cc..9f06db25c58473d9ec46a7a92c7d6d29cba81e2d 100644 (file)
@@ -1,3 +1,13 @@
+2009-09-04  Yael Aharon  <yael.aharon@nokia.com>
+
+        Reviewed by Darin Adler.
+
+        hostname and host are mixed up when manipulating anchor elements.
+        https://bugs.webkit.org/show_bug.cgi?id=28954
+
+        * fast/dom/Element/hostname-host-expected.txt: Added.
+        * fast/dom/Element/hostname-host.html: Added.
+
 2009-09-04  Dimitri Glazkov  <dglazkov@chromium.org>
 
         Unreviewed, build fix.
diff --git a/LayoutTests/fast/dom/Element/hostname-host-expected.txt b/LayoutTests/fast/dom/Element/hostname-host-expected.txt
new file mode 100644 (file)
index 0000000..0f2e826
--- /dev/null
@@ -0,0 +1,22 @@
+http with default port
+https with default port
+ftp with default port
+
+http with non-default port
+https with non-default port
+ftp with non-default port
+
+http without port
+https without port
+ftp without port
+
+Hostname is dev.w3.org. Host is dev.w3.org
+Hostname is dev.w3.org. Host is dev.w3.org
+Hostname is dev.w3.org. Host is dev.w3.org
+Hostname is dev.w3.org. Host is dev.w3.org:123
+Hostname is dev.w3.org. Host is dev.w3.org:123
+Hostname is dev.w3.org. Host is dev.w3.org:123
+Hostname is dev.w3.org. Host is dev.w3.org
+Hostname is dev.w3.org. Host is dev.w3.org
+Hostname is dev.w3.org. Host is dev.w3.org
+
diff --git a/LayoutTests/fast/dom/Element/hostname-host.html b/LayoutTests/fast/dom/Element/hostname-host.html
new file mode 100644 (file)
index 0000000..1c6f8c1
--- /dev/null
@@ -0,0 +1,30 @@
+<html>\r
+<head>\r
+<script>\r
+function load() {\r
+    if (window.layoutTestController)\r
+        layoutTestController.dumpAsText();\r
+    str = "";\r
+    for (i=0;i<9;i++)\r
+      str += "Hostname is " + document.links[i].hostname + ". Host is " + document.links[i].host + "<br>";\r
+    document.getElementById("hostname_host").innerHTML = str;\r
+}\r
+</script>\r
+</head>\r
+<body onload="load()">\r
+<a  href="http://dev.w3.org:80/html5/spec/infrastructure.html#interfaces-for-url-manipulation">http with default port</a><br>\r
+<a  href="https://dev.w3.org:443/html5/spec/infrastructure.html#interfaces-for-url-manipulation">https with default port</a><br>\r
+<a  href="ftp://dev.w3.org:21/html5/spec/infrastructure.html#interfaces-for-url-manipulation">ftp with default port</a><br>\r
+<br>\r
+<a  href="http://dev.w3.org:123/html5/spec/infrastructure.html#interfaces-for-url-manipulation">http with non-default port</a><br>\r
+<a  href="https://dev.w3.org:123/html5/spec/infrastructure.html#interfaces-for-url-manipulation">https with non-default port</a><br>\r
+<a  href="ftp://dev.w3.org:123/html5/spec/infrastructure.html#interfaces-for-url-manipulation">ftp with non-default port</a><br>\r
+<br>\r
+<a  href="http://dev.w3.org/html5/spec/infrastructure.html#interfaces-for-url-manipulation">http without port</a><br>\r
+<a  href="https://dev.w3.org/html5/spec/infrastructure.html#interfaces-for-url-manipulation">https without port</a><br>\r
+<a  href="ftp://dev.w3.org/html5/spec/infrastructure.html#interfaces-for-url-manipulation">ftp without port</a><br>\r
+<br>\r
+<span id="hostname_host"></span>\r
+\r
+</body>\r
+</html>\r
index a67cd24a04684d738d18979dc636dae8d6370659..1b796057de99989708a9ac2246edd20f7dc92b4b 100644 (file)
@@ -1,3 +1,23 @@
+2009-09-04  Yael Aharon  <yael.aharon@nokia.com>
+
+        Reviewed by Darin Adler.
+
+        hostname and host are mixed up when manipulating anchor elements.
+        https://bugs.webkit.org/show_bug.cgi?id=28954
+
+        Swapped the implementation of host and hostname, and made sure not to return
+        the port number if it is default for the given protocol. 
+        FireFox also avoids returning the protocol number if it is default.
+
+        Test: fast/dom/Element/hostname-host.html
+
+        * html/HTMLAnchorElement.cpp:
+        (WebCore::HTMLAnchorElement::host):
+        (WebCore::HTMLAnchorElement::hostname):
+        * page/SecurityOrigin.cpp:
+        (WebCore::SecurityOrigin::isDefaultPortForProtocol):
+        * page/SecurityOrigin.h:
+
 2009-09-04  Anders Carlsson  <andersca@apple.com>
 
         Reviewed by Darin Adler and Steve Falkenburg.
index 0d3546ddde199b748052ff2ff12e5d3e0a43803d..7999a066b9ddddded5c808820739862b49ba1993 100644 (file)
@@ -351,18 +351,20 @@ String HTMLAnchorElement::hash() const
 }
 
 String HTMLAnchorElement::host() const
-{
-    return href().host();
-}
-
-String HTMLAnchorElement::hostname() const
 {
     const KURL& url = href();
     if (url.port() == 0)
         return url.host();
+    if (SecurityOrigin::isDefaultPortForProtocol(url.port(), url.protocol()))
+        return url.host();
     return url.host() + ":" + String::number(url.port());
 }
 
+String HTMLAnchorElement::hostname() const
+{
+    return href().host();
+}
+
 String HTMLAnchorElement::pathname() const
 {
     return href().path();
index 33ede0069ea9d67b5949db8224181dc239907ba1..5076adf411e1d84220dfdbc80d6fb103da0a5bc6 100644 (file)
@@ -73,7 +73,7 @@ static URLSchemesMap& noAccessSchemes()
     return noAccessSchemes;
 }
 
-static bool isDefaultPortForProtocol(unsigned short port, const String& protocol)
+bool SecurityOrigin::isDefaultPortForProtocol(unsigned short port, const String& protocol)
 {
     if (protocol.isEmpty())
         return false;
index cc2acdd2e5ad3d4732feeb08bcb93a59cf36357a..c8086ac8725d32b810352dfbb9c13c933fa0cc1a 100644 (file)
@@ -144,6 +144,8 @@ namespace WebCore {
         static void whiteListAccessFromOrigin(const SecurityOrigin& sourceOrigin, const String& destinationProtocol, const String& destinationDomains, bool allowDestinationSubdomains);
         static void resetOriginAccessWhiteLists();
 
+        static bool isDefaultPortForProtocol(unsigned short port, const String& protocol);
+
     private:
         explicit SecurityOrigin(const KURL&);
         explicit SecurityOrigin(const SecurityOrigin*);