URLSearchParams should be reflective
authorcdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Apr 2017 20:43:26 +0000 (20:43 +0000)
committercdumez@apple.com <cdumez@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 28 Apr 2017 20:43:26 +0000 (20:43 +0000)
https://bugs.webkit.org/show_bug.cgi?id=171345

Reviewed by Alex Christensen.

LayoutTests/imported/w3c:

Merge https://github.com/w3c/web-platform-tests/pull/5736 to gain test
coverage.

* web-platform-tests/url/urlsearchparams-constructor-expected.txt:
* web-platform-tests/url/urlsearchparams-constructor.html:

Source/WebCore:

There was a bug in our implementation of [1] where we would replace
'+' with 0x20 *after* URL-decoding the string, instead of *before*.
This was causing us to replace URL-encoded '+' characters with 0x20.

[1] https://url.spec.whatwg.org/#concept-urlencoded-parser

No new tests, updated existing test.

* platform/URLParser.cpp:

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

LayoutTests/imported/w3c/ChangeLog
LayoutTests/imported/w3c/web-platform-tests/url/urlsearchparams-constructor-expected.txt
LayoutTests/imported/w3c/web-platform-tests/url/urlsearchparams-constructor.html
Source/WebCore/ChangeLog
Source/WebCore/platform/URLParser.cpp

index a4edd2b..3d034d6 100644 (file)
@@ -1,3 +1,16 @@
+2017-04-28  Chris Dumez  <cdumez@apple.com>
+
+        URLSearchParams should be reflective
+        https://bugs.webkit.org/show_bug.cgi?id=171345
+
+        Reviewed by Alex Christensen.
+
+        Merge https://github.com/w3c/web-platform-tests/pull/5736 to gain test
+        coverage.
+
+        * web-platform-tests/url/urlsearchparams-constructor-expected.txt:
+        * web-platform-tests/url/urlsearchparams-constructor.html:
+
 2017-04-28  Ryan Haddad  <ryanhaddad@apple.com>
 
         Rebaseline imported/w3c/web-platform-tests/webrtc/rtcpeerconnection/rtcpeerconnection-idl.html after r215916.
index a64de40..69c64ff 100644 (file)
@@ -7,6 +7,7 @@ PASS URLSearchParams constructor, {} as argument
 PASS URLSearchParams constructor, string. 
 PASS URLSearchParams constructor, object. 
 PASS Parse + 
+PASS Parse encoded + 
 PASS Parse space 
 PASS Parse %20 
 PASS Parse \0 
index 7be2440..d698ed3 100644 (file)
@@ -80,6 +80,17 @@ test(function() {
 }, 'Parse +');
 
 test(function() {
+    const testValue = '+15555555555';
+    const params = new URLSearchParams();
+    params.set('query', testValue);
+    var newParams = new URLSearchParams(params.toString());
+
+    assert_equals(params.toString(), 'query=%2B15555555555');
+    assert_equals(params.get('query'), testValue);
+    assert_equals(newParams.get('query'), testValue);
+}, 'Parse encoded +');
+
+test(function() {
     var params = new URLSearchParams('a=b c');
     assert_equals(params.get('a'), 'b c');
     params = new URLSearchParams('a b=c');
index 4879511..ce04692 100644 (file)
@@ -1,3 +1,20 @@
+2017-04-28  Chris Dumez  <cdumez@apple.com>
+
+        URLSearchParams should be reflective
+        https://bugs.webkit.org/show_bug.cgi?id=171345
+
+        Reviewed by Alex Christensen.
+
+        There was a bug in our implementation of [1] where we would replace
+        '+' with 0x20 *after* URL-decoding the string, instead of *before*.
+        This was causing us to replace URL-encoded '+' characters with 0x20.
+
+        [1] https://url.spec.whatwg.org/#concept-urlencoded-parser
+
+        No new tests, updated existing test.
+
+        * platform/URLParser.cpp:
+
 2017-04-28  Youenn Fablet  <youenn@apple.com>
 
         Adding a runtime flag specific to MediaDevices
index 9d130ee..bf331b9 100644 (file)
@@ -2809,19 +2809,21 @@ std::optional<String> URLParser::formURLDecode(StringView input)
     return String::fromUTF8(percentDecoded.data(), percentDecoded.size());
 }
 
+// https://url.spec.whatwg.org/#concept-urlencoded-parser
 auto URLParser::parseURLEncodedForm(StringView input) -> URLEncodedForm
 {
     URLEncodedForm output;
     for (StringView bytes : input.split('&')) {
-        auto valueStart = bytes.find('=');
-        if (valueStart == notFound) {
-            if (auto name = formURLDecode(bytes))
-                output.append({name.value().replace('+', 0x20), emptyString()});
+        auto equalIndex = bytes.find('=');
+        if (equalIndex == notFound) {
+            auto name = formURLDecode(bytes.toString().replace('+', 0x20));
+            if (name)
+                output.append({ name.value(), emptyString() });
         } else {
-            auto name = formURLDecode(bytes.substring(0, valueStart));
-            auto value = formURLDecode(bytes.substring(valueStart + 1));
+            auto name = formURLDecode(bytes.substring(0, equalIndex).toString().replace('+', 0x20));
+            auto value = formURLDecode(bytes.substring(equalIndex + 1).toString().replace('+', 0x20));
             if (name && value)
-                output.append({name.value().replace('+', 0x20), value.value().replace('+', 0x20)});
+                output.append({ name.value(), value.value() });
         }
     }
     return output;