2011-02-11 Eric Seidel <eric@webkit.org>
authoreric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 Feb 2011 23:47:06 +0000 (23:47 +0000)
committereric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 11 Feb 2011 23:47:06 +0000 (23:47 +0000)
        Reviewed by Adam Barth.

        KURL should remove default port numbers when cannonicalizing urls (to match every other browser)
        https://bugs.webkit.org/show_bug.cgi?id=54090

        Added a new test to show that we are intentionally removing
        a colon after a host name.  http://foo.com:/ -> http://foo.com/

        * fast/url/port-expected.txt:
        * fast/url/relative-unix-expected.txt:
        * fast/url/segments-expected.txt:
        * fast/url/segments-from-data-url-expected.txt:
        * fast/url/standard-url-expected.txt:
2011-02-11  Eric Seidel  <eric@webkit.org>

        Reviewed by Adam Barth.

        KURL should remove default port numbers when cannonicalizing urls (to match every other browser)
        https://bugs.webkit.org/show_bug.cgi?id=54090

        * platform/KURL.cpp:
        (WebCore::isDefaultPortForScheme):
        (WebCore::KURL::parse):

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

12 files changed:
LayoutTests/ChangeLog
LayoutTests/fast/url/port-expected.txt
LayoutTests/fast/url/relative-unix-expected.txt
LayoutTests/fast/url/relative-win-expected.txt
LayoutTests/fast/url/script-tests/port.js
LayoutTests/fast/url/segments-expected.txt
LayoutTests/fast/url/segments-from-data-url-expected.txt
LayoutTests/fast/url/standard-url-expected.txt
LayoutTests/platform/mac/http/tests/inspector/console-websocket-error-expected.txt
LayoutTests/platform/mac/security/block-test-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/platform/KURL.cpp

index bdbbbd2..f3d0cec 100644 (file)
@@ -1,3 +1,19 @@
+2011-02-11  Eric Seidel  <eric@webkit.org>
+
+        Reviewed by Adam Barth.
+
+        KURL should remove default port numbers when cannonicalizing urls (to match every other browser)
+        https://bugs.webkit.org/show_bug.cgi?id=54090
+
+        Added a new test to show that we are intentionally removing
+        a colon after a host name.  http://foo.com:/ -> http://foo.com/
+
+        * fast/url/port-expected.txt:
+        * fast/url/relative-unix-expected.txt:
+        * fast/url/segments-expected.txt:
+        * fast/url/segments-from-data-url-expected.txt:
+        * fast/url/standard-url-expected.txt:
+
 2011-02-11  Mihai Parparita  <mihaip@chromium.org>
 
         Reviewed by Darin Adler.
index d64dd3a..11ab371 100644 (file)
@@ -5,8 +5,9 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 FAIL canonicalize('http://www.example.com:as df/') should be http://www.example.com:as%20df/. Was http://www.example.com:as df/.
 PASS canonicalize('http://www.example.com:-2/') is 'http://www.example.com:-2/'
-FAIL canonicalize('http://www.example.com:80/') should be http://www.example.com/. Was http://www.example.com:80/.
+PASS canonicalize('http://www.example.com:80/') is 'http://www.example.com/'
 PASS canonicalize('http://www.example.com:8080/') is 'http://www.example.com:8080/'
+PASS canonicalize('http://www.example.com:/') is 'http://www.example.com/'
 PASS canonicalize('foobar://www.example.com:80/') is 'foobar://www.example.com:80/'
 PASS successfullyParsed is true
 
index 4cfcda0..8e93d44 100644 (file)
@@ -5,7 +5,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 PASS canonicalize('\\\\Another\\path') is 'http://another/path'
 PASS canonicalize('/c:\\foo') is 'http://host/c:/foo'
-FAIL canonicalize('//c:\\foo') should be http://c/foo. Was http://c:/foo.
+PASS canonicalize('//c:\\foo') is 'http://c/foo'
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 733f815..1cb8d67 100644 (file)
@@ -8,7 +8,7 @@ PASS canonicalize('bar') is 'file:///C:/bar'
 FAIL canonicalize('../../../bar.html') should be file:///C:/bar.html. Was file:///bar.html.
 FAIL canonicalize('/../bar.html') should be file:///C:/bar.html. Was file:///bar.html.
 FAIL canonicalize('\\\\another\\path') should be . Was http://another/path.
-FAIL canonicalize('//c:/foo') should be file:///C:/foo. Was file://c:/foo.
+FAIL canonicalize('//c:/foo') should be file:///C:/foo. Was file://c/foo.
 FAIL canonicalize('//localhost/c:/foo') should be file:///C:/foo. Was file:///c:/foo.
 FAIL canonicalize('c:') should be . Was c:.
 FAIL canonicalize('c:/foo') should be . Was c:/foo.
index b3228b1..e9e6057 100644 (file)
@@ -7,6 +7,8 @@ cases = [
   // Default port should be omitted.
   ["80", ""],
   ["8080", ":8080"],
+  // Empty ports (just a colon) should also be removed
+  ["", ""],
 ];
 
 for (var i = 0; i < cases.length; ++i) {
index f53fbb1..659be5f 100644 (file)
@@ -67,7 +67,7 @@ PASS segments('http://[2001::1') is '[":","","0","","",""]'
 PASS segments('http://2001::1]') is '[":","","0","","",""]'
 PASS segments('http://2001::1]:80') is '[":","","0","","",""]'
 PASS segments('http://[2001::1]') is '["http:","[2001::1]","0","/","",""]'
-FAIL segments('http://[2001::1]:80') should be ["http:","[2001::1]","0","/","",""]. Was ["http:","[2001::1]","80","/","",""].
+PASS segments('http://[2001::1]:80') is '["http:","[2001::1]","0","/","",""]'
 PASS segments('http://[[::]]') is '[":","","0","","",""]'
 PASS successfullyParsed is true
 
index 6ae93b8..b97e489 100644 (file)
@@ -67,7 +67,7 @@ PASS segments('http://[2001::1') is '[":","","0","","",""]'
 PASS segments('http://2001::1]') is '[":","","0","","",""]'
 PASS segments('http://2001::1]:80') is '[":","","0","","",""]'
 PASS segments('http://[2001::1]') is '["http:","[2001::1]","0","/","",""]'
-FAIL segments('http://[2001::1]:80') should be ["http:","[2001::1]","0","/","",""]. Was ["http:","[2001::1]","80","/","",""].
+PASS segments('http://[2001::1]:80') is '["http:","[2001::1]","0","/","",""]'
 PASS segments('http://[[::]]') is '[":","","0","","",""]'
 PASS successfullyParsed is true
 
index 3f517d4..e95be46 100644 (file)
@@ -12,23 +12,23 @@ PASS canonicalize('http://user:pass@/') is 'http://user:pass@/'
 PASS canonicalize('http://%25DOMAIN:foobar@foodomain.com/') is 'http://%25DOMAIN:foobar@foodomain.com/'
 PASS canonicalize('http:\\\\www.google.com\\foo') is 'http://www.google.com/foo'
 FAIL canonicalize('http://www.google.com/asdf#\ud800') should be http://www.google.com/asdf#�. Was http://www.google.com/asdf#%26%2355296%3B.
-FAIL canonicalize('http://foo:80/') should be http://foo/. Was http://foo:80/.
+PASS canonicalize('http://foo:80/') is 'http://foo/'
 PASS canonicalize('http://foo:81/') is 'http://foo:81/'
 PASS canonicalize('httpa://foo:80/') is 'httpa://foo:80/'
 PASS canonicalize('http://foo:-80/') is 'http://foo:-80/'
-FAIL canonicalize('https://foo:443/') should be https://foo/. Was https://foo:443/.
+PASS canonicalize('https://foo:443/') is 'https://foo/'
 PASS canonicalize('https://foo:80/') is 'https://foo:80/'
-FAIL canonicalize('ftp://foo:21/') should be ftp://foo/. Was ftp://foo:21/.
+PASS canonicalize('ftp://foo:21/') is 'ftp://foo/'
 PASS canonicalize('ftp://foo:80/') is 'ftp://foo:80/'
-FAIL canonicalize('gopher://foo:70/') should be gopher://foo/. Was gopher://foo:70/.
+PASS canonicalize('gopher://foo:70/') is 'gopher://foo/'
 PASS canonicalize('gopher://foo:443/') is 'gopher://foo:443/'
-FAIL canonicalize('ws://foo:80/') should be ws://foo/. Was ws://foo:80/.
+PASS canonicalize('ws://foo:80/') is 'ws://foo/'
 PASS canonicalize('ws://foo:81/') is 'ws://foo:81/'
 PASS canonicalize('ws://foo:443/') is 'ws://foo:443/'
 PASS canonicalize('ws://foo:815/') is 'ws://foo:815/'
 PASS canonicalize('wss://foo:80/') is 'wss://foo:80/'
 PASS canonicalize('wss://foo:81/') is 'wss://foo:81/'
-FAIL canonicalize('wss://foo:443/') should be wss://foo/. Was wss://foo:443/.
+PASS canonicalize('wss://foo:443/') is 'wss://foo/'
 PASS canonicalize('wss://foo:815/') is 'wss://foo:815/'
 PASS successfullyParsed is true
 
index aaf7cf2..a887afc 100644 (file)
@@ -5,7 +5,7 @@ CONSOLE MESSAGE: line 64: testSSLCertificate: onclose is called.
 WebSocket's network errors should be logged to console.
 
 console-websocket-error.html:32testDNSLookup: Test started.
-ws://nonexistent.domain.invalid:80/WebSocket network error: The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)
+ws://nonexistent.domain.invalid/WebSocket network error: The operation couldn’t be completed. (kCFErrorDomainCFNetwork error 2.)
 console-websocket-error.html:43testDNSLookup: onclose is called.
 console-websocket-error.html:50testSSLCertificate: Test started.
 wss://127.0.0.1:8443/WebSocket network error: OSStatus Error -9812: valid cert chain, untrusted root 
index 56a5de2..1197e45 100644 (file)
@@ -137,14 +137,14 @@ http://255.255.255.255:4294967296/test.jpg - willSendRequest <NSURLRequest URL h
 http://255.255.255.255:4294967296/test.jpg - didFailLoadingWithError: <NSError domain WebKitErrorDomain, code 103, failing URL "http://255.255.255.255:4294967296/test.jpg">
 http://255.255.255.255:0/test.jpg - willSendRequest <NSURLRequest URL http://255.255.255.255:0/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
 http://255.255.255.255:0/test.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -1004, failing URL "http://255.255.255.255:0/test.jpg">
-http://255.255.255.255:80/test.jpg - willSendRequest <NSURLRequest URL http://255.255.255.255:80/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
-http://255.255.255.255:80/test.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -1004, failing URL "http://255.255.255.255:80/test.jpg">
-http://255.255.255.255:/test.jpg - willSendRequest <NSURLRequest URL http://255.255.255.255:/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
-http://255.255.255.255:/test.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -1004, failing URL "http://255.255.255.255:/test.jpg">
+http://255.255.255.255/test.jpg - willSendRequest <NSURLRequest URL http://255.255.255.255/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
+http://255.255.255.255/test.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -1004, failing URL "http://255.255.255.255/test.jpg">
+http://255.255.255.255/test.jpg - willSendRequest <NSURLRequest URL http://255.255.255.255/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
+http://255.255.255.255/test.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -1004, failing URL "http://255.255.255.255/test.jpg">
+ftp://255.255.255.255/test.jpg - willSendRequest <NSURLRequest URL ftp://255.255.255.255/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
+ftp://255.255.255.255/test.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -1, failing URL "ftp://255.255.255.255/test.jpg">
 ftp://255.255.255.255/test.jpg - willSendRequest <NSURLRequest URL ftp://255.255.255.255/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
 ftp://255.255.255.255/test.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -1, failing URL "ftp://255.255.255.255/test.jpg">
-ftp://255.255.255.255:21/test.jpg - willSendRequest <NSURLRequest URL ftp://255.255.255.255:21/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
-ftp://255.255.255.255:21/test.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -1, failing URL "ftp://255.255.255.255:21/test.jpg">
 ftp://255.255.255.255:22/test.jpg - willSendRequest <NSURLRequest URL ftp://255.255.255.255:22/test.jpg, main document URL block-test.html, http method GET> redirectResponse (null)
 ftp://255.255.255.255:22/test.jpg - didFailLoadingWithError: <NSError domain NSURLErrorDomain, code -1, failing URL "ftp://255.255.255.255:22/test.jpg">
 This test attempts to change the src of an IMG tag to all black listed ports to confirm that WebKit returns the correct error for them - blocked instead of cannot find. It also tries the FTP ports for exemptions. Due to the nature of this test, the results can only be processed automatically via DumpRenderTree
index 742b955..cf79093 100644 (file)
@@ -1,3 +1,14 @@
+2011-02-11  Eric Seidel  <eric@webkit.org>
+
+        Reviewed by Adam Barth.
+
+        KURL should remove default port numbers when cannonicalizing urls (to match every other browser)
+        https://bugs.webkit.org/show_bug.cgi?id=54090
+
+        * platform/KURL.cpp:
+        (WebCore::isDefaultPortForScheme):
+        (WebCore::KURL::parse):
+
 2011-02-11  Mike Reed  <reed@google.com>
 
         Reviewed by James Robinson.
index cf44c02..78911ce 100644 (file)
@@ -1100,6 +1100,38 @@ void KURL::parse(const String& string)
     parse(buffer.data(), &string);
 }
 
+static inline bool equal(const char* a, size_t lenA, const char* b, size_t lenB)
+{
+    if (lenA != lenB)
+        return false;
+    return !strncmp(a, b, lenA);
+}
+
+// List of default schemes is taken from google-url:
+// http://code.google.com/p/google-url/source/browse/trunk/src/url_canon_stdurl.cc#120
+static inline bool isDefaultPortForScheme(const char* port, size_t portLength, const char* scheme, size_t schemeLength)
+{
+    // This switch is theoretically a performance optimization.  It came over when
+    // the code was moved from google-url, but may be removed later.
+    switch (schemeLength) {
+    case 2:
+        return equal("ws", 2, scheme, schemeLength) && equal("80", 2, port, portLength);
+    case 3:
+        if (equal("ftp", 3, scheme, schemeLength))
+            return equal("21", 2, port, portLength);
+        if (equal("wss", 3, scheme, schemeLength))
+            return equal("443", 3, port, portLength);
+        break;
+    case 4:
+        return equal("http", 4, scheme, schemeLength) && equal("80", 2, port, portLength);
+    case 5:
+        return equal("https", 5, scheme, schemeLength) && equal("443", 3, port, portLength);
+    case 6:
+        return equal("gopher", 6, scheme, schemeLength) && equal("70", 2, port, portLength);
+    }
+    return false;
+}
+
 void KURL::parse(const char* url, const String* originalString)
 {
     if (!url || url[0] == '\0') {
@@ -1335,13 +1367,16 @@ void KURL::parse(const char* url, const String* originalString)
         }
         m_hostEnd = p - buffer.data();
 
-        // copy in the port
+        // Copy in the port if the URL has one (and it's not default).
         if (hostEnd != portStart) {
-            *p++ = ':';
-            strPtr = url + portStart;
-            const char *portEndPtr = url + portEnd;
-            while (strPtr < portEndPtr)
-                *p++ = *strPtr++;
+            const char* portStr = url + portStart;
+            size_t portLength = portEnd - portStart;
+            if (portLength && !isDefaultPortForScheme(portStr, portLength, buffer.data(), m_schemeEnd)) {
+                *p++ = ':';
+                const char* portEndPtr = url + portEnd;
+                while (portStr < portEndPtr)
+                    *p++ = *portStr++;
+            }
         }
         m_portEnd = p - buffer.data();
     } else