<!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>[206168] 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/206168">206168</a></dd>
<dt>Author</dt> <dd>achristensen@apple.com</dd>
<dt>Date</dt> <dd>2016-09-20 13:11:54 -0700 (Tue, 20 Sep 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Make URLSearchParams spec-compliant
https://bugs.webkit.org/show_bug.cgi?id=162247

Reviewed by Chris Dumez and Sam Weinig.

LayoutTests/imported/w3c:

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

Source/WebCore:

Covered by newly-passing web platform tests.

* html/DOMURL.cpp:
(WebCore::DOMURL::~DOMURL):
(WebCore::DOMURL::setHref):
(WebCore::DOMURL::setQuery):
Update any associated URLSearchParams object when the query could change.
(WebCore::DOMURL::searchParams):
The lifetime of the URLSearchParams was wrong.  We were creating a new URLSearchParams each time
URL.searchParams was called, and we should have been creating one the first time and returning the
same instance for subsequent calls.  This means the DOMURL must own the URLSearchParams if it is associated,
but if it is not associated, then a URLSearchParams can live on its own.
* html/DOMURL.h:
* html/URLSearchParams.h:
(WebCore::URLSearchParams::URLDestroyed):
(WebCore::URLSearchParams::setContents):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsimportedw3cChangeLog">trunk/LayoutTests/imported/w3c/ChangeLog</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="#trunkSourceWebCorehtmlDOMURLcpp">trunk/Source/WebCore/html/DOMURL.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlDOMURLh">trunk/Source/WebCore/html/DOMURL.h</a></li>
<li><a href="#trunkSourceWebCorehtmlURLSearchParamscpp">trunk/Source/WebCore/html/URLSearchParams.cpp</a></li>
<li><a href="#trunkSourceWebCorehtmlURLSearchParamsh">trunk/Source/WebCore/html/URLSearchParams.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsimportedw3cChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/imported/w3c/ChangeLog (206167 => 206168)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/ChangeLog        2016-09-20 20:05:31 UTC (rev 206167)
+++ trunk/LayoutTests/imported/w3c/ChangeLog        2016-09-20 20:11:54 UTC (rev 206168)
</span><span class="lines">@@ -1,5 +1,14 @@
</span><span class="cx"> 2016-09-20  Alex Christensen  &lt;achristensen@webkit.org&gt;
</span><span class="cx"> 
</span><ins>+        Make URLSearchParams spec-compliant
+        https://bugs.webkit.org/show_bug.cgi?id=162247
+
+        Reviewed by Chris Dumez and Sam Weinig.
+
+        * web-platform-tests/url/url-constructor-expected.txt:
+
+2016-09-20  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
</ins><span class="cx">         Non-special URLs should have an opaque origin
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=162254
</span><span class="cx"> 
</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 (206167 => 206168)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt        2016-09-20 20:05:31 UTC (rev 206167)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/url/url-constructor-expected.txt        2016-09-20 20:11:54 UTC (rev 206168)
</span><span class="lines">@@ -1,8 +1,8 @@
</span><span class="cx"> 
</span><span class="cx"> PASS URL.searchParams getter 
</span><del>-FAIL URL.searchParams updating, clearing assert_equals: expected &quot;&quot; but got &quot;a=b&quot;
</del><ins>+PASS URL.searchParams updating, clearing 
</ins><span class="cx"> PASS URL.searchParams setter, invalid values 
</span><del>-FAIL URL.searchParams and URL.search setters, update propagation assert_equals: expected &quot;e=f&amp;g=h&quot; but got &quot;a=b&amp;c=d&quot;
</del><ins>+PASS URL.searchParams and URL.search setters, update propagation 
</ins><span class="cx"> PASS Loading data… 
</span><span class="cx"> PASS Parsing: &lt;http://example        .
</span><span class="cx"> org&gt; against &lt;http://example.org/foo/bar&gt; 
</span><span class="lines">@@ -350,7 +350,7 @@
</span><span class="cx"> a
</span><span class="cx"> g&gt; against &lt;about:blank&gt; 
</span><span class="cx"> PASS Parsing: &lt;?a=b&amp;c=d&gt; against &lt;http://example.org/foo/bar&gt; 
</span><del>-FAIL Parsing: &lt;??a=b&amp;c=d&gt; against &lt;http://example.org/foo/bar&gt; assert_equals: searchParams expected &quot;%3Fa=b&amp;c=d&quot; but got &quot;a=b&amp;c=d&quot;
</del><ins>+PASS Parsing: &lt;??a=b&amp;c=d&gt; against &lt;http://example.org/foo/bar&gt; 
</ins><span class="cx"> PASS Parsing: &lt;http:&gt; against &lt;http://example.org/foo/bar&gt; 
</span><span class="cx"> FAIL Parsing: &lt;http:&gt; against &lt;https://example.org/foo/bar&gt; assert_throws: function &quot;function () {
</span><span class="cx">           bURL(expected.input, expected.bas...&quot; did not throw
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (206167 => 206168)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-09-20 20:05:31 UTC (rev 206167)
+++ trunk/Source/WebCore/ChangeLog        2016-09-20 20:11:54 UTC (rev 206168)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2016-09-20  Alex Christensen  &lt;achristensen@webkit.org&gt;
+
+        Make URLSearchParams spec-compliant
+        https://bugs.webkit.org/show_bug.cgi?id=162247
+
+        Reviewed by Chris Dumez and Sam Weinig.
+
+        Covered by newly-passing web platform tests.
+
+        * html/DOMURL.cpp:
+        (WebCore::DOMURL::~DOMURL):
+        (WebCore::DOMURL::setHref):
+        (WebCore::DOMURL::setQuery):
+        Update any associated URLSearchParams object when the query could change.
+        (WebCore::DOMURL::searchParams):
+        The lifetime of the URLSearchParams was wrong.  We were creating a new URLSearchParams each time
+        URL.searchParams was called, and we should have been creating one the first time and returning the
+        same instance for subsequent calls.  This means the DOMURL must own the URLSearchParams if it is associated,
+        but if it is not associated, then a URLSearchParams can live on its own.
+        * html/DOMURL.h:
+        * html/URLSearchParams.h:
+        (WebCore::URLSearchParams::URLDestroyed):
+        (WebCore::URLSearchParams::setContents):
+
</ins><span class="cx"> 2016-09-20  Antti Koivisto  &lt;antti@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove AuthorStyleSheets::m_hadActiveLoadingStylesheet bit
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlDOMURLcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/DOMURL.cpp (206167 => 206168)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/DOMURL.cpp        2016-09-20 20:05:31 UTC (rev 206167)
+++ trunk/Source/WebCore/html/DOMURL.cpp        2016-09-20 20:11:54 UTC (rev 206168)
</span><span class="lines">@@ -78,9 +78,17 @@
</span><span class="cx">         ec = TypeError;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+DOMURL::~DOMURL()
+{
+    if (m_searchParams)
+        m_searchParams-&gt;associatedURLDestroyed();
+}
+
</ins><span class="cx"> void DOMURL::setHref(const String&amp; url)
</span><span class="cx"> {
</span><span class="cx">     m_url = URL(m_baseURL, url);
</span><ins>+    if (m_searchParams)
+        m_searchParams-&gt;updateFromAssociatedURL();
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void DOMURL::setQuery(const String&amp; query)
</span><span class="lines">@@ -113,9 +121,11 @@
</span><span class="cx">     return publicURL.string();
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-Ref&lt;URLSearchParams&gt; DOMURL::searchParams()
</del><ins>+URLSearchParams&amp; DOMURL::searchParams()
</ins><span class="cx"> {
</span><del>-    return URLSearchParams::create(m_url.query(), this);
</del><ins>+    if (!m_searchParams)
+        m_searchParams = URLSearchParams::create(search(), this);
+    return *m_searchParams;
</ins><span class="cx"> }
</span><span class="cx">     
</span><span class="cx"> void DOMURL::revokeObjectURL(ScriptExecutionContext&amp; scriptExecutionContext, const String&amp; urlString)
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlDOMURLh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/DOMURL.h (206167 => 206168)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/DOMURL.h        2016-09-20 20:05:31 UTC (rev 206167)
+++ trunk/Source/WebCore/html/DOMURL.h        2016-09-20 20:11:54 UTC (rev 206168)
</span><span class="lines">@@ -45,6 +45,7 @@
</span><span class="cx">     static Ref&lt;DOMURL&gt; create(const String&amp; url, const String&amp; base, ExceptionCode&amp;);
</span><span class="cx">     static Ref&lt;DOMURL&gt; create(const String&amp; url, const DOMURL&amp; base, ExceptionCode&amp;);
</span><span class="cx">     static Ref&lt;DOMURL&gt; create(const String&amp; url, ExceptionCode&amp;);
</span><ins>+    ~DOMURL();
</ins><span class="cx"> 
</span><span class="cx">     URL href() const { return m_url; }
</span><span class="cx">     void setHref(const String&amp; url);
</span><span class="lines">@@ -51,13 +52,12 @@
</span><span class="cx">     void setHref(const String&amp;, ExceptionCode&amp;);
</span><span class="cx">     void setQuery(const String&amp;);
</span><span class="cx"> 
</span><del>-    Ref&lt;URLSearchParams&gt; searchParams();
</del><ins>+    URLSearchParams&amp; searchParams();
</ins><span class="cx"> 
</span><span class="cx">     static String createObjectURL(ScriptExecutionContext&amp;, Blob*);
</span><span class="cx">     static void revokeObjectURL(ScriptExecutionContext&amp;, const String&amp;);
</span><span class="cx"> 
</span><span class="cx">     static String createPublicURL(ScriptExecutionContext&amp;, URLRegistrable*);
</span><del>-
</del><span class="cx"> private:
</span><span class="cx">     DOMURL(const String&amp; url, const String&amp; base, ExceptionCode&amp;);
</span><span class="cx">     DOMURL(const String&amp; url, const DOMURL&amp; base, ExceptionCode&amp;);
</span><span class="lines">@@ -65,6 +65,7 @@
</span><span class="cx"> 
</span><span class="cx">     URL m_baseURL;
</span><span class="cx">     URL m_url;
</span><ins>+    RefPtr&lt;URLSearchParams&gt; m_searchParams;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebCore
</span></span></pre></div>
<a id="trunkSourceWebCorehtmlURLSearchParamscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/URLSearchParams.cpp (206167 => 206168)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/URLSearchParams.cpp        2016-09-20 20:05:31 UTC (rev 206167)
+++ trunk/Source/WebCore/html/URLSearchParams.cpp        2016-09-20 20:11:54 UTC (rev 206168)
</span><span class="lines">@@ -117,4 +117,11 @@
</span><span class="cx">         m_associatedURL-&gt;setQuery(URLParser::serialize(m_pairs));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void URLSearchParams::updateFromAssociatedURL()
+{
+    ASSERT(m_associatedURL);
+    String search = m_associatedURL-&gt;search();
+    m_pairs = search.startsWith('?') ? URLParser::parseURLEncodedForm(StringView(search).substring(1)) : URLParser::parseURLEncodedForm(search);
</ins><span class="cx"> }
</span><ins>+    
+}
</ins></span></pre></div>
<a id="trunkSourceWebCorehtmlURLSearchParamsh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/html/URLSearchParams.h (206167 => 206168)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/html/URLSearchParams.h        2016-09-20 20:05:31 UTC (rev 206167)
+++ trunk/Source/WebCore/html/URLSearchParams.h        2016-09-20 20:11:54 UTC (rev 206168)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx">     static Ref&lt;URLSearchParams&gt; create(const String&amp; string, DOMURL* associatedURL = nullptr) { return adoptRef(*new URLSearchParams(string, associatedURL)); }
</span><span class="cx">     static Ref&lt;URLSearchParams&gt; create(const Vector&lt;std::pair&lt;String, String&gt;&gt;&amp; pairs) { return adoptRef(*new URLSearchParams(pairs)); }
</span><span class="cx"> 
</span><ins>+    void associatedURLDestroyed() { m_associatedURL = nullptr; }
</ins><span class="cx">     void append(const String&amp; name, const String&amp; value);
</span><span class="cx">     void remove(const String&amp; name);
</span><span class="cx">     String get(const String&amp; name) const;
</span><span class="lines">@@ -43,6 +44,7 @@
</span><span class="cx">     void set(const String&amp; name, const String&amp; value);
</span><span class="cx">     String toString();
</span><span class="cx">     operator const Vector&lt;std::pair&lt;String, String&gt;&gt;&amp;() { return m_pairs; }
</span><ins>+    void updateFromAssociatedURL();
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     URLSearchParams(const String&amp;, DOMURL*);
</span><span class="lines">@@ -49,7 +51,7 @@
</span><span class="cx">     explicit URLSearchParams(const Vector&lt;std::pair&lt;String, String&gt;&gt;&amp;);
</span><span class="cx">     void updateURL();
</span><span class="cx"> 
</span><del>-    RefPtr&lt;DOMURL&gt; m_associatedURL;
</del><ins>+    DOMURL* m_associatedURL;
</ins><span class="cx">     Vector&lt;std::pair&lt;String, String&gt;&gt; m_pairs;
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>