We should not expect percent-escaped hostname for invalid URLs
authorbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Sep 2012 02:56:35 +0000 (02:56 +0000)
committerbenjamin@webkit.org <benjamin@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Sep 2012 02:56:35 +0000 (02:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=97415

Reviewed by Adam Barth.

The URL layout tests encode some Chromium specific behavior.
Chromium does a partial canonicalization of invalid URLs. Neither Safari, nor Firefox nor Opera
do that.

This patch fix the tests and expectations for the IP tests.

* fast/url/invalid-urls-utf8-expected.txt:
* fast/url/invalid-urls-utf8.html:
Move the "empty authority" check from both IP tests to the invalid URLs test. An empty authority
for a standard URL causes an invalid URL, it should be kept as is.

* fast/url/ipv4-expected.txt:
* fast/url/ipv6-expected.txt:
* fast/url/script-tests/ipv4.js:
* fast/url/script-tests/ipv6.js: Extend a comment to clarify the rule.
Invalid URLs should not be escaped.

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

LayoutTests/ChangeLog
LayoutTests/fast/url/invalid-urls-utf8-expected.txt
LayoutTests/fast/url/invalid-urls-utf8.html
LayoutTests/fast/url/ipv4-expected.txt
LayoutTests/fast/url/ipv6-expected.txt
LayoutTests/fast/url/script-tests/ipv4.js
LayoutTests/fast/url/script-tests/ipv6.js
LayoutTests/platform/chromium-win/fast/url/ipv6-expected.txt
LayoutTests/platform/chromium/fast/url/ipv4-expected.txt

index d20e384..2e5989a 100644 (file)
@@ -1,3 +1,27 @@
+2012-09-24  Benjamin Poulain  <benjamin@webkit.org>
+
+        We should not expect percent-escaped hostname for invalid URLs
+        https://bugs.webkit.org/show_bug.cgi?id=97415
+
+        Reviewed by Adam Barth.
+
+        The URL layout tests encode some Chromium specific behavior.
+        Chromium does a partial canonicalization of invalid URLs. Neither Safari, nor Firefox nor Opera
+        do that.
+
+        This patch fix the tests and expectations for the IP tests.
+
+        * fast/url/invalid-urls-utf8-expected.txt:
+        * fast/url/invalid-urls-utf8.html:
+        Move the "empty authority" check from both IP tests to the invalid URLs test. An empty authority
+        for a standard URL causes an invalid URL, it should be kept as is.
+
+        * fast/url/ipv4-expected.txt:
+        * fast/url/ipv6-expected.txt:
+        * fast/url/script-tests/ipv4.js:
+        * fast/url/script-tests/ipv6.js: Extend a comment to clarify the rule.
+        Invalid URLs should not be escaped.
+
 2012-09-24  Benjamin Poulain  <bpoulain@apple.com>
 
         Fix Geolocation error reporting in the test support
index 43a2758..3651700 100644 (file)
@@ -3,6 +3,12 @@ This ensure we do not mess up the bytes when an URL is partially parsed and is i
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
+FAIL src should be http:///. Was http:/.
+FAIL src should be https:///. Was https:/.
+PASS src is expected
+PASS src is expected
+PASS src is expected
+PASS src is expected
 PASS src is expected
 PASS src is expected
 PASS src is expected
index e99244d..f6ce186 100644 (file)
@@ -14,11 +14,21 @@ description("This ensure we do not mess up the bytes when an URL is partially pa
 
 // Those are all invalid URLs. They should not be partially modified by the parser.
 var testSet = [
+    // Empty Authority for a standard hierachical URL.
+    'http:///',
+    'https:///',
+    'ftp:///',
+    'gopher:///',
+    'ws:///',
+    'wss:///',
+
+    // Invalid Authority.
     'foo://tête à tête@host/',
     'foo://user:tête à tête@host/',
     '    foo://<>@host/    ',
     '    foo://user:<>@host/    ',
     'foo://user:password@[xxxxx]/tête à tête/',
+
     // The '?' is a path separator and make sure the hostname is not encoded in punicode. The hostname is an invalid IPV6 hostname.
     'foo://user:password@[?tête à tête/',
     'foo://user:password@[?tête à tête]/',
@@ -36,8 +46,8 @@ var testSet = [
 
 for (var i = 0; i < testSet.length; ++i) {
     src = canonicalize(testSet[i]);
-       expected = testSet[i].trim();
-       shouldBe('src', 'expected');
+    expected = testSet[i].trim();
+    shouldBe('src', 'expected');
 }
 
 successfullyParsed = true;
index 0ebbc27..f5169fa 100644 (file)
@@ -3,7 +3,6 @@ Canonicalization of IPv4 addresses.
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-FAIL canonicalize('http:///') should be http:. Was http:/.
 PASS canonicalize('http://./') is 'http://./'
 PASS canonicalize('http://192.168.0.1/') is 'http://192.168.0.1/'
 FAIL canonicalize('http://0300.0250.00.01/') should be http://192.168.0.1/. Was http://0300.0250.00.01/.
@@ -22,7 +21,7 @@ FAIL canonicalize('http://0xc0.052000001/') should be http://192.168.0.1/. Was h
 FAIL canonicalize('http://192.168.1/') should be http://192.168.0.1/. Was http://192.168.1/.
 PASS canonicalize('http://192.168.0.0.1/') is 'http://192.168.0.0.1/'
 FAIL canonicalize('http://192.168.0.1./') should be http://192.168.0.1/. Was http://192.168.0.1./.
-FAIL canonicalize('http://192.168.0.1. hello/') should be http://192.168.0.1.%20hello/. Was http://192.168.0.1. hello/.
+PASS canonicalize('http://192.168.0.1. hello/') is 'http://192.168.0.1. hello/'
 PASS canonicalize('http://192.168.0.1../') is 'http://192.168.0.1../'
 PASS canonicalize('http://192.168..1/') is 'http://192.168..1/'
 PASS canonicalize('http://0x100.0/') is 'http://0x100.0/'
@@ -49,7 +48,7 @@ PASS canonicalize('http://192.168.0xa20001/') is 'http://192.168.0xa20001/'
 PASS canonicalize('http://192.015052000001/') is 'http://192.015052000001/'
 PASS canonicalize('http://0X12C0a80001/') is 'http://0x12c0a80001/'
 PASS canonicalize('http://276.1.2/') is 'http://276.1.2/'
-FAIL canonicalize('http://192.168.0.1 hello/') should be http://192.168.0.1%20hello/. Was http://192.168.0.1 hello/.
+PASS canonicalize('http://192.168.0.1 hello/') is 'http://192.168.0.1 hello/'
 FAIL canonicalize('http://0000000000000300.0x00000000000000fF.00000000000000001/') should be http://192.255.0.1/. Was http://0000000000000300.0x00000000000000ff.00000000000000001/.
 PASS canonicalize('http://0000000000000300.0xffffffffFFFFFFFF.3022415481470977/') is 'http://0000000000000300.0xffffffffffffffff.3022415481470977/'
 FAIL canonicalize('http://00000000000000000001/') should be http://0.0.0.1/. Was http://00000000000000000001/.
index afdfb42..f4f04c6 100644 (file)
@@ -3,7 +3,6 @@ Canonicalization of IPv6 addresses.
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-FAIL canonicalize('http:///') should be http:. Was http:/.
 PASS canonicalize('http://[/') is 'http://[/'
 PASS canonicalize('http://[:/') is 'http://[:/'
 PASS canonicalize('http://]/') is 'http://]/'
@@ -42,16 +41,16 @@ FAIL canonicalize('http://[1:2:3:4:5:6::8]/') should be http://[1:2:3:4:5:6:0:8]
 PASS canonicalize('http://[1:2:3:4:5:6:7:8:]/') is 'http://[1:2:3:4:5:6:7:8:]/'
 PASS canonicalize('http://[1:2:3:4:5:6:192.168.0.1:]/') is 'http://[1:2:3:4:5:6:192.168.0.1:]/'
 PASS canonicalize('http://[-1:2:3:4:5:6:7:8]/') is 'http://[-1:2:3:4:5:6:7:8]/'
-FAIL canonicalize('http://[1::%1]/') should be http://[1::%251]/. Was http://[1::%1]/.
-FAIL canonicalize('http://[1::%eth0]/') should be http://[1::%25eth0]/. Was http://[1::%eth0]/.
-FAIL canonicalize('http://[1::%]/') should be http://[1::%25]/. Was http://[1::%]/.
-FAIL canonicalize('http://[%]/') should be http://[%25]/. Was http://[%]/.
-FAIL canonicalize('http://[::%:]/') should be http://[::%25:]/. Was http://[::%:]/.
+PASS canonicalize('http://[1::%1]/') is 'http://[1::%1]/'
+PASS canonicalize('http://[1::%eth0]/') is 'http://[1::%eth0]/'
+PASS canonicalize('http://[1::%]/') is 'http://[1::%]/'
+PASS canonicalize('http://[%]/') is 'http://[%]/'
+PASS canonicalize('http://[::%:]/') is 'http://[::%:]/'
 PASS canonicalize('http://[:0:0::0:0:8]/') is 'http://[:0:0::0:0:8]/'
 PASS canonicalize('http://[0:0::0:0:8:]/') is 'http://[0:0::0:0:8:]/'
 PASS canonicalize('http://[:0:0::0:0:8:]/') is 'http://[:0:0::0:0:8:]/'
 PASS canonicalize('http://[::192.168..1]/') is 'http://[::192.168..1]/'
-FAIL canonicalize('http://[::1 hello]/') should be http://[::1%20hello]/. Was http://[::1 hello]/.
+PASS canonicalize('http://[::1 hello]/') is 'http://[::1 hello]/'
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 3a519d7..dcf238f 100644 (file)
@@ -86,17 +86,11 @@ cases = [
   ["0.00.0x.0x0", "0.0.0.0"]
 ];
 
-// We test the empty string individually.
-shouldBe("canonicalize('http:///')", "'http:'");
-
 for (var i = 0; i < cases.length; ++i) {
   test_vector = cases[i][0];
   expected_result = cases[i][1];
-  if (expected_result === "") {
-    // We use "" to represent that the test vector ought not to parse.
-    // It appears that we're supposed to apply a default canonicalization.
-    expected_result = escape(test_vector.toLowerCase());
-  }
+  if (expected_result === "")
+    expected_result = test_vector.toLowerCase();
   shouldBe("canonicalize('http://" + test_vector + "/')",
            "'http://" + expected_result + "/'");
 }
index b600309..bc007a9 100644 (file)
@@ -71,7 +71,7 @@ cases = [
     // to not exceed 128 bits.
     ["[1:2:3:4:5:6::192.168.0.1]", ""],
 
-    // The contraction is for 16 bits of zero.
+    // The contraction is for 16 bits of zero. RFC 5952, Section 4.2.2.
     ["[1:2:3:4:5:6::8]", "[1:2:3:4:5:6:0:8]"],
 
     // Cannot have a trailing colon.
@@ -104,21 +104,11 @@ cases = [
     ["[::1 hello]", ""]
 ];
 
-// We test the empty string individually.
-shouldBe("canonicalize('http:///')", "'http:'");
-
 for (var i = 0; i < cases.length; ++i) {
   test_vector = cases[i][0];
   expected_result = cases[i][1];
-  if (expected_result === "") {
-    // We use "" to represent that the test vector ought not to parse.
-    // It appears that we're supposed to apply a default canonicalization,
-    // and the escape function escapes too much!
-    expected_result = test_vector.toLowerCase();
-    ['%', ' '].forEach(function(c){
-      expected_result = expected_result.replace(c, escape(c));
-    })
-  }
+  if (expected_result === "")
+    expected_result = test_vector;
   shouldBe("canonicalize('http://" + test_vector + "/')",
            "'http://" + expected_result + "/'");
 }
index be7e89f..e1d4fcf 100644 (file)
@@ -3,7 +3,6 @@ Canonicalization of IPv6 addresses.
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS canonicalize('http:///') is 'http:'
 PASS canonicalize('http://[/') is 'http://[/'
 PASS canonicalize('http://[:/') is 'http://[:/'
 PASS canonicalize('http://]/') is 'http://]/'
@@ -42,16 +41,16 @@ PASS canonicalize('http://[1:2:3:4:5:6::8]/') is 'http://[1:2:3:4:5:6:0:8]/'
 PASS canonicalize('http://[1:2:3:4:5:6:7:8:]/') is 'http://[1:2:3:4:5:6:7:8:]/'
 PASS canonicalize('http://[1:2:3:4:5:6:192.168.0.1:]/') is 'http://[1:2:3:4:5:6:192.168.0.1:]/'
 PASS canonicalize('http://[-1:2:3:4:5:6:7:8]/') is 'http://[-1:2:3:4:5:6:7:8]/'
-PASS canonicalize('http://[1::%1]/') is 'http://[1::%251]/'
-PASS canonicalize('http://[1::%eth0]/') is 'http://[1::%25eth0]/'
-PASS canonicalize('http://[1::%]/') is 'http://[1::%25]/'
-PASS canonicalize('http://[%]/') is 'http://[%25]/'
-PASS canonicalize('http://[::%:]/') is 'http://[::%25:]/'
+FAIL canonicalize('http://[1::%1]/') should be http://[1::%1]/. Was http://[1::%251]/.
+FAIL canonicalize('http://[1::%eth0]/') should be http://[1::%eth0]/. Was http://[1::%25eth0]/.
+FAIL canonicalize('http://[1::%]/') should be http://[1::%]/. Was http://[1::%25]/.
+FAIL canonicalize('http://[%]/') should be http://[%]/. Was http://[%25]/.
+FAIL canonicalize('http://[::%:]/') should be http://[::%:]/. Was http://[::%25:]/.
 PASS canonicalize('http://[:0:0::0:0:8]/') is 'http://[:0:0::0:0:8]/'
 PASS canonicalize('http://[0:0::0:0:8:]/') is 'http://[0:0::0:0:8:]/'
 PASS canonicalize('http://[:0:0::0:0:8:]/') is 'http://[:0:0::0:0:8:]/'
 PASS canonicalize('http://[::192.168..1]/') is 'http://[::192.168..1]/'
-PASS canonicalize('http://[::1 hello]/') is 'http://[::1%20hello]/'
+FAIL canonicalize('http://[::1 hello]/') should be http://[::1 hello]/. Was http://[::1%20hello]/.
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 3f1b558..29cb95c 100644 (file)
@@ -3,7 +3,6 @@ Canonicalization of IPv4 addresses.
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS canonicalize('http:///') is 'http:'
 PASS canonicalize('http://./') is 'http://./'
 PASS canonicalize('http://192.168.0.1/') is 'http://192.168.0.1/'
 PASS canonicalize('http://0300.0250.00.01/') is 'http://192.168.0.1/'
@@ -22,7 +21,7 @@ PASS canonicalize('http://0xc0.052000001/') is 'http://192.168.0.1/'
 PASS canonicalize('http://192.168.1/') is 'http://192.168.0.1/'
 PASS canonicalize('http://192.168.0.0.1/') is 'http://192.168.0.0.1/'
 PASS canonicalize('http://192.168.0.1./') is 'http://192.168.0.1/'
-PASS canonicalize('http://192.168.0.1. hello/') is 'http://192.168.0.1.%20hello/'
+FAIL canonicalize('http://192.168.0.1. hello/') should be http://192.168.0.1. hello/. Was http://192.168.0.1.%20hello/.
 PASS canonicalize('http://192.168.0.1../') is 'http://192.168.0.1../'
 PASS canonicalize('http://192.168..1/') is 'http://192.168..1/'
 PASS canonicalize('http://0x100.0/') is 'http://0x100.0/'
@@ -49,7 +48,7 @@ PASS canonicalize('http://192.168.0xa20001/') is 'http://192.168.0xa20001/'
 PASS canonicalize('http://192.015052000001/') is 'http://192.015052000001/'
 PASS canonicalize('http://0X12C0a80001/') is 'http://0x12c0a80001/'
 PASS canonicalize('http://276.1.2/') is 'http://276.1.2/'
-PASS canonicalize('http://192.168.0.1 hello/') is 'http://192.168.0.1%20hello/'
+FAIL canonicalize('http://192.168.0.1 hello/') should be http://192.168.0.1 hello/. Was http://192.168.0.1%20hello/.
 PASS canonicalize('http://0000000000000300.0x00000000000000fF.00000000000000001/') is 'http://192.255.0.1/'
 PASS canonicalize('http://0000000000000300.0xffffffffFFFFFFFF.3022415481470977/') is 'http://0000000000000300.0xffffffffffffffff.3022415481470977/'
 PASS canonicalize('http://00000000000000000001/') is 'http://0.0.0.1/'