<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[212249] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/212249">212249</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2017-02-13 14:52:34 -0800 (Mon, 13 Feb 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>Percent should be allowed in non-special URL hosts
https://bugs.webkit.org/show_bug.cgi?id=168255

Reviewed by Tim Horton.

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:

In the last few weeks, the spec has consolidated its sets of code points.
Now forbidden host code points replace the old invalid host code points with
the modification that percents are allowed in non-special hosts because we
percent-encode non-ascii code points in non-special hosts.
See https://url.spec.whatwg.org/#concept-opaque-host-parser

Covered by newly passing web platform tests.

* platform/URLParser.cpp:
(WebCore::isC0Control):
(WebCore::isInUserInfoEncodeSet):
(WebCore::URLParser::hasForbiddenHostCodePoint):
(WebCore::URLParser::parseHostAndPort):
(WebCore::isInvalidDomainCharacter): Deleted.
(WebCore::URLParser::hasInvalidDomainCharacter): Deleted.
* platform/URLParser.h:

Tools:

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

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsurlaelementexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/url/a-element-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsurlaelementxhtmlexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/url/a-element-xhtml-expected.txt</a></li>
<li><a href="#trunkLayoutTestsimportedw3cwebplatformtestsurlurlconstructorexpectedtxt">trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformURLParsercpp">trunk/Source/WebCore/platform/URLParser.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformURLParserh">trunk/Source/WebCore/platform/URLParser.h</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebCoreURLParsercpp">trunk/Tools/TestWebKitAPI/Tests/WebCore/URLParser.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (212248 => 212249)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2017-02-13 21:55:55 UTC (rev 212248)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2017-02-13 22:52:34 UTC (rev 212249)
</span><span class="lines">@@ -1,3 +1,14 @@
</span><ins>+2017-02-13  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Percent should be allowed in non-special URL hosts
+        https://bugs.webkit.org/show_bug.cgi?id=168255
+
+        Reviewed by Tim Horton.
+
+        * 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:
+
</ins><span class="cx"> 2017-02-11  Youenn Fablet  &lt;youennf@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Refresh WPT tests up to 06c6c52e05e05483d3c844168a417ee27a554eb7
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsurlaelementexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/url/a-element-expected.txt (212248 => 212249)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/url/a-element-expected.txt        2017-02-13 21:55:55 UTC (rev 212248)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/url/a-element-expected.txt        2017-02-13 22:52:34 UTC (rev 212249)
</span><span class="lines">@@ -333,7 +333,7 @@
</span><span class="cx"> PASS Parsing: &lt;sc://!&quot;$&amp;'()*+,-.;&lt;=&gt;^_`{|}~/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://\0/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc:// /&gt; against &lt;about:blank&gt; 
</span><del>-FAIL Parsing: &lt;sc://%/&gt; against &lt;about:blank&gt; assert_equals: protocol expected &quot;sc:&quot; but got &quot;:&quot;
</del><ins>+PASS Parsing: &lt;sc://%/&gt; against &lt;about:blank&gt; 
</ins><span class="cx"> PASS Parsing: &lt;sc://@/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://te@s:t@/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://:/&gt; against &lt;about:blank&gt; 
</span><span class="lines">@@ -418,8 +418,8 @@
</span><span class="cx"> PASS Parsing: &lt;git+https://github.com/foo/bar&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;urn:ietf:rfc:2648&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;tag:joe@example.org,2001:foo/bar&gt; against &lt;about:blank&gt; 
</span><del>-FAIL Parsing: &lt;non-special://%E2%80%A0/&gt; against &lt;about:blank&gt; assert_equals: protocol expected &quot;non-special:&quot; but got &quot;:&quot;
-FAIL Parsing: &lt;non-special://H%4fSt/path&gt; against &lt;about:blank&gt; assert_equals: protocol expected &quot;non-special:&quot; but got &quot;:&quot;
</del><ins>+PASS Parsing: &lt;non-special://%E2%80%A0/&gt; against &lt;about:blank&gt; 
+PASS Parsing: &lt;non-special://H%4fSt/path&gt; against &lt;about:blank&gt; 
</ins><span class="cx"> PASS Parsing: &lt;non-special://[1:2:0:0:5:0:0:0]/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;non-special://[1:2:0:0:0:0:0:3]/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;non-special://[1:2::3]:80/&gt; against &lt;about:blank&gt; 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsurlaelementxhtmlexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/url/a-element-xhtml-expected.txt (212248 => 212249)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/url/a-element-xhtml-expected.txt        2017-02-13 21:55:55 UTC (rev 212248)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/url/a-element-xhtml-expected.txt        2017-02-13 22:52:34 UTC (rev 212249)
</span><span class="lines">@@ -333,7 +333,7 @@
</span><span class="cx"> PASS Parsing: &lt;sc://!&quot;$&amp;'()*+,-.;&lt;=&gt;^_`{|}~/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://\0/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc:// /&gt; against &lt;about:blank&gt; 
</span><del>-FAIL Parsing: &lt;sc://%/&gt; against &lt;about:blank&gt; assert_equals: protocol expected &quot;sc:&quot; but got &quot;:&quot;
</del><ins>+PASS Parsing: &lt;sc://%/&gt; against &lt;about:blank&gt; 
</ins><span class="cx"> PASS Parsing: &lt;sc://@/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://te@s:t@/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://:/&gt; against &lt;about:blank&gt; 
</span><span class="lines">@@ -418,8 +418,8 @@
</span><span class="cx"> PASS Parsing: &lt;git+https://github.com/foo/bar&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;urn:ietf:rfc:2648&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;tag:joe@example.org,2001:foo/bar&gt; against &lt;about:blank&gt; 
</span><del>-FAIL Parsing: &lt;non-special://%E2%80%A0/&gt; against &lt;about:blank&gt; assert_equals: protocol expected &quot;non-special:&quot; but got &quot;:&quot;
-FAIL Parsing: &lt;non-special://H%4fSt/path&gt; against &lt;about:blank&gt; assert_equals: protocol expected &quot;non-special:&quot; but got &quot;:&quot;
</del><ins>+PASS Parsing: &lt;non-special://%E2%80%A0/&gt; against &lt;about:blank&gt; 
+PASS Parsing: &lt;non-special://H%4fSt/path&gt; against &lt;about:blank&gt; 
</ins><span class="cx"> PASS Parsing: &lt;non-special://[1:2:0:0:5:0:0:0]/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;non-special://[1:2:0:0:0:0:0:3]/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;non-special://[1:2::3]:80/&gt; against &lt;about:blank&gt; 
</span></span></pre></div>
<a id="trunkLayoutTestsimportedw3cwebplatformtestsurlurlconstructorexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt (212248 => 212249)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt        2017-02-13 21:55:55 UTC (rev 212248)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt        2017-02-13 22:52:34 UTC (rev 212249)
</span><span class="lines">@@ -341,7 +341,7 @@
</span><span class="cx"> PASS Parsing: &lt;sc://!&quot;$&amp;'()*+,-.;&lt;=&gt;^_`{|}~/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://\0/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc:// /&gt; against &lt;about:blank&gt; 
</span><del>-FAIL Parsing: &lt;sc://%/&gt; against &lt;about:blank&gt; Type error
</del><ins>+PASS Parsing: &lt;sc://%/&gt; against &lt;about:blank&gt; 
</ins><span class="cx"> PASS Parsing: &lt;sc://@/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://te@s:t@/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;sc://:/&gt; against &lt;about:blank&gt; 
</span><span class="lines">@@ -440,8 +440,8 @@
</span><span class="cx"> PASS Parsing: &lt;git+https://github.com/foo/bar&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;urn:ietf:rfc:2648&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;tag:joe@example.org,2001:foo/bar&gt; against &lt;about:blank&gt; 
</span><del>-FAIL Parsing: &lt;non-special://%E2%80%A0/&gt; against &lt;about:blank&gt; Type error
-FAIL Parsing: &lt;non-special://H%4fSt/path&gt; against &lt;about:blank&gt; Type error
</del><ins>+PASS Parsing: &lt;non-special://%E2%80%A0/&gt; against &lt;about:blank&gt; 
+PASS Parsing: &lt;non-special://H%4fSt/path&gt; against &lt;about:blank&gt; 
</ins><span class="cx"> PASS Parsing: &lt;non-special://[1:2:0:0:5:0:0:0]/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;non-special://[1:2:0:0:0:0:0:3]/&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;non-special://[1:2::3]:80/&gt; against &lt;about:blank&gt; 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (212248 => 212249)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-02-13 21:55:55 UTC (rev 212248)
+++ trunk/Source/WebCore/ChangeLog        2017-02-13 22:52:34 UTC (rev 212249)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2017-02-13  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Percent should be allowed in non-special URL hosts
+        https://bugs.webkit.org/show_bug.cgi?id=168255
+
+        Reviewed by Tim Horton.
+
+        In the last few weeks, the spec has consolidated its sets of code points.
+        Now forbidden host code points replace the old invalid host code points with
+        the modification that percents are allowed in non-special hosts because we
+        percent-encode non-ascii code points in non-special hosts.
+        See https://url.spec.whatwg.org/#concept-opaque-host-parser
+
+        Covered by newly passing web platform tests.
+
+        * platform/URLParser.cpp:
+        (WebCore::isC0Control):
+        (WebCore::isInUserInfoEncodeSet):
+        (WebCore::URLParser::hasForbiddenHostCodePoint):
+        (WebCore::URLParser::parseHostAndPort):
+        (WebCore::isInvalidDomainCharacter): Deleted.
+        (WebCore::URLParser::hasInvalidDomainCharacter): Deleted.
+        * platform/URLParser.h:
+
</ins><span class="cx"> 2017-02-13  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Fix Windows build.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformURLParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/URLParser.cpp (212248 => 212249)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/URLParser.cpp        2017-02-13 21:55:55 UTC (rev 212248)
+++ trunk/Source/WebCore/platform/URLParser.cpp        2017-02-13 22:52:34 UTC (rev 212249)
</span><span class="lines">@@ -146,15 +146,14 @@
</span><span class="cx"> enum URLCharacterClass {
</span><span class="cx">     UserInfo = 0x1,
</span><span class="cx">     Default = 0x2,
</span><del>-    InvalidDomain = 0x4,
</del><ins>+    ForbiddenHost = 0x4,
</ins><span class="cx">     QueryPercent = 0x8,
</span><span class="cx">     SlashQuestionOrHash = 0x10,
</span><span class="cx">     ValidScheme = 0x20,
</span><del>-    ForbiddenHost = 0x40,
</del><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> static const uint8_t characterClassTable[256] = {
</span><del>-    UserInfo | Default | InvalidDomain | QueryPercent | ForbiddenHost, // 0x0
</del><ins>+    UserInfo | Default | QueryPercent | ForbiddenHost, // 0x0
</ins><span class="cx">     UserInfo | Default | QueryPercent, // 0x1
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0x2
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0x3
</span><span class="lines">@@ -163,11 +162,11 @@
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0x6
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0x7
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0x8
</span><del>-    UserInfo | Default | InvalidDomain | QueryPercent | ForbiddenHost, // 0x9
-    UserInfo | Default | InvalidDomain | QueryPercent | ForbiddenHost, // 0xA
</del><ins>+    UserInfo | Default | QueryPercent | ForbiddenHost, // 0x9
+    UserInfo | Default | QueryPercent | ForbiddenHost, // 0xA
</ins><span class="cx">     UserInfo | Default | QueryPercent, // 0xB
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0xC
</span><del>-    UserInfo | Default | InvalidDomain | QueryPercent | ForbiddenHost, // 0xD
</del><ins>+    UserInfo | Default | QueryPercent | ForbiddenHost, // 0xD
</ins><span class="cx">     UserInfo | Default | QueryPercent, // 0xE
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0xF
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0x10
</span><span class="lines">@@ -186,12 +185,12 @@
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0x1D
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0x1E
</span><span class="cx">     UserInfo | Default | QueryPercent, // 0x1F
</span><del>-    UserInfo | Default | InvalidDomain | QueryPercent | ForbiddenHost, // ' '
</del><ins>+    UserInfo | Default | QueryPercent | ForbiddenHost, // ' '
</ins><span class="cx">     0, // '!'
</span><span class="cx">     UserInfo | Default | QueryPercent, // '&quot;'
</span><del>-    UserInfo | Default | InvalidDomain | QueryPercent | SlashQuestionOrHash | ForbiddenHost, // '#'
</del><ins>+    UserInfo | Default | QueryPercent | SlashQuestionOrHash | ForbiddenHost, // '#'
</ins><span class="cx">     0, // '$'
</span><del>-    InvalidDomain | ForbiddenHost, // '%'
</del><ins>+    ForbiddenHost, // '%'
</ins><span class="cx">     0, // '&amp;'
</span><span class="cx">     0, // '''
</span><span class="cx">     0, // '('
</span><span class="lines">@@ -201,7 +200,7 @@
</span><span class="cx">     0, // ','
</span><span class="cx">     ValidScheme, // '-'
</span><span class="cx">     ValidScheme, // '.'
</span><del>-    UserInfo | InvalidDomain | SlashQuestionOrHash | ForbiddenHost, // '/'
</del><ins>+    UserInfo | SlashQuestionOrHash | ForbiddenHost, // '/'
</ins><span class="cx">     ValidScheme, // '0'
</span><span class="cx">     ValidScheme, // '1'
</span><span class="cx">     ValidScheme, // '2'
</span><span class="lines">@@ -212,13 +211,13 @@
</span><span class="cx">     ValidScheme, // '7'
</span><span class="cx">     ValidScheme, // '8'
</span><span class="cx">     ValidScheme, // '9'
</span><del>-    UserInfo | InvalidDomain | ForbiddenHost, // ':'
</del><ins>+    UserInfo | ForbiddenHost, // ':'
</ins><span class="cx">     UserInfo, // ';'
</span><span class="cx">     UserInfo | Default | QueryPercent, // '&lt;'
</span><span class="cx">     UserInfo, // '='
</span><span class="cx">     UserInfo | Default | QueryPercent, // '&gt;'
</span><del>-    UserInfo | Default | InvalidDomain | SlashQuestionOrHash | ForbiddenHost, // '?'
-    UserInfo | InvalidDomain | ForbiddenHost, // '@'
</del><ins>+    UserInfo | Default | SlashQuestionOrHash | ForbiddenHost, // '?'
+    UserInfo | ForbiddenHost, // '@'
</ins><span class="cx">     ValidScheme, // 'A'
</span><span class="cx">     ValidScheme, // 'B'
</span><span class="cx">     ValidScheme, // 'C'
</span><span class="lines">@@ -245,9 +244,9 @@
</span><span class="cx">     ValidScheme, // 'X'
</span><span class="cx">     ValidScheme, // 'Y'
</span><span class="cx">     ValidScheme, // 'Z'
</span><del>-    UserInfo | InvalidDomain | ForbiddenHost, // '['
-    UserInfo | InvalidDomain | SlashQuestionOrHash | ForbiddenHost, // '\\'
-    UserInfo | InvalidDomain | ForbiddenHost, // ']'
</del><ins>+    UserInfo | ForbiddenHost, // '['
+    UserInfo | SlashQuestionOrHash | ForbiddenHost, // '\\'
+    UserInfo | ForbiddenHost, // ']'
</ins><span class="cx">     UserInfo, // '^'
</span><span class="cx">     0, // '_'
</span><span class="cx">     UserInfo | Default, // '`'
</span><span class="lines">@@ -418,7 +417,6 @@
</span><span class="cx"> template&lt;typename CharacterType&gt; ALWAYS_INLINE static bool isInSimpleEncodeSet(CharacterType character) { return character &gt; 0x7E || isC0Control(character); }
</span><span class="cx"> template&lt;typename CharacterType&gt; ALWAYS_INLINE static bool isInDefaultEncodeSet(CharacterType character) { return character &gt; 0x7E || characterClassTable[character] &amp; Default; }
</span><span class="cx"> template&lt;typename CharacterType&gt; ALWAYS_INLINE static bool isInUserInfoEncodeSet(CharacterType character) { return character &gt; 0x7E || characterClassTable[character] &amp; UserInfo; }
</span><del>-template&lt;typename CharacterType&gt; ALWAYS_INLINE static bool isInvalidDomainCharacter(CharacterType character) { return character &lt;= ']' &amp;&amp; characterClassTable[character] &amp; InvalidDomain; }
</del><span class="cx"> template&lt;typename CharacterType&gt; ALWAYS_INLINE static bool isPercentOrNonASCII(CharacterType character) { return !isASCII(character) || character == '%'; }
</span><span class="cx"> template&lt;typename CharacterType&gt; ALWAYS_INLINE static bool isSlashQuestionOrHash(CharacterType character) { return character &lt;= '\\' &amp;&amp; characterClassTable[character] &amp; SlashQuestionOrHash; }
</span><span class="cx"> template&lt;typename CharacterType&gt; ALWAYS_INLINE static bool isValidSchemeCharacter(CharacterType character) { return character &lt;= 'z' &amp;&amp; characterClassTable[character] &amp; ValidScheme; }
</span><span class="lines">@@ -2517,10 +2515,10 @@
</span><span class="cx">     return std::nullopt;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool URLParser::hasInvalidDomainCharacter(const Vector&lt;LChar, URLParser::defaultInlineBufferSize&gt;&amp; asciiDomain)
</del><ins>+bool URLParser::hasForbiddenHostCodePoint(const Vector&lt;LChar, URLParser::defaultInlineBufferSize&gt;&amp; asciiDomain)
</ins><span class="cx"> {
</span><span class="cx">     for (size_t i = 0; i &lt; asciiDomain.size(); ++i) {
</span><del>-        if (isInvalidDomainCharacter(asciiDomain[i]))
</del><ins>+        if (isForbiddenHostCodePoint(asciiDomain[i]))
</ins><span class="cx">             return true;
</span><span class="cx">     }
</span><span class="cx">     return false;
</span><span class="lines">@@ -2614,7 +2612,7 @@
</span><span class="cx">             }
</span><span class="cx">             if (*iterator == ':')
</span><span class="cx">                 break;
</span><del>-            if (UNLIKELY(isForbiddenHostCodePoint(*iterator)))
</del><ins>+            if (UNLIKELY(isForbiddenHostCodePoint(*iterator) &amp;&amp; *iterator != '%'))
</ins><span class="cx">                 return false;
</span><span class="cx">             utf8PercentEncode&lt;isInSimpleEncodeSet&gt;(iterator);
</span><span class="cx">         }
</span><span class="lines">@@ -2633,7 +2631,7 @@
</span><span class="cx">                 continue;
</span><span class="cx">             if (*iterator == ':')
</span><span class="cx">                 break;
</span><del>-            if (isInvalidDomainCharacter(*iterator))
</del><ins>+            if (isForbiddenHostCodePoint(*iterator))
</ins><span class="cx">                 return false;
</span><span class="cx">         }
</span><span class="cx">         if (auto address = parseIPv4Host(hostIterator, CodePointIterator&lt;CharacterType&gt;(hostIterator, iterator))) {
</span><span class="lines">@@ -2689,7 +2687,7 @@
</span><span class="cx">     if (domain != StringView(percentDecoded.data(), percentDecoded.size()))
</span><span class="cx">         syntaxViolation(hostBegin);
</span><span class="cx">     auto asciiDomain = domainToASCII(domain, hostBegin);
</span><del>-    if (!asciiDomain || hasInvalidDomainCharacter(asciiDomain.value()))
</del><ins>+    if (!asciiDomain || hasForbiddenHostCodePoint(asciiDomain.value()))
</ins><span class="cx">         return false;
</span><span class="cx">     Vector&lt;LChar, defaultInlineBufferSize&gt;&amp; asciiDomainValue = asciiDomain.value();
</span><span class="cx">     const LChar* asciiDomainCharacters = asciiDomainValue.data();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformURLParserh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/URLParser.h (212248 => 212249)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/URLParser.h        2017-02-13 21:55:55 UTC (rev 212248)
+++ trunk/Source/WebCore/platform/URLParser.h        2017-02-13 22:52:34 UTC (rev 212249)
</span><span class="lines">@@ -98,7 +98,7 @@
</span><span class="cx">     template&lt;typename CharacterType&gt; Vector&lt;LChar, defaultInlineBufferSize&gt; percentDecode(const LChar*, size_t, const CodePointIterator&lt;CharacterType&gt;&amp; iteratorForSyntaxViolationPosition);
</span><span class="cx">     static Vector&lt;LChar, defaultInlineBufferSize&gt; percentDecode(const LChar*, size_t);
</span><span class="cx">     static std::optional&lt;String&gt; formURLDecode(StringView input);
</span><del>-    static bool hasInvalidDomainCharacter(const Vector&lt;LChar, defaultInlineBufferSize&gt;&amp;);
</del><ins>+    static bool hasForbiddenHostCodePoint(const Vector&lt;LChar, defaultInlineBufferSize&gt;&amp;);
</ins><span class="cx">     void percentEncodeByte(uint8_t);
</span><span class="cx">     void appendToASCIIBuffer(UChar32);
</span><span class="cx">     void appendToASCIIBuffer(const char*, size_t);
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (212248 => 212249)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2017-02-13 21:55:55 UTC (rev 212248)
+++ trunk/Tools/ChangeLog        2017-02-13 22:52:34 UTC (rev 212249)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2017-02-13  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Percent should be allowed in non-special URL hosts
+        https://bugs.webkit.org/show_bug.cgi?id=168255
+
+        Reviewed by Tim Horton.
+
+        * TestWebKitAPI/Tests/WebCore/URLParser.cpp:
+        (TestWebKitAPI::TEST_F):
+
</ins><span class="cx"> 2017-02-13  Fujii Hironori  &lt;Hironori.Fujii@sony.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Nwtr unexpectedly passes mismatch ref test if the hashes doesn't match but no diff
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebCoreURLParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/URLParser.cpp (212248 => 212249)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebCore/URLParser.cpp        2017-02-13 21:55:55 UTC (rev 212248)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/URLParser.cpp        2017-02-13 22:52:34 UTC (rev 212249)
</span><span class="lines">@@ -980,12 +980,8 @@
</span><span class="cx">         {&quot;http&quot;, &quot;&quot;, &quot;&quot;, &quot;f&quot;, 10, &quot;/c&quot;, &quot;&quot;, &quot;&quot;, &quot;http://f:10/c&quot;},
</span><span class="cx">         {&quot;http&quot;, &quot;&quot;, &quot;&quot;, &quot;f&quot;, 10, &quot;/c&quot;, &quot;&quot;, &quot;&quot;, &quot;http://f:010/c&quot;});
</span><span class="cx">     checkURL(&quot;notspecial://HoSt&quot;, {&quot;notspecial&quot;, &quot;&quot;, &quot;&quot;, &quot;HoSt&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;notspecial://HoSt&quot;});
</span><del>-    checkURLDifferences(&quot;notspecial://H%6FSt&quot;,
-        {&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;notspecial://H%6FSt&quot;},
-        {&quot;notspecial&quot;, &quot;&quot;, &quot;&quot;, &quot;H%6FSt&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;notspecial://H%6FSt&quot;});
-    checkURLDifferences(&quot;notspecial://H%4fSt&quot;,
-        {&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;notspecial://H%4fSt&quot;},
-        {&quot;notspecial&quot;, &quot;&quot;, &quot;&quot;, &quot;H%4fSt&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;notspecial://H%4fSt&quot;});
</del><ins>+    checkURL(&quot;notspecial://H%6FSt&quot;, {&quot;notspecial&quot;, &quot;&quot;, &quot;&quot;, &quot;H%6FSt&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;notspecial://H%6FSt&quot;});
+    checkURL(&quot;notspecial://H%4fSt&quot;, {&quot;notspecial&quot;, &quot;&quot;, &quot;&quot;, &quot;H%4fSt&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;notspecial://H%4fSt&quot;});
</ins><span class="cx">     checkURLDifferences(utf16String(u&quot;notspecial://H😍ßt&quot;),
</span><span class="cx">         {&quot;notspecial&quot;, &quot;&quot;, &quot;&quot;, &quot;H%F0%9F%98%8D%C3%9Ft&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;notspecial://H%F0%9F%98%8D%C3%9Ft&quot;},
</span><span class="cx">         {&quot;notspecial&quot;, &quot;&quot;, &quot;&quot;, &quot;xn--hsst-qc83c&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;notspecial://xn--hsst-qc83c&quot;}, testTabsValueForSurrogatePairs);
</span><span class="lines">@@ -1073,15 +1069,9 @@
</span><span class="cx">         {&quot;asdf&quot;, &quot;&quot;, &quot;&quot;, &quot;[::a:b:c:d]&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;asdf://[::a:b:c:d]&quot;},
</span><span class="cx">         {&quot;asdf&quot;, &quot;&quot;, &quot;&quot;, &quot;[0:0:0:0:a:b:c:d]&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;asdf://[0:0:0:0:a:b:c:d]&quot;}, TestTabs::No);
</span><span class="cx">     shouldFail(&quot;a://%:a&quot;);
</span><del>-    checkURLDifferences(&quot;a://%:/&quot;,
-        {&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;a://%:/&quot;},
-        {&quot;a&quot;, &quot;&quot;, &quot;&quot;, &quot;%&quot;, 0, &quot;/&quot;, &quot;&quot;, &quot;&quot;, &quot;a://%/&quot;});
-    checkURLDifferences(&quot;a://%:&quot;,
-        {&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;a://%:&quot;},
-        {&quot;a&quot;, &quot;&quot;, &quot;&quot;, &quot;%&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;a://%&quot;});
-    checkURLDifferences(&quot;a://%:1/&quot;,
-        {&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;a://%:1/&quot;},
-        {&quot;a&quot;, &quot;&quot;, &quot;&quot;, &quot;%&quot;, 1, &quot;/&quot;, &quot;&quot;, &quot;&quot;, &quot;a://%:1/&quot;});
</del><ins>+    checkURL(&quot;a://%:/&quot;, {&quot;a&quot;, &quot;&quot;, &quot;&quot;, &quot;%&quot;, 0, &quot;/&quot;, &quot;&quot;, &quot;&quot;, &quot;a://%/&quot;});
+    checkURL(&quot;a://%:&quot;, {&quot;a&quot;, &quot;&quot;, &quot;&quot;, &quot;%&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;a://%&quot;});
+    checkURL(&quot;a://%:1/&quot;, {&quot;a&quot;, &quot;&quot;, &quot;&quot;, &quot;%&quot;, 1, &quot;/&quot;, &quot;&quot;, &quot;&quot;, &quot;a://%:1/&quot;});
</ins><span class="cx">     checkURLDifferences(&quot;http://%:&quot;,
</span><span class="cx">         {&quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;http://%:&quot;},
</span><span class="cx">         {&quot;http&quot;, &quot;&quot;, &quot;&quot;, &quot;%&quot;, 0, &quot;/&quot;, &quot;&quot;, &quot;&quot;, &quot;http://%/&quot;});
</span></span></pre>
</div>
</div>

</body>
</html>