<!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>[209572] 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/209572">209572</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-12-08 14:42:18 -0800 (Thu, 08 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION (URL parser): Relative URLs aren’t resolved correctly when the base URL is an applewebdata: URL
https://bugs.webkit.org/show_bug.cgi?id=165621

Reviewed by Dan Bernstein.

Source/WebCore:

Covered by new API tests.

* platform/URLParser.cpp:
(WebCore::URLParser::parse):
URLs with nonspecial schemes and no slash after the host get no slash as the path to maintain compatibility with all browsers.
This was proposed to the URL spec in https://github.com/whatwg/url/issues/148
When such as URL is used as a base URL with a relative path, in order to maintain compatibility with URL::parse we need to prepend
a slash to the path.  For completeness I added tests with a relative path, a relative query, a relative fragment, and a relative empty string,
and because the fate of the spec is unclear in this case, I decided to maintain compatibility with URL::parse in all these cases.

Tools:

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

<h3>Modified Paths</h3>
<ul>
<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="#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="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (209571 => 209572)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-08 22:22:52 UTC (rev 209571)
+++ trunk/Source/WebCore/ChangeLog        2016-12-08 22:42:18 UTC (rev 209572)
</span><span class="lines">@@ -1,3 +1,20 @@
</span><ins>+2016-12-08  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        REGRESSION (URL parser): Relative URLs aren’t resolved correctly when the base URL is an applewebdata: URL
+        https://bugs.webkit.org/show_bug.cgi?id=165621
+
+        Reviewed by Dan Bernstein.
+
+        Covered by new API tests.
+
+        * platform/URLParser.cpp:
+        (WebCore::URLParser::parse):
+        URLs with nonspecial schemes and no slash after the host get no slash as the path to maintain compatibility with all browsers.
+        This was proposed to the URL spec in https://github.com/whatwg/url/issues/148
+        When such as URL is used as a base URL with a relative path, in order to maintain compatibility with URL::parse we need to prepend
+        a slash to the path.  For completeness I added tests with a relative path, a relative query, a relative fragment, and a relative empty string,
+        and because the fate of the spec is unclear in this case, I decided to maintain compatibility with URL::parse in all these cases.
+
</ins><span class="cx"> 2016-12-06  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Concurrent GC should be stable enough to land enabled on X86_64
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformURLParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/URLParser.cpp (209571 => 209572)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/URLParser.cpp        2016-12-08 22:22:52 UTC (rev 209571)
+++ trunk/Source/WebCore/platform/URLParser.cpp        2016-12-08 22:42:18 UTC (rev 209572)
</span><span class="lines">@@ -1355,6 +1355,10 @@
</span><span class="cx">                 break;
</span><span class="cx">             default:
</span><span class="cx">                 copyURLPartsUntil(base, URLPart::PathAfterLastSlash, c, isUTF8Encoding);
</span><ins>+                if (currentPosition(c) &amp;&amp; parsedDataView(currentPosition(c) - 1) != '/') {
+                    appendToASCIIBuffer('/');
+                    m_url.m_pathAfterLastSlash = currentPosition(c);
+                }
</ins><span class="cx">                 state = State::Path;
</span><span class="cx">                 break;
</span><span class="cx">             }
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (209571 => 209572)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-12-08 22:22:52 UTC (rev 209571)
+++ trunk/Tools/ChangeLog        2016-12-08 22:42:18 UTC (rev 209572)
</span><span class="lines">@@ -1,3 +1,13 @@
</span><ins>+2016-12-08  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        REGRESSION (URL parser): Relative URLs aren’t resolved correctly when the base URL is an applewebdata: URL
+        https://bugs.webkit.org/show_bug.cgi?id=165621
+
+        Reviewed by Dan Bernstein.
+
+        * TestWebKitAPI/Tests/WebCore/URLParser.cpp:
+        (TestWebKitAPI::TEST_F):
+
</ins><span class="cx"> 2016-12-06  Filip Pizlo  &lt;fpizlo@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Concurrent GC should be stable enough to land enabled
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebCoreURLParsercpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/URLParser.cpp (209571 => 209572)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebCore/URLParser.cpp        2016-12-08 22:22:52 UTC (rev 209571)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/URLParser.cpp        2016-12-08 22:42:18 UTC (rev 209572)
</span><span class="lines">@@ -634,6 +634,11 @@
</span><span class="cx">         {&quot;foo&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;foo://&quot;},
</span><span class="cx">         {&quot;foo&quot;, &quot;&quot;, &quot;&quot;, &quot;&quot;, 0, &quot;//&quot;, &quot;&quot;, &quot;&quot;, &quot;foo://&quot;});
</span><span class="cx">     checkRelativeURL(utf16String(u&quot;#β&quot;), &quot;http://example.org/foo/bar&quot;, {&quot;http&quot;, &quot;&quot;, &quot;&quot;, &quot;example.org&quot;, 0, &quot;/foo/bar&quot;, &quot;&quot;, &quot;%CE%B2&quot;, &quot;http://example.org/foo/bar#%CE%B2&quot;});
</span><ins>+    checkRelativeURL(&quot;index.html&quot;, &quot;applewebdata://Host/&quot;, {&quot;applewebdata&quot;, &quot;&quot;, &quot;&quot;, &quot;Host&quot;, 0, &quot;/index.html&quot;, &quot;&quot;, &quot;&quot;, &quot;applewebdata://Host/index.html&quot;});
+    checkRelativeURL(&quot;index.html&quot;, &quot;applewebdata://Host&quot;, {&quot;applewebdata&quot;, &quot;&quot;, &quot;&quot;, &quot;Host&quot;, 0, &quot;/index.html&quot;, &quot;&quot;, &quot;&quot;, &quot;applewebdata://Host/index.html&quot;});
+    checkRelativeURL(&quot;&quot;, &quot;applewebdata://Host&quot;, {&quot;applewebdata&quot;, &quot;&quot;, &quot;&quot;, &quot;Host&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;&quot;, &quot;applewebdata://Host&quot;});
+    checkRelativeURL(&quot;?query&quot;, &quot;applewebdata://Host&quot;, {&quot;applewebdata&quot;, &quot;&quot;, &quot;&quot;, &quot;Host&quot;, 0, &quot;&quot;, &quot;query&quot;, &quot;&quot;, &quot;applewebdata://Host?query&quot;});
+    checkRelativeURL(&quot;#fragment&quot;, &quot;applewebdata://Host&quot;, {&quot;applewebdata&quot;, &quot;&quot;, &quot;&quot;, &quot;Host&quot;, 0, &quot;&quot;, &quot;&quot;, &quot;fragment&quot;, &quot;applewebdata://Host#fragment&quot;});
</ins><span class="cx"> 
</span><span class="cx">     // The checking of slashes in SpecialAuthoritySlashes needed to get this to pass contradicts what is in the spec,
</span><span class="cx">     // but it is included in the web platform tests.
</span></span></pre>
</div>
</div>

</body>
</html>