Skip to content

Commit

Permalink
url: percent-encode more characters in path URL queries
Browse files Browse the repository at this point in the history
In particular, make sure to percent-encode # as otherwise URL setters
may fail roundtripping:

    u = new URL("abc:hello?query#frag");
    u.search = "?query#bad";
    console.log(u.href);  // before: "abc:hello?query#bad#frag"
                          // after:  "abc:hello?query%23bad#frag"

New behavior matches Safari and the spec, except for the apostrophe
character: Chrome encodes ' in non-special URL queries but not Safari
or the spec.

Bug: 1212545
Change-Id: Ie3b14f84bda664169f13ea36a4f739e2eb4ebc8b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2891251
Reviewed-by: Mike West <mkwst@chromium.org>
Commit-Queue: Timothy Gu <timothygu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#907326}
  • Loading branch information
TimothyGu authored and Chromium LUCI CQ committed Jul 31, 2021
1 parent 96cf1b6 commit b443c71
Show file tree
Hide file tree
Showing 25 changed files with 60 additions and 90 deletions.
Expand Up @@ -13,17 +13,16 @@ FAIL src should be foo://user:tête à tête@host/. Was foo://user:t%C3%AAte %C3
PASS src is expected
PASS src is expected
FAIL src should be foo://user:password@[xxxxx]/tête à tête/. Was foo://user:password@[xxxxx]/t%C3%AAte %C3%A0 t%C3%AAte/.
FAIL src should be foo://user:password@[?tête à tête/. Was foo://user:password@[?t%C3%AAte %C3%A0 t%C3%AAte/.
FAIL src should be foo://user:password@[?tête à tête]/. Was foo://user:password@[?t%C3%AAte %C3%A0 t%C3%AAte]/.
FAIL src should be foo://user:password@[?tête à tête/. Was foo://user:password@[?t%C3%AAte%20%C3%A0%20t%C3%AAte/.
FAIL src should be foo://user:password@[?tête à tête]/. Was foo://user:password@[?t%C3%AAte%20%C3%A0%20t%C3%AAte]/.
FAIL src should be foo://user:password@host:tête à tête/. Was foo://user:password@host:t%C3%AAte %C3%A0 t%C3%AAte/.
FAIL src should be foo://user:password@host:80tête à tête. Was foo://user:password@host:80t%C3%AAte %C3%A0 t%C3%AAte.
FAIL src should be foo://user:password@host:tête à tête/. Was foo://user:password@host:t%C3%AAte %C3%A0 t%C3%AAte/.
FAIL src should be foo://user:password@host:80tête à tête. Was foo://user:password@host:80t%C3%AAte %C3%A0 t%C3%AAte.
FAIL src should be ws:/tête. Was ws://xn--tte-fma/.
FAIL src should be ftp:/tête. Was ftp://xn--tte-fma/.
FAIL src should be http:/tête. Was http://xn--tte-fma/.
FAIL src should be https:/tête. Was https://xn--tte-fma/.
FAIL src should be gopher:/tête. Was gopher:/t%C3%AAte.
FAIL src should be ws://host:tête. Was ws://host:t%C3%AAte/.
FAIL src should be ftp://host:tête. Was ftp://host:t%C3%AAte/.
FAIL src should be http://host:tête. Was http://host:t%C3%AAte/.
FAIL src should be https://host:tête. Was https://host:t%C3%AAte/.
PASS successfullyParsed is true

TEST COMPLETE
Expand Down
11 changes: 5 additions & 6 deletions third_party/blink/web_tests/fast/url/invalid-urls-utf8.html
Expand Up @@ -36,12 +36,11 @@
'foo://user:password@host:80tête à tête',
'foo://user:password@host:tête à tête/',
'foo://user:password@host:80tête à tête',
// The schemes "ws:", "ftp:", "http:", "https:", "gother:" take a shortcut during parsing so we test them separately.
'ws:/tête',
'ftp:/tête',
'http:/tête',
'https:/tête',
'gopher:/tête',
// The schemes "ws:", "ftp:", "http:", "https:" take a shortcut during parsing so we test them separately.
'ws://host:tête',
'ftp://host:tête',
'http://host:tête',
'https://host:tête',
];

for (var i = 0; i < testSet.length; ++i) {
Expand Down
@@ -1,4 +1,4 @@
CONSOLE ERROR: line 3: Unsafe attempt to initiate navigation for frame with URL 'http://127.0.0.1:8000/security/no-popup-from-sandbox-top.html' from frame with URL 'data:text/html,%0A <script>%0A var win = window.open('about:blank', '_top');%0A console.log(win ? 'FAIL' : 'PASS');%0A </script>'. The frame attempting navigation of the top-level window is sandboxed, but the flag of 'allow-top-navigation' or 'allow-top-navigation-by-user-activation' is not set.
CONSOLE ERROR: line 3: Unsafe attempt to initiate navigation for frame with URL 'http://127.0.0.1:8000/security/no-popup-from-sandbox-top.html' from frame with URL 'data:text/html,%0A <script>%0A var win = window.open('about:blank', '_top');%0A console.log(win ?%20%27FAIL%27%20:%20%27PASS%27);%0A%20%20%20%20%20%20%20%3C/script%3E'. The frame attempting navigation of the top-level window is sandboxed, but the flag of 'allow-top-navigation' or 'allow-top-navigation-by-user-activation' is not set.

CONSOLE MESSAGE: line 4: PASS
To run this test outside of DumpRenderTree, please disable your popup blocker!
Expand Up @@ -13,17 +13,16 @@ FAIL src should be foo://user:tête à tête@host/. Was foo://user:t%C3%AAte %C3
PASS src is expected
PASS src is expected
FAIL src should be foo://user:password@[xxxxx]/tête à tête/. Was foo://user:password@[xxxxx]/t%C3%AAte %C3%A0 t%C3%AAte/.
FAIL src should be foo://user:password@[?tête à tête/. Was foo://user:password@[?t%C3%AAte %C3%A0 t%C3%AAte/.
FAIL src should be foo://user:password@[?tête à tête]/. Was foo://user:password@[?t%C3%AAte %C3%A0 t%C3%AAte]/.
FAIL src should be foo://user:password@[?tête à tête/. Was foo://user:password@[?t%C3%AAte%20%C3%A0%20t%C3%AAte/.
FAIL src should be foo://user:password@[?tête à tête]/. Was foo://user:password@[?t%C3%AAte%20%C3%A0%20t%C3%AAte]/.
FAIL src should be foo://user:password@host:tête à tête/. Was foo://user:password@host:t%C3%AAte %C3%A0 t%C3%AAte/.
FAIL src should be foo://user:password@host:80tête à tête. Was foo://user:password@host:80t%C3%AAte %C3%A0 t%C3%AAte.
FAIL src should be foo://user:password@host:tête à tête/. Was foo://user:password@host:t%C3%AAte %C3%A0 t%C3%AAte/.
FAIL src should be foo://user:password@host:80tête à tête. Was foo://user:password@host:80t%C3%AAte %C3%A0 t%C3%AAte.
FAIL src should be ws:/tête. Was ws://xn--tte-fma/.
FAIL src should be ftp:/tête. Was ftp://xn--tte-fma/.
FAIL src should be http:/tête. Was http://127.0.0.1:8000/t%C3%AAte.
FAIL src should be https:/tête. Was https://xn--tte-fma/.
FAIL src should be gopher:/tête. Was gopher://xn--tte-fma/.
FAIL src should be ws://host:tête. Was ws://host:t%C3%AAte/.
FAIL src should be ftp://host:tête. Was ftp://host:t%C3%AAte/.
FAIL src should be http://host:tête. Was http://host:t%C3%AAte/.
FAIL src should be https://host:tête. Was https://host:t%C3%AAte/.
PASS successfullyParsed is true

TEST COMPLETE
Expand Down

This file was deleted.

Expand Up @@ -313,7 +313,7 @@ PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/>
PASS Parsing: <https://@@@example> against <http://doesnotmatter/>
PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/>
PASS Parsing: <http://host/?'> against <about:blank>
FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got ""
FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: href expected "notspecial://host/?'" but got "notspecial://host/?%27"
PASS Parsing: </some/path> against <http://user@example.org/smth>
PASS Parsing: <> against <http://user:pass@example.org:21/smth>
PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth>
Expand Down Expand Up @@ -637,7 +637,7 @@ FAIL Parsing: <foo://!"$%&'()*+,-.;=_`{}~/> against <about:blank> assert_equals:
FAIL Parsing: <wss://!"$&'()*+,-.;=_`{}~/> against <about:blank> assert_equals: href expected "wss://!\"$&'()*+,-.;=_`{}~/" but got "wss://%21%22%24%26%27%28%29%2A+%2C-.%3B%3D_%60%7B%7D%7E/"
FAIL Parsing: <foo://host/ !"$%&'()*+,-./:;<=>@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]^_%60%7B|%7D~" but got "foo://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~"
FAIL Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\]^_`{|}~> against <about:blank> assert_equals: href expected "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]^_%60%7B|%7D~" but got "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]%5E_%60%7B%7C%7D~"
FAIL Parsing: <foo://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/dir/?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~" but got "foo://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
FAIL Parsing: <foo://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/dir/?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~" but got "foo://host/dir/?%20!%22$%&%27()*+,-./:;%3C=%3E?@[\\]^_`{|}~"
PASS Parsing: <wss://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank>
FAIL Parsing: <foo://host/dir/# !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: host expected "host" but got ""
PASS Parsing: <wss://host/dir/# !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank>
Expand Down
Expand Up @@ -314,7 +314,7 @@ PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/>
PASS Parsing: <https://@@@example> against <http://doesnotmatter/>
PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/>
PASS Parsing: <http://host/?'> against <about:blank>
FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got ""
FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: href expected "notspecial://host/?'" but got "notspecial://host/?%27"
PASS Parsing: </some/path> against <http://user@example.org/smth>
PASS Parsing: <> against <http://user:pass@example.org:21/smth>
PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth>
Expand Down Expand Up @@ -636,7 +636,7 @@ FAIL Parsing: <foo://!"$%&'()*+,-.;=_`{}~/> against <about:blank> assert_equals:
FAIL Parsing: <wss://!"$&'()*+,-.;=_`{}~/> against <about:blank> assert_equals: href expected "wss://!\"$&'()*+,-.;=_`{}~/" but got "wss://%21%22%24%26%27%28%29%2A+%2C-.%3B%3D_%60%7B%7D%7E/"
FAIL Parsing: <foo://host/ !"$%&'()*+,-./:;<=>@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]^_%60%7B|%7D~" but got "foo://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~"
FAIL Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\]^_`{|}~> against <about:blank> assert_equals: href expected "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]^_%60%7B|%7D~" but got "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]%5E_%60%7B%7C%7D~"
FAIL Parsing: <foo://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/dir/?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~" but got "foo://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
FAIL Parsing: <foo://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/dir/?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~" but got "foo://host/dir/?%20!%22$%&%27()*+,-./:;%3C=%3E?@[\\]^_`{|}~"
PASS Parsing: <wss://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank>
FAIL Parsing: <foo://host/dir/# !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: host expected "host" but got ""
PASS Parsing: <wss://host/dir/# !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank>
Expand Down
Expand Up @@ -340,7 +340,7 @@ PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/>
PASS Parsing: <https://@@@example> against <http://doesnotmatter/>
PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/>
PASS Parsing: <http://host/?'> against <about:blank>
FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got ""
FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: href expected "notspecial://host/?'" but got "notspecial://host/?%27"
PASS Parsing: </some/path> against <http://user@example.org/smth>
PASS Parsing: <> against <http://user:pass@example.org:21/smth>
PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth>
Expand Down Expand Up @@ -722,7 +722,7 @@ FAIL Parsing: <foo://!"$%&'()*+,-.;=_`{}~/> against <about:blank> assert_equals:
FAIL Parsing: <wss://!"$&'()*+,-.;=_`{}~/> against <about:blank> Failed to construct 'URL': Invalid URL
FAIL Parsing: <foo://host/ !"$%&'()*+,-./:;<=>@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]^_%60%7B|%7D~" but got "foo://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~"
FAIL Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\]^_`{|}~> against <about:blank> assert_equals: href expected "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]^_%60%7B|%7D~" but got "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]%5E_%60%7B%7C%7D~"
FAIL Parsing: <foo://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/dir/?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~" but got "foo://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
FAIL Parsing: <foo://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/dir/?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~" but got "foo://host/dir/?%20!%22$%&%27()*+,-./:;%3C=%3E?@[\\]^_`{|}~"
PASS Parsing: <wss://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank>
FAIL Parsing: <foo://host/dir/# !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: host expected "host" but got ""
PASS Parsing: <wss://host/dir/# !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank>
Expand Down
Expand Up @@ -340,7 +340,7 @@ PASS Parsing: <https://@test@test@example:800/> against <http://doesnotmatter/>
PASS Parsing: <https://@@@example> against <http://doesnotmatter/>
PASS Parsing: <http://`{}:`{}@h/`{}?`{}> against <http://doesnotmatter/>
PASS Parsing: <http://host/?'> against <about:blank>
FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: host expected "host" but got ""
FAIL Parsing: <notspecial://host/?'> against <about:blank> assert_equals: href expected "notspecial://host/?'" but got "notspecial://host/?%27"
PASS Parsing: </some/path> against <http://user@example.org/smth>
PASS Parsing: <> against <http://user:pass@example.org:21/smth>
PASS Parsing: </some/path> against <http://user:pass@example.org:21/smth>
Expand Down Expand Up @@ -722,7 +722,7 @@ FAIL Parsing: <foo://!"$%&'()*+,-.;=_`{}~/> against <about:blank> assert_equals:
FAIL Parsing: <wss://!"$&'()*+,-.;=_`{}~/> against <about:blank> Failed to construct 'URL': Invalid URL
FAIL Parsing: <foo://host/ !"$%&'()*+,-./:;<=>@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]^_%60%7B|%7D~" but got "foo://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~"
FAIL Parsing: <wss://host/ !"$%&'()*+,-./:;<=>@[\]^_`{|}~> against <about:blank> assert_equals: href expected "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]^_%60%7B|%7D~" but got "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]%5E_%60%7B%7C%7D~"
FAIL Parsing: <foo://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/dir/?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~" but got "foo://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~"
FAIL Parsing: <foo://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: href expected "foo://host/dir/?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~" but got "foo://host/dir/?%20!%22$%&%27()*+,-./:;%3C=%3E?@[\\]^_`{|}~"
PASS Parsing: <wss://host/dir/? !"$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank>
FAIL Parsing: <foo://host/dir/# !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank> assert_equals: host expected "host" but got ""
PASS Parsing: <wss://host/dir/# !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~> against <about:blank>
Expand Down
Expand Up @@ -410,9 +410,9 @@ PASS <area>: Setting <https://example.net?lang=en-US>.search = ''
PASS <a>: Setting <https://example.net>.search = ''
PASS <area>: Setting <https://example.net>.search = ''
FAIL <a>: Setting <a:/>.search = '\0
\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F !\"#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
FAIL <area>: Setting <a:/>.search = '\0
\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F !\"#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
PASS <a>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
PASS <area>: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
PASS <a>: Setting <https://example.net>.hash = 'main'
Expand Down
Expand Up @@ -206,7 +206,7 @@ PASS URL: Setting <https://example.net?lang=en-US#nav>.search = ''
PASS URL: Setting <https://example.net?lang=en-US>.search = ''
PASS URL: Setting <https://example.net>.search = ''
FAIL URL: Setting <a:/>.search = '\0
\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
\r !"#$%&'()*+,-./09:;<=>?@AZ[\]^_`az{|}~€Éé' UTF-8 percent encoding with the query encode set. Tabs and newlines are removed. assert_equals: expected "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" but got "a:/?%00%01%1F%20!%22%23$%&%27()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9"
PASS URL: Setting <http://example.net>.search = '%c3%89té' Bytes already percent-encoded are left as-is
PASS URL: Setting <https://example.net>.hash = 'main'
PASS URL: Setting <https://example.net#nav>.hash = 'main'
Expand Down

0 comments on commit b443c71

Please sign in to comment.