Skip to content

Commit 0c6de66

Browse files
committed
Strip tab and newline from Location/URL/<a>/<area>'s protocol setter
https://bugs.webkit.org/show_bug.cgi?id=251087 rdar://104599983 Reviewed by Alex Christensen. Our URL parser was already skipping newlines and tabs in the scheme while parsing. However, URL::setProtocol() would call URLParser::maybeCanonicalizeScheme() before parsing and this function would fail if the protocol contains any newlines or tabs. * LayoutTests/imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/location-protocol-setter-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html: * LayoutTests/imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/location-protocol-setter-sameish-expected.txt: Added. * LayoutTests/imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/location-protocol-setter-sameish.html: Added. * LayoutTests/imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/location-protocol-setter.html: Resync tests after web-platform-tests/wpt#38032. * LayoutTests/imported/w3c/web-platform-tests/url/url-setters-stripping.any-expected.txt: * LayoutTests/imported/w3c/web-platform-tests/url/url-setters-stripping.any.worker-expected.txt: Rebaseline tests that are now passing. * Source/WTF/wtf/URLParser.cpp: (WTF::URLParser::maybeCanonicalizeScheme): Update URLParser::maybeCanonicalizeScheme() to allow for newlines and tabs in the scheme since it is allowed by the specification and our URL parser actually handles them fine. Canonical link: https://commits.webkit.org/261017@main
1 parent 8530f5f commit 0c6de66

8 files changed

+127
-96
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,50 @@
11

2-
PASS %00 (percent-encoded) is not a scheme
3-
PASS %01 (percent-encoded) is not a scheme
4-
PASS %0A (percent-encoded) is not a scheme
5-
PASS %20 (percent-encoded) is not a scheme
6-
PASS ! (percent-encoded) is not a scheme
7-
PASS %7F (percent-encoded) is not a scheme
8-
PASS %C2%80 (percent-encoded) is not a scheme
9-
PASS %C3%BF (percent-encoded) is not a scheme
10-
PASS : (percent-encoded) is not a scheme
11-
PASS %C3%A2%E2%82%AC%C2%A0 (percent-encoded) is not a scheme
12-
PASS %00x (percent-encoded) is not a scheme
13-
PASS %01x (percent-encoded) is not a scheme
14-
PASS %0Ax (percent-encoded) is not a scheme
15-
PASS %20x (percent-encoded) is not a scheme
16-
PASS !x (percent-encoded) is not a scheme
17-
PASS %7Fx (percent-encoded) is not a scheme
18-
PASS %C2%80x (percent-encoded) is not a scheme
19-
PASS %C3%BFx (percent-encoded) is not a scheme
20-
PASS :x (percent-encoded) is not a scheme
21-
PASS %C3%A2%E2%82%AC%C2%A0x (percent-encoded) is not a scheme
22-
PASS %00X (percent-encoded) is not a scheme
23-
PASS %01X (percent-encoded) is not a scheme
24-
PASS %0AX (percent-encoded) is not a scheme
25-
PASS %20X (percent-encoded) is not a scheme
26-
PASS !X (percent-encoded) is not a scheme
27-
PASS %7FX (percent-encoded) is not a scheme
28-
PASS %C2%80X (percent-encoded) is not a scheme
29-
PASS %C3%BFX (percent-encoded) is not a scheme
30-
PASS :X (percent-encoded) is not a scheme
31-
PASS %C3%A2%E2%82%AC%C2%A0X (percent-encoded) is not a scheme
32-
PASS x%00 (percent-encoded) is not a scheme
33-
PASS x%01 (percent-encoded) is not a scheme
34-
PASS x%0A (percent-encoded) is not a scheme
35-
PASS x%20 (percent-encoded) is not a scheme
36-
PASS x! (percent-encoded) is not a scheme
37-
PASS x%7F (percent-encoded) is not a scheme
38-
PASS x%C2%80 (percent-encoded) is not a scheme
39-
PASS x%C3%BF (percent-encoded) is not a scheme
40-
PASS x%C3%A2%E2%82%AC%C2%A0 (percent-encoded) is not a scheme
41-
PASS X%00 (percent-encoded) is not a scheme
42-
PASS X%01 (percent-encoded) is not a scheme
43-
PASS X%0A (percent-encoded) is not a scheme
44-
PASS X%20 (percent-encoded) is not a scheme
45-
PASS X! (percent-encoded) is not a scheme
46-
PASS X%7F (percent-encoded) is not a scheme
47-
PASS X%C2%80 (percent-encoded) is not a scheme
48-
PASS X%C3%BF (percent-encoded) is not a scheme
49-
PASS X%C3%A2%E2%82%AC%C2%A0 (percent-encoded) is not a scheme
50-
PASS a%0A (percent-encoded) is not a scheme
51-
PASS a+-.%0A (percent-encoded) is not a scheme
2+
PASS %00 (percent-encoded here for clarity) is not a scheme
3+
PASS %01 (percent-encoded here for clarity) is not a scheme
4+
PASS %09 (percent-encoded here for clarity) is not a scheme
5+
PASS %0A (percent-encoded here for clarity) is not a scheme
6+
PASS %0C (percent-encoded here for clarity) is not a scheme
7+
PASS %0D (percent-encoded here for clarity) is not a scheme
8+
PASS %20 (percent-encoded here for clarity) is not a scheme
9+
PASS ! (percent-encoded here for clarity) is not a scheme
10+
PASS %7F (percent-encoded here for clarity) is not a scheme
11+
PASS %C2%80 (percent-encoded here for clarity) is not a scheme
12+
PASS %C3%BF (percent-encoded here for clarity) is not a scheme
13+
PASS : (percent-encoded here for clarity) is not a scheme
14+
PASS %C3%A2%E2%82%AC%C2%A0 (percent-encoded here for clarity) is not a scheme
15+
PASS %00x (percent-encoded here for clarity) is not a scheme
16+
PASS %01x (percent-encoded here for clarity) is not a scheme
17+
PASS %20x (percent-encoded here for clarity) is not a scheme
18+
PASS !x (percent-encoded here for clarity) is not a scheme
19+
PASS %7Fx (percent-encoded here for clarity) is not a scheme
20+
PASS %C2%80x (percent-encoded here for clarity) is not a scheme
21+
PASS %C3%BFx (percent-encoded here for clarity) is not a scheme
22+
PASS :x (percent-encoded here for clarity) is not a scheme
23+
PASS %C3%A2%E2%82%AC%C2%A0x (percent-encoded here for clarity) is not a scheme
24+
PASS %00X (percent-encoded here for clarity) is not a scheme
25+
PASS %01X (percent-encoded here for clarity) is not a scheme
26+
PASS %20X (percent-encoded here for clarity) is not a scheme
27+
PASS !X (percent-encoded here for clarity) is not a scheme
28+
PASS %7FX (percent-encoded here for clarity) is not a scheme
29+
PASS %C2%80X (percent-encoded here for clarity) is not a scheme
30+
PASS %C3%BFX (percent-encoded here for clarity) is not a scheme
31+
PASS :X (percent-encoded here for clarity) is not a scheme
32+
PASS %C3%A2%E2%82%AC%C2%A0X (percent-encoded here for clarity) is not a scheme
33+
PASS x%00 (percent-encoded here for clarity) is not a scheme
34+
PASS x%01 (percent-encoded here for clarity) is not a scheme
35+
PASS x%20 (percent-encoded here for clarity) is not a scheme
36+
PASS x! (percent-encoded here for clarity) is not a scheme
37+
PASS x%7F (percent-encoded here for clarity) is not a scheme
38+
PASS x%C2%80 (percent-encoded here for clarity) is not a scheme
39+
PASS x%C3%BF (percent-encoded here for clarity) is not a scheme
40+
PASS x%C3%A2%E2%82%AC%C2%A0 (percent-encoded here for clarity) is not a scheme
41+
PASS X%00 (percent-encoded here for clarity) is not a scheme
42+
PASS X%01 (percent-encoded here for clarity) is not a scheme
43+
PASS X%20 (percent-encoded here for clarity) is not a scheme
44+
PASS X! (percent-encoded here for clarity) is not a scheme
45+
PASS X%7F (percent-encoded here for clarity) is not a scheme
46+
PASS X%C2%80 (percent-encoded here for clarity) is not a scheme
47+
PASS X%C3%BF (percent-encoded here for clarity) is not a scheme
48+
PASS X%C3%A2%E2%82%AC%C2%A0 (percent-encoded here for clarity) is not a scheme
5249
PASS Equivalent tests for data URL and srcdoc <iframe>s
5350

Diff for: LayoutTests/imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/location-protocol-setter-non-broken.html

+7-3
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@
99
[
1010
'x',
1111
'data',
12-
// 'mailto' opens an email client in Firefox...
12+
// 'mailto' opens an email client in Chrome and Firefox and then ends up passing anyway...
1313
'file',
1414
'ftp',
1515
'http+x'
1616
].forEach((val) => {
1717
async_test((t) => {
1818
// HTTP URL <iframe>
1919
const frame = document.createElement("iframe")
20+
t.add_cleanup(() => frame.remove())
2021
frame.src = "/common/blank.html"
2122
frame.onload = t.step_func(() => {
2223
frame.contentWindow.location.protocol = val
@@ -25,14 +26,17 @@
2526
assert_equals(frame.contentWindow.location.host, location.host)
2627
assert_equals(frame.contentWindow.location.port, location.port)
2728
t.done()
28-
}, 500)
29+
// Matches the timeout from location-protocol-setter-non-broken-weird.html which suggests
30+
// that 4 seconds is enough for a navigation to complete.
31+
}, 4000)
2932
})
3033
document.body.appendChild(frame)
3134
}, "Set HTTP URL frame location.protocol to " + val)
3235

3336
async_test((t) => {
3437
// data URL <iframe>
3538
const dataFrame = document.createElement("iframe")
39+
t.add_cleanup(() => dataFrame.remove())
3640
const channel = new MessageChannel()
3741
dataFrame.src = `data:text/html,<script>
3842
onmessage = (e) => {
@@ -42,7 +46,7 @@
4246
} catch(e) {
4347
result = true
4448
}
45-
setTimeout(() => e.ports[0].postMessage([result, location.protocol]), 100)
49+
setTimeout(() => e.ports[0].postMessage([result, location.protocol]), 4000)
4650
}
4751
<\/script>`
4852
dataFrame.onload = t.step_func(() => {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
PASS Set location.protocol to http (percent-encoded here for clarity)
3+
PASS Set location.protocol to ht%0Atp (percent-encoded here for clarity)
4+
PASS Set location.protocol to http%0A (percent-encoded here for clarity)
5+
PASS Set location.protocol to %09ht%09%0AtP (percent-encoded here for clarity)
6+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<!doctype html>
2+
<title>Set location.protocol to the scheme it already was</title>
3+
<script src=/resources/testharness.js></script>
4+
<script src=/resources/testharnessreport.js></script>
5+
<div id=log></div>
6+
<iframe src=/common/blank.html></iframe>
7+
<iframe src=/common/blank.html></iframe>
8+
<iframe src=/common/blank.html></iframe>
9+
<iframe src=/common/blank.html></iframe>
10+
<script>
11+
self.onload = () => {
12+
[
13+
"http",
14+
"ht\x0Atp",
15+
"http\x0A",
16+
"\x09ht\x09\x0AtP"
17+
].forEach((val, index) => {
18+
async_test(t => {
19+
self[index].frameElement.onload = t.step_func_done(() => {
20+
assert_equals(self[index].location.protocol, "http:");
21+
});
22+
self[index].location.protocol = val;
23+
}, `Set location.protocol to ${encodeURI(val)} (percent-encoded here for clarity)`);
24+
});
25+
}
26+
</script>

Diff for: LayoutTests/imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/location-protocol-setter.html

+10-16
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!doctype html>
2-
<title>Set location.protocol to broken schemes</title>
2+
<title>Set location.protocol to schemes that throw</title>
33
<script src=/resources/testharness.js></script>
44
<script src=/resources/testharnessreport.js></script>
55
<div id=log></div>
@@ -32,14 +32,13 @@
3232
}
3333
</script>"></iframe>
3434
<script>
35-
// Tests with '\x0A' (i.e., '\n') don't conform to the URL Standard as of the
36-
// time of writing, as according to spec they should be ignored.
37-
// See https://github.com/whatwg/url/issues/609.
38-
39-
let broken = [
35+
const broken = [
4036
'\x00',
4137
'\x01',
42-
'\x0A',
38+
'\x09', // becomes the empty string
39+
'\x0A', // becomes the empty string
40+
'\x0C',
41+
'\x0D',
4342
'\x20',
4443
'\x21',
4544
'\x7F',
@@ -49,7 +48,6 @@
4948
'†',
5049
'\x00x',
5150
'\x01x',
52-
'\x0Ax',
5351
'\x20x',
5452
'\x21x',
5553
'\x7Fx',
@@ -59,7 +57,6 @@
5957
'†x',
6058
'\x00X',
6159
'\x01X',
62-
'\x0AX',
6360
'\x20X',
6461
'\x21X',
6562
'\x7FX',
@@ -69,7 +66,6 @@
6966
'†X',
7067
'x\x00',
7168
'x\x01',
72-
'x\x0A',
7369
'x\x20',
7470
'x\x21',
7571
'x\x7F',
@@ -78,20 +74,18 @@
7874
'x†',
7975
'X\x00',
8076
'X\x01',
81-
'X\x0A',
8277
'X\x20',
8378
'X\x21',
8479
'X\x7F',
8580
'X\x80',
8681
'X\xFF',
8782
'X†',
88-
'a\x0A',
89-
'a+-.\x0A'
90-
]
91-
;broken.forEach((val) => {
83+
];
84+
85+
broken.forEach(val => {
9286
test(() => {
9387
assert_throws_dom("SyntaxError", () => { location.protocol = val })
94-
}, encodeURI(val) + " (percent-encoded) is not a scheme")
88+
}, `${encodeURI(val)} (percent-encoded here for clarity) is not a scheme`)
9589
})
9690
let c = 0
9791
async_test((t) => {

Diff for: LayoutTests/imported/w3c/web-platform-tests/url/url-setters-stripping.any-expected.txt

+12-12
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ PASS Setting search with trailing U+0000 (https:)
2525
PASS Setting hash with leading U+0000 (https:)
2626
PASS Setting hash with middle U+0000 (https:)
2727
PASS Setting hash with trailing U+0000 (https:)
28-
FAIL Setting protocol with leading U+0009 (https:) assert_equals: property expected "http:" but got "https:"
29-
FAIL Setting protocol with U+0009 before inserted colon (https:) assert_equals: property expected "http:" but got "https:"
28+
PASS Setting protocol with leading U+0009 (https:)
29+
PASS Setting protocol with U+0009 before inserted colon (https:)
3030
PASS Setting username with leading U+0009 (https:)
3131
PASS Setting username with middle U+0009 (https:)
3232
PASS Setting username with trailing U+0009 (https:)
@@ -51,8 +51,8 @@ PASS Setting search with trailing U+0009 (https:)
5151
PASS Setting hash with leading U+0009 (https:)
5252
PASS Setting hash with middle U+0009 (https:)
5353
PASS Setting hash with trailing U+0009 (https:)
54-
FAIL Setting protocol with leading U+000A (https:) assert_equals: property expected "http:" but got "https:"
55-
FAIL Setting protocol with U+000A before inserted colon (https:) assert_equals: property expected "http:" but got "https:"
54+
PASS Setting protocol with leading U+000A (https:)
55+
PASS Setting protocol with U+000A before inserted colon (https:)
5656
PASS Setting username with leading U+000A (https:)
5757
PASS Setting username with middle U+000A (https:)
5858
PASS Setting username with trailing U+000A (https:)
@@ -77,8 +77,8 @@ PASS Setting search with trailing U+000A (https:)
7777
PASS Setting hash with leading U+000A (https:)
7878
PASS Setting hash with middle U+000A (https:)
7979
PASS Setting hash with trailing U+000A (https:)
80-
FAIL Setting protocol with leading U+000D (https:) assert_equals: property expected "http:" but got "https:"
81-
FAIL Setting protocol with U+000D before inserted colon (https:) assert_equals: property expected "http:" but got "https:"
80+
PASS Setting protocol with leading U+000D (https:)
81+
PASS Setting protocol with U+000D before inserted colon (https:)
8282
PASS Setting username with leading U+000D (https:)
8383
PASS Setting username with middle U+000D (https:)
8484
PASS Setting username with trailing U+000D (https:)
@@ -155,8 +155,8 @@ PASS Setting search with trailing U+0000 (wpt++:)
155155
PASS Setting hash with leading U+0000 (wpt++:)
156156
PASS Setting hash with middle U+0000 (wpt++:)
157157
PASS Setting hash with trailing U+0000 (wpt++:)
158-
FAIL Setting protocol with leading U+0009 (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
159-
FAIL Setting protocol with U+0009 before inserted colon (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
158+
PASS Setting protocol with leading U+0009 (wpt++:)
159+
PASS Setting protocol with U+0009 before inserted colon (wpt++:)
160160
PASS Setting username with leading U+0009 (wpt++:)
161161
PASS Setting username with middle U+0009 (wpt++:)
162162
PASS Setting username with trailing U+0009 (wpt++:)
@@ -181,8 +181,8 @@ PASS Setting search with trailing U+0009 (wpt++:)
181181
PASS Setting hash with leading U+0009 (wpt++:)
182182
PASS Setting hash with middle U+0009 (wpt++:)
183183
PASS Setting hash with trailing U+0009 (wpt++:)
184-
FAIL Setting protocol with leading U+000A (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
185-
FAIL Setting protocol with U+000A before inserted colon (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
184+
PASS Setting protocol with leading U+000A (wpt++:)
185+
PASS Setting protocol with U+000A before inserted colon (wpt++:)
186186
PASS Setting username with leading U+000A (wpt++:)
187187
PASS Setting username with middle U+000A (wpt++:)
188188
PASS Setting username with trailing U+000A (wpt++:)
@@ -207,8 +207,8 @@ PASS Setting search with trailing U+000A (wpt++:)
207207
PASS Setting hash with leading U+000A (wpt++:)
208208
PASS Setting hash with middle U+000A (wpt++:)
209209
PASS Setting hash with trailing U+000A (wpt++:)
210-
FAIL Setting protocol with leading U+000D (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
211-
FAIL Setting protocol with U+000D before inserted colon (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
210+
PASS Setting protocol with leading U+000D (wpt++:)
211+
PASS Setting protocol with U+000D before inserted colon (wpt++:)
212212
PASS Setting username with leading U+000D (wpt++:)
213213
PASS Setting username with middle U+000D (wpt++:)
214214
PASS Setting username with trailing U+000D (wpt++:)

Diff for: LayoutTests/imported/w3c/web-platform-tests/url/url-setters-stripping.any.worker-expected.txt

+12-12
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ PASS Setting search with trailing U+0000 (https:)
2525
PASS Setting hash with leading U+0000 (https:)
2626
PASS Setting hash with middle U+0000 (https:)
2727
PASS Setting hash with trailing U+0000 (https:)
28-
FAIL Setting protocol with leading U+0009 (https:) assert_equals: property expected "http:" but got "https:"
29-
FAIL Setting protocol with U+0009 before inserted colon (https:) assert_equals: property expected "http:" but got "https:"
28+
PASS Setting protocol with leading U+0009 (https:)
29+
PASS Setting protocol with U+0009 before inserted colon (https:)
3030
PASS Setting username with leading U+0009 (https:)
3131
PASS Setting username with middle U+0009 (https:)
3232
PASS Setting username with trailing U+0009 (https:)
@@ -51,8 +51,8 @@ PASS Setting search with trailing U+0009 (https:)
5151
PASS Setting hash with leading U+0009 (https:)
5252
PASS Setting hash with middle U+0009 (https:)
5353
PASS Setting hash with trailing U+0009 (https:)
54-
FAIL Setting protocol with leading U+000A (https:) assert_equals: property expected "http:" but got "https:"
55-
FAIL Setting protocol with U+000A before inserted colon (https:) assert_equals: property expected "http:" but got "https:"
54+
PASS Setting protocol with leading U+000A (https:)
55+
PASS Setting protocol with U+000A before inserted colon (https:)
5656
PASS Setting username with leading U+000A (https:)
5757
PASS Setting username with middle U+000A (https:)
5858
PASS Setting username with trailing U+000A (https:)
@@ -77,8 +77,8 @@ PASS Setting search with trailing U+000A (https:)
7777
PASS Setting hash with leading U+000A (https:)
7878
PASS Setting hash with middle U+000A (https:)
7979
PASS Setting hash with trailing U+000A (https:)
80-
FAIL Setting protocol with leading U+000D (https:) assert_equals: property expected "http:" but got "https:"
81-
FAIL Setting protocol with U+000D before inserted colon (https:) assert_equals: property expected "http:" but got "https:"
80+
PASS Setting protocol with leading U+000D (https:)
81+
PASS Setting protocol with U+000D before inserted colon (https:)
8282
PASS Setting username with leading U+000D (https:)
8383
PASS Setting username with middle U+000D (https:)
8484
PASS Setting username with trailing U+000D (https:)
@@ -155,8 +155,8 @@ PASS Setting search with trailing U+0000 (wpt++:)
155155
PASS Setting hash with leading U+0000 (wpt++:)
156156
PASS Setting hash with middle U+0000 (wpt++:)
157157
PASS Setting hash with trailing U+0000 (wpt++:)
158-
FAIL Setting protocol with leading U+0009 (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
159-
FAIL Setting protocol with U+0009 before inserted colon (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
158+
PASS Setting protocol with leading U+0009 (wpt++:)
159+
PASS Setting protocol with U+0009 before inserted colon (wpt++:)
160160
PASS Setting username with leading U+0009 (wpt++:)
161161
PASS Setting username with middle U+0009 (wpt++:)
162162
PASS Setting username with trailing U+0009 (wpt++:)
@@ -181,8 +181,8 @@ PASS Setting search with trailing U+0009 (wpt++:)
181181
PASS Setting hash with leading U+0009 (wpt++:)
182182
PASS Setting hash with middle U+0009 (wpt++:)
183183
PASS Setting hash with trailing U+0009 (wpt++:)
184-
FAIL Setting protocol with leading U+000A (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
185-
FAIL Setting protocol with U+000A before inserted colon (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
184+
PASS Setting protocol with leading U+000A (wpt++:)
185+
PASS Setting protocol with U+000A before inserted colon (wpt++:)
186186
PASS Setting username with leading U+000A (wpt++:)
187187
PASS Setting username with middle U+000A (wpt++:)
188188
PASS Setting username with trailing U+000A (wpt++:)
@@ -207,8 +207,8 @@ PASS Setting search with trailing U+000A (wpt++:)
207207
PASS Setting hash with leading U+000A (wpt++:)
208208
PASS Setting hash with middle U+000A (wpt++:)
209209
PASS Setting hash with trailing U+000A (wpt++:)
210-
FAIL Setting protocol with leading U+000D (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
211-
FAIL Setting protocol with U+000D before inserted colon (wpt++:) assert_equals: property expected "wpt--:" but got "wpt++:"
210+
PASS Setting protocol with leading U+000D (wpt++:)
211+
PASS Setting protocol with U+000D before inserted colon (wpt++:)
212212
PASS Setting username with leading U+000D (wpt++:)
213213
PASS Setting username with middle U+000D (wpt++:)
214214
PASS Setting username with trailing U+000D (wpt++:)

0 commit comments

Comments
 (0)