URLParser should match old URL::parse with %2E in path
authorachristensen@apple.com <achristensen@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Oct 2016 04:40:23 +0000 (04:40 +0000)
committerachristensen@apple.com <achristensen@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 25 Oct 2016 04:40:23 +0000 (04:40 +0000)
https://bugs.webkit.org/show_bug.cgi?id=163929

Reviewed by Alexey Proskuryakov.

LayoutTests/imported/w3c:

* web-platform-tests/url/a-element-expected.txt:
* web-platform-tests/url/a-element-xhtml-expected.txt:
* web-platform-tests/url/url-constructor-expected.txt:

Source/WebCore:

Covered by updated API tests, which show that URLParser now matches URL::parse in these cases.
Also covered by newly failing web platform tests, which were failing before URLParser was enabled.
If https://github.com/whatwg/url/issues/87 is resolved we can change behavior to match.

* platform/URLParser.cpp:
(WebCore::URLParser::isSingleDotPathSegment):
(WebCore::URLParser::isDoubleDotPathSegment):
(WebCore::URLParser::consumeSingleDotPathSegment):
(WebCore::URLParser::consumeDoubleDotPathSegment):
(WebCore::URLParser::parse):
(WebCore::URLParser::isPercentEncodedDot): Deleted.

Tools:

* TestWebKitAPI/Tests/WebCore/URLParser.cpp:
(TestWebKitAPI::TEST_F):

LayoutTests:

* fast/url/path-expected.txt:
* fast/url/standard-url-expected.txt:

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

LayoutTests/ChangeLog
LayoutTests/fast/url/path-expected.txt
LayoutTests/fast/url/standard-url-expected.txt
LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/url/a-element-expected.txt
LayoutTests/imported/w3c/web-platform-tests/url/a-element-xhtml-expected.txt
LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt
Source/WebCore/ChangeLog
Source/WebCore/platform/URLParser.cpp
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/WebCore/URLParser.cpp

index cc391bc4873078a51e52782605ef5c8044a2647a..c70af9da910a90673615235a1aa074fb48a2987e 100644 (file)
@@ -1,3 +1,13 @@
+2016-10-24  Alex Christensen  <achristensen@webkit.org>
+
+        URLParser should match old URL::parse with %2E in path
+        https://bugs.webkit.org/show_bug.cgi?id=163929
+
+        Reviewed by Alexey Proskuryakov.
+
+        * fast/url/path-expected.txt:
+        * fast/url/standard-url-expected.txt:
+
 2016-10-24  Zalan Bujtas  <zalan@apple.com>
 
         Do not update selection rect on dirty lineboxes.
index 7060c69ebf44d4fa83243d7129d5f7efd7f9575f..e9b357d6f9f8c3fd2b876c84b44ad8770b9db911 100644 (file)
@@ -14,9 +14,9 @@ PASS canonicalize('http://example.com/foo/bar/../ton') is 'http://example.com/fo
 PASS canonicalize('http://example.com/foo/bar/../ton/../../a') is 'http://example.com/a'
 PASS canonicalize('http://example.com/foo/../../..') is 'http://example.com/'
 PASS canonicalize('http://example.com/foo/../../../ton') is 'http://example.com/ton'
-PASS canonicalize('http://example.com/foo/%2e') is 'http://example.com/foo/'
-PASS canonicalize('http://example.com/foo/%2e%2') is 'http://example.com/foo/.%2'
-PASS canonicalize('http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar') is 'http://example.com/..bar'
+FAIL canonicalize('http://example.com/foo/%2e') should be http://example.com/foo/. Was http://example.com/foo/%2e.
+FAIL canonicalize('http://example.com/foo/%2e%2') should be http://example.com/foo/.%2. Was http://example.com/foo/%2e%2.
+FAIL canonicalize('http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar') should be http://example.com/..bar. Was http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar.
 PASS canonicalize('http://example.com////../..') is 'http://example.com//'
 PASS canonicalize('http://example.com/foo/bar//../..') is 'http://example.com/foo/'
 PASS canonicalize('http://example.com/foo/bar//..') is 'http://example.com/foo/bar/'
index 6a3cff2def9f310ae112b22133b5c9c30a37cce4..06d4613b35a5a607b2211151bf4ca2644bf5aed5 100644 (file)
@@ -9,7 +9,7 @@ PASS canonicalize('http://[www.google.com]/') is 'http://[www.google.com]/'
 PASS canonicalize('http://www.google.com') is 'http://www.google.com/'
 PASS canonicalize('http:////////user:@google.com:99?foo') is 'http://user@google.com:99/?foo'
 PASS canonicalize('http://192.0x00A80001') is 'http://192.168.0.1/'
-PASS canonicalize('http://www/foo%2Ehtml') is 'http://www/foo.html'
+FAIL canonicalize('http://www/foo%2Ehtml') should be http://www/foo.html. Was http://www/foo%2Ehtml.
 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'
index 29a67b4258e7f170046d3a10778a94ad49856c9a..e7df0db6beb762cd1de57b642ffe7d19c02c33c7 100644 (file)
@@ -1,3 +1,14 @@
+2016-10-24  Alex Christensen  <achristensen@webkit.org>
+
+        URLParser should match old URL::parse with %2E in path
+        https://bugs.webkit.org/show_bug.cgi?id=163929
+
+        Reviewed by Alexey Proskuryakov.
+
+        * web-platform-tests/url/a-element-expected.txt:
+        * web-platform-tests/url/a-element-xhtml-expected.txt:
+        * web-platform-tests/url/url-constructor-expected.txt:
+
 2016-10-24  Ryan Haddad  <ryanhaddad@apple.com>
 
         Unreviewed, rolling out r207795.
index 40a911f9c0c8f870421171de0b63495b6ce9835a..0c934a263aba83b39eafb1426b3da2bd8f6a096a 100644 (file)
@@ -126,9 +126,9 @@ PASS Parsing: <http://example.com/foo/bar/../ton> against <about:blank>
 PASS Parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> 
 PASS Parsing: <http://example.com/foo/../../..> against <about:blank> 
 PASS Parsing: <http://example.com/foo/../../../ton> against <about:blank> 
-PASS Parsing: <http://example.com/foo/%2e> against <about:blank> 
-PASS Parsing: <http://example.com/foo/%2e%2> against <about:blank> 
-PASS Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> 
+FAIL Parsing: <http://example.com/foo/%2e> against <about:blank> assert_equals: href expected "http://example.com/foo/" but got "http://example.com/foo/%2e"
+FAIL Parsing: <http://example.com/foo/%2e%2> against <about:blank> assert_equals: href expected "http://example.com/foo/.%2" but got "http://example.com/foo/%2e%2"
+FAIL Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> assert_equals: href expected "http://example.com/..bar" but got "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar"
 PASS Parsing: <http://example.com////../..> against <about:blank> 
 PASS Parsing: <http://example.com/foo/bar//../..> against <about:blank> 
 PASS Parsing: <http://example.com/foo/bar//..> against <about:blank> 
@@ -157,8 +157,8 @@ FAIL Parsing: <data:test# »> against <about:blank> assert_equals: href expected
 PASS Parsing: <http://[www.google.com]/> against <about:blank> 
 PASS Parsing: <http://www.google.com> against <about:blank> 
 PASS Parsing: <http://192.0x00A80001> against <about:blank> 
-PASS Parsing: <http://www/foo%2Ehtml> against <about:blank> 
-PASS Parsing: <http://www/foo/%2E/html> against <about:blank> 
+FAIL Parsing: <http://www/foo%2Ehtml> against <about:blank> assert_equals: href expected "http://www/foo.html" but got "http://www/foo%2Ehtml"
+FAIL Parsing: <http://www/foo/%2E/html> against <about:blank> assert_equals: href expected "http://www/foo/html" but got "http://www/foo/%2E/html"
 PASS Parsing: <http://user:pass@/> against <about:blank> 
 PASS Parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> 
 PASS Parsing: <http:\\www.google.com\foo> against <about:blank> 
index 40a911f9c0c8f870421171de0b63495b6ce9835a..0c934a263aba83b39eafb1426b3da2bd8f6a096a 100644 (file)
@@ -126,9 +126,9 @@ PASS Parsing: <http://example.com/foo/bar/../ton> against <about:blank>
 PASS Parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> 
 PASS Parsing: <http://example.com/foo/../../..> against <about:blank> 
 PASS Parsing: <http://example.com/foo/../../../ton> against <about:blank> 
-PASS Parsing: <http://example.com/foo/%2e> against <about:blank> 
-PASS Parsing: <http://example.com/foo/%2e%2> against <about:blank> 
-PASS Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> 
+FAIL Parsing: <http://example.com/foo/%2e> against <about:blank> assert_equals: href expected "http://example.com/foo/" but got "http://example.com/foo/%2e"
+FAIL Parsing: <http://example.com/foo/%2e%2> against <about:blank> assert_equals: href expected "http://example.com/foo/.%2" but got "http://example.com/foo/%2e%2"
+FAIL Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> assert_equals: href expected "http://example.com/..bar" but got "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar"
 PASS Parsing: <http://example.com////../..> against <about:blank> 
 PASS Parsing: <http://example.com/foo/bar//../..> against <about:blank> 
 PASS Parsing: <http://example.com/foo/bar//..> against <about:blank> 
@@ -157,8 +157,8 @@ FAIL Parsing: <data:test# »> against <about:blank> assert_equals: href expected
 PASS Parsing: <http://[www.google.com]/> against <about:blank> 
 PASS Parsing: <http://www.google.com> against <about:blank> 
 PASS Parsing: <http://192.0x00A80001> against <about:blank> 
-PASS Parsing: <http://www/foo%2Ehtml> against <about:blank> 
-PASS Parsing: <http://www/foo/%2E/html> against <about:blank> 
+FAIL Parsing: <http://www/foo%2Ehtml> against <about:blank> assert_equals: href expected "http://www/foo.html" but got "http://www/foo%2Ehtml"
+FAIL Parsing: <http://www/foo/%2E/html> against <about:blank> assert_equals: href expected "http://www/foo/html" but got "http://www/foo/%2E/html"
 PASS Parsing: <http://user:pass@/> against <about:blank> 
 PASS Parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> 
 PASS Parsing: <http:\\www.google.com\foo> against <about:blank> 
index 64f6872c8edcb5723528b808717c5c08306fced6..01c8060cbb287525ded035d6e247f2fa5ae9a433 100644 (file)
@@ -130,9 +130,9 @@ PASS Parsing: <http://example.com/foo/bar/../ton> against <about:blank>
 PASS Parsing: <http://example.com/foo/bar/../ton/../../a> against <about:blank> 
 PASS Parsing: <http://example.com/foo/../../..> against <about:blank> 
 PASS Parsing: <http://example.com/foo/../../../ton> against <about:blank> 
-PASS Parsing: <http://example.com/foo/%2e> against <about:blank> 
-PASS Parsing: <http://example.com/foo/%2e%2> against <about:blank> 
-PASS Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> 
+FAIL Parsing: <http://example.com/foo/%2e> against <about:blank> assert_equals: href expected "http://example.com/foo/" but got "http://example.com/foo/%2e"
+FAIL Parsing: <http://example.com/foo/%2e%2> against <about:blank> assert_equals: href expected "http://example.com/foo/.%2" but got "http://example.com/foo/%2e%2"
+FAIL Parsing: <http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar> against <about:blank> assert_equals: href expected "http://example.com/..bar" but got "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar"
 PASS Parsing: <http://example.com////../..> against <about:blank> 
 PASS Parsing: <http://example.com/foo/bar//../..> against <about:blank> 
 PASS Parsing: <http://example.com/foo/bar//..> against <about:blank> 
@@ -161,8 +161,8 @@ FAIL Parsing: <data:test# »> against <about:blank> assert_equals: href expected
 PASS Parsing: <http://[www.google.com]/> against <about:blank> 
 PASS Parsing: <http://www.google.com> against <about:blank> 
 PASS Parsing: <http://192.0x00A80001> against <about:blank> 
-PASS Parsing: <http://www/foo%2Ehtml> against <about:blank> 
-PASS Parsing: <http://www/foo/%2E/html> against <about:blank> 
+FAIL Parsing: <http://www/foo%2Ehtml> against <about:blank> assert_equals: href expected "http://www/foo.html" but got "http://www/foo%2Ehtml"
+FAIL Parsing: <http://www/foo/%2E/html> against <about:blank> assert_equals: href expected "http://www/foo/html" but got "http://www/foo/%2E/html"
 PASS Parsing: <http://user:pass@/> against <about:blank> 
 PASS Parsing: <http://%25DOMAIN:foobar@foodomain.com/> against <about:blank> 
 PASS Parsing: <http:\\www.google.com\foo> against <about:blank> 
index bb2d9a36bdcd43fc2f1540fd3c4026afbcda9b7f..8aefc5df58574ff1b902586176d24a18fe0fad6c 100644 (file)
@@ -1,3 +1,22 @@
+2016-10-24  Alex Christensen  <achristensen@webkit.org>
+
+        URLParser should match old URL::parse with %2E in path
+        https://bugs.webkit.org/show_bug.cgi?id=163929
+
+        Reviewed by Alexey Proskuryakov.
+
+        Covered by updated API tests, which show that URLParser now matches URL::parse in these cases.
+        Also covered by newly failing web platform tests, which were failing before URLParser was enabled.
+        If https://github.com/whatwg/url/issues/87 is resolved we can change behavior to match.
+
+        * platform/URLParser.cpp:
+        (WebCore::URLParser::isSingleDotPathSegment):
+        (WebCore::URLParser::isDoubleDotPathSegment):
+        (WebCore::URLParser::consumeSingleDotPathSegment):
+        (WebCore::URLParser::consumeDoubleDotPathSegment):
+        (WebCore::URLParser::parse):
+        (WebCore::URLParser::isPercentEncodedDot): Deleted.
+
 2016-10-24  Zalan Bujtas  <zalan@apple.com>
 
         Do not update selection rect on dirty lineboxes.
index a4f55e4e01e24e68fe52fcb3ea20e713bc4ed4a2..5a65e04a902a16226675ecad5149c54bf6131f84 100644 (file)
@@ -891,26 +891,6 @@ void URLParser::copyURLPartsUntil(const URL& base, URLPart part, const CodePoint
     ASSERT_NOT_REACHED();
 }
 
-static const char* dotASCIICode = "2e";
-
-template<typename CharacterType>
-ALWAYS_INLINE bool URLParser::isPercentEncodedDot(CodePointIterator<CharacterType> c)
-{
-    if (c.atEnd())
-        return false;
-    if (*c != '%')
-        return false;
-    advance<CharacterType, ReportSyntaxViolation::No>(c);
-    if (c.atEnd())
-        return false;
-    if (*c != dotASCIICode[0])
-        return false;
-    advance<CharacterType, ReportSyntaxViolation::No>(c);
-    if (c.atEnd())
-        return false;
-    return toASCIILower(*c) == dotASCIICode[1];
-}
-
 template<typename CharacterType>
 ALWAYS_INLINE bool URLParser::isSingleDotPathSegment(CodePointIterator<CharacterType> c)
 {
@@ -920,18 +900,6 @@ ALWAYS_INLINE bool URLParser::isSingleDotPathSegment(CodePointIterator<Character
         advance<CharacterType, ReportSyntaxViolation::No>(c);
         return c.atEnd() || isSlashQuestionOrHash(*c);
     }
-    if (*c != '%')
-        return false;
-    advance<CharacterType, ReportSyntaxViolation::No>(c);
-    if (c.atEnd() || *c != dotASCIICode[0])
-        return false;
-    advance<CharacterType, ReportSyntaxViolation::No>(c);
-    if (c.atEnd())
-        return false;
-    if (toASCIILower(*c) == dotASCIICode[1]) {
-        advance<CharacterType, ReportSyntaxViolation::No>(c);
-        return c.atEnd() || isSlashQuestionOrHash(*c);
-    }
     return false;
 }
 
@@ -944,18 +912,6 @@ ALWAYS_INLINE bool URLParser::isDoubleDotPathSegment(CodePointIterator<Character
         advance<CharacterType, ReportSyntaxViolation::No>(c);
         return isSingleDotPathSegment(c);
     }
-    if (*c != '%')
-        return false;
-    advance<CharacterType, ReportSyntaxViolation::No>(c);
-    if (c.atEnd() || *c != dotASCIICode[0])
-        return false;
-    advance<CharacterType, ReportSyntaxViolation::No>(c);
-    if (c.atEnd())
-        return false;
-    if (toASCIILower(*c) == dotASCIICode[1]) {
-        advance<CharacterType, ReportSyntaxViolation::No>(c);
-        return isSingleDotPathSegment(c);
-    }
     return false;
 }
 
@@ -963,27 +919,12 @@ template<typename CharacterType>
 void URLParser::consumeSingleDotPathSegment(CodePointIterator<CharacterType>& c)
 {
     ASSERT(isSingleDotPathSegment(c));
-    if (*c == '.') {
-        advance(c);
-        if (!c.atEnd()) {
-            if (*c == '/' || *c == '\\')
-                advance(c);
-            else
-                ASSERT(*c == '?' || *c == '#');
-        }
-    } else {
-        ASSERT(*c == '%');
-        advance(c);
-        ASSERT(*c == dotASCIICode[0]);
-        advance(c);
-        ASSERT(toASCIILower(*c) == dotASCIICode[1]);
-        advance(c);
-        if (!c.atEnd()) {
-            if (*c == '/' || *c == '\\')
-                advance(c);
-            else
-                ASSERT(*c == '?' || *c == '#');
-        }
+    advance(c);
+    if (!c.atEnd()) {
+        if (*c == '/' || *c == '\\')
+            advance(c);
+        else
+            ASSERT(*c == '?' || *c == '#');
     }
 }
 
@@ -991,16 +932,7 @@ template<typename CharacterType>
 void URLParser::consumeDoubleDotPathSegment(CodePointIterator<CharacterType>& c)
 {
     ASSERT(isDoubleDotPathSegment(c));
-    if (*c == '.')
-        advance(c);
-    else {
-        ASSERT(*c == '%');
-        advance(c);
-        ASSERT(*c == dotASCIICode[0]);
-        advance(c);
-        ASSERT(toASCIILower(*c) == dotASCIICode[1]);
-        advance(c);
-    }
+    advance(c);
     consumeSingleDotPathSegment(c);
 }
 
@@ -1723,17 +1655,6 @@ void URLParser::parse(const CharacterType* input, const unsigned length, const U
                 state = State::Fragment;
                 break;
             }
-            if (UNLIKELY(isPercentEncodedDot(c))) {
-                syntaxViolation(c);
-                appendToASCIIBuffer('.');
-                ASSERT(*c == '%');
-                advance(c);
-                ASSERT(*c == dotASCIICode[0]);
-                advance(c);
-                ASSERT(toASCIILower(*c) == dotASCIICode[1]);
-                advance(c);
-                break;
-            }
             utf8PercentEncode<isInDefaultEncodeSet>(c);
             ++c;
             break;
index deaa4df28a6a2ae258222ff2fa5b145c0060d049..cd855e0c6e9de0abb49afe3a1e80958477a227f6 100644 (file)
@@ -1,3 +1,13 @@
+2016-10-24  Alex Christensen  <achristensen@webkit.org>
+
+        URLParser should match old URL::parse with %2E in path
+        https://bugs.webkit.org/show_bug.cgi?id=163929
+
+        Reviewed by Alexey Proskuryakov.
+
+        * TestWebKitAPI/Tests/WebCore/URLParser.cpp:
+        (TestWebKitAPI::TEST_F):
+
 2016-10-24  Ryan Haddad  <ryanhaddad@apple.com>
 
         Unreviewed, rolling out r207795.
index f3dcddfec9acedc123ea45a63c397a268ce80e07..95be5e5232ea8d9f582916da2f29b010814ec6fd 100644 (file)
@@ -596,42 +596,18 @@ TEST_F(URLParserTest, ParserDifferences)
     checkURLDifferences("http://127.0.0.01/",
         {"http", "", "", "127.0.0.1", 0, "/", "", "", "http://127.0.0.1/"},
         {"http", "", "", "127.0.0.01", 0, "/", "", "", "http://127.0.0.01/"});
-    checkURLDifferences("http://example.com/path1/.%2e",
-        {"http", "", "", "example.com", 0, "/", "", "", "http://example.com/"},
-        {"http", "", "", "example.com", 0, "/path1/.%2e", "", "", "http://example.com/path1/.%2e"});
-    checkURLDifferences("http://example.com/path1/.%2E",
-        {"http", "", "", "example.com", 0, "/", "", "", "http://example.com/"},
-        {"http", "", "", "example.com", 0, "/path1/.%2E", "", "", "http://example.com/path1/.%2E"});
-    checkURLDifferences("http://example.com/path1/.%2E/",
-        {"http", "", "", "example.com", 0, "/", "", "", "http://example.com/"},
-        {"http", "", "", "example.com", 0, "/path1/.%2E/", "", "", "http://example.com/path1/.%2E/"});
-    checkURLDifferences("http://example.com/path1/%2e.",
-        {"http", "", "", "example.com", 0, "/", "", "", "http://example.com/"},
-        {"http", "", "", "example.com", 0, "/path1/%2e.", "", "", "http://example.com/path1/%2e."});
-    checkURLDifferences("http://example.com/path1/%2E%2e",
-        {"http", "", "", "example.com", 0, "/", "", "", "http://example.com/"},
-        {"http", "", "", "example.com", 0, "/path1/%2E%2e", "", "", "http://example.com/path1/%2E%2e"});
-    checkURLDifferences("http://example.com/path1/%2e",
-        {"http", "", "", "example.com", 0, "/path1/", "", "", "http://example.com/path1/"},
-        {"http", "", "", "example.com", 0, "/path1/%2e", "", "", "http://example.com/path1/%2e"});
-    checkURLDifferences("http://example.com/path1/%2E",
-        {"http", "", "", "example.com", 0, "/path1/", "", "", "http://example.com/path1/"},
-        {"http", "", "", "example.com", 0, "/path1/%2E", "", "", "http://example.com/path1/%2E"});
-    checkURLDifferences("http://example.com/path1/%2E/",
-        {"http", "", "", "example.com", 0, "/path1/", "", "", "http://example.com/path1/"},
-        {"http", "", "", "example.com", 0, "/path1/%2E/", "", "", "http://example.com/path1/%2E/"});
-    checkURLDifferences("http://example.com/path1/path2/%2e?query",
-        {"http", "", "", "example.com", 0, "/path1/path2/", "query", "", "http://example.com/path1/path2/?query"},
-        {"http", "", "", "example.com", 0, "/path1/path2/%2e", "query", "", "http://example.com/path1/path2/%2e?query"});
-    checkURLDifferences("http://example.com/path1/path2/%2e%2e?query",
-        {"http", "", "", "example.com", 0, "/path1/", "query", "", "http://example.com/path1/?query"},
-        {"http", "", "", "example.com", 0, "/path1/path2/%2e%2e", "query", "", "http://example.com/path1/path2/%2e%2e?query"});
-    checkURLDifferences("http://example.com/path1/path2/%2e#fragment",
-        {"http", "", "", "example.com", 0, "/path1/path2/", "", "fragment", "http://example.com/path1/path2/#fragment"},
-        {"http", "", "", "example.com", 0, "/path1/path2/%2e", "", "fragment", "http://example.com/path1/path2/%2e#fragment"});
-    checkURLDifferences("http://example.com/path1/path2/%2e%2e#fragment",
-        {"http", "", "", "example.com", 0, "/path1/", "", "fragment", "http://example.com/path1/#fragment"},
-        {"http", "", "", "example.com", 0, "/path1/path2/%2e%2e", "", "fragment", "http://example.com/path1/path2/%2e%2e#fragment"});
+    checkURL("http://example.com/path1/.%2e", {"http", "", "", "example.com", 0, "/path1/.%2e", "", "", "http://example.com/path1/.%2e"});
+    checkURL("http://example.com/path1/.%2E", {"http", "", "", "example.com", 0, "/path1/.%2E", "", "", "http://example.com/path1/.%2E"});
+    checkURL("http://example.com/path1/.%2E/", {"http", "", "", "example.com", 0, "/path1/.%2E/", "", "", "http://example.com/path1/.%2E/"});
+    checkURL("http://example.com/path1/%2e.", {"http", "", "", "example.com", 0, "/path1/%2e.", "", "", "http://example.com/path1/%2e."});
+    checkURL("http://example.com/path1/%2E%2e", {"http", "", "", "example.com", 0, "/path1/%2E%2e", "", "", "http://example.com/path1/%2E%2e"});
+    checkURL("http://example.com/path1/%2e", {"http", "", "", "example.com", 0, "/path1/%2e", "", "", "http://example.com/path1/%2e"});
+    checkURL("http://example.com/path1/%2E", {"http", "", "", "example.com", 0, "/path1/%2E", "", "", "http://example.com/path1/%2E"});
+    checkURL("http://example.com/path1/%2E/", {"http", "", "", "example.com", 0, "/path1/%2E/", "", "", "http://example.com/path1/%2E/"});
+    checkURL("http://example.com/path1/path2/%2e?query", {"http", "", "", "example.com", 0, "/path1/path2/%2e", "query", "", "http://example.com/path1/path2/%2e?query"});
+    checkURL("http://example.com/path1/path2/%2e%2e?query", {"http", "", "", "example.com", 0, "/path1/path2/%2e%2e", "query", "", "http://example.com/path1/path2/%2e%2e?query"});
+    checkURL("http://example.com/path1/path2/%2e#fragment", {"http", "", "", "example.com", 0, "/path1/path2/%2e", "", "fragment", "http://example.com/path1/path2/%2e#fragment"});
+    checkURL("http://example.com/path1/path2/%2e%2e#fragment", {"http", "", "", "example.com", 0, "/path1/path2/%2e%2e", "", "fragment", "http://example.com/path1/path2/%2e%2e#fragment"});
     checkURLDifferences("file://[0:a:0:0:b:c:0:0]/path",
         {"file", "", "", "[0:a::b:c:0:0]", 0, "/path", "", "", "file://[0:a::b:c:0:0]/path"},
         {"file", "", "", "[0:a:0:0:b:c:0:0]", 0, "/path", "", "", "file://[0:a:0:0:b:c:0:0]/path"});
@@ -734,9 +710,8 @@ TEST_F(URLParserTest, ParserDifferences)
     checkURLDifferences(utf16String(u"http://0Xc0.0250.01"),
         {"http", "", "", "192.168.0.1", 0, "/", "", "", "http://192.168.0.1/"},
         {"http", "", "", "0xc0.0250.01", 0, "/", "", "", "http://0xc0.0250.01/"});
-    checkURLDifferences("http://host/path%2e.%2E",
-        {"http", "", "", "host", 0, "/path...", "", "", "http://host/path..."},
-        {"http", "", "", "host", 0, "/path%2e.%2E", "", "", "http://host/path%2e.%2E"});
+
+    checkURL("http://host/path%2e.%2E", {"http", "", "", "host", 0, "/path%2e.%2E", "", "", "http://host/path%2e.%2E"});
 
     checkRelativeURLDifferences(utf16String(u"http://foo:💩@example.com/bar"), "http://other.com/",
         {"http", "foo", utf16String(u"💩"), "example.com", 0, "/bar", "", "", "http://foo:%F0%9F%92%A9@example.com/bar"},