<!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>[213253] 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/213253">213253</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2017-03-01 16:28:27 -0800 (Wed, 01 Mar 2017)</dd>
</dl>

<h3>Log Message</h3>
<pre>[WK2][!NETWORK_SESSION] Failure to download when using a download attribute with no value on an anchor
https://bugs.webkit.org/show_bug.cgi?id=169060
&lt;rdar://problem/30773140&gt;

Reviewed by Darin Adler.

Source/WebCore:

Make sure we never set the suggested filename to the empty string when
the download attribute is present but has no value.

Test: http/tests/download/anchor-download-no-value.html

* loader/PolicyChecker.cpp:
(WebCore::PolicyChecker::checkNavigationPolicy):

Source/WebKit2:

In the !NETWORK_SESSION code path, we were failing to use the suggested filename coming from the
network layer in the case where the download attribute is present but has no value. We were ending
up passing an empty string as suggested filename to Safari which is not handled properly.

* UIProcess/Downloads/DownloadProxy.cpp:
(WebKit::DownloadProxy::decideDestinationWithSuggestedFilename):

LayoutTests:

Add layout test coverage.

* http/tests/download/anchor-download-no-value-expected.txt: Added.
* http/tests/download/anchor-download-no-value.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorwk1TestExpectations">trunk/LayoutTests/platform/ios-simulator-wk1/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformiossimulatorwk2TestExpectations">trunk/LayoutTests/platform/ios-simulator-wk2/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk1TestExpectations">trunk/LayoutTests/platform/mac-wk1/TestExpectations</a></li>
<li><a href="#trunkLayoutTestsplatformwinTestExpectations">trunk/LayoutTests/platform/win/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreloaderPolicyCheckercpp">trunk/Source/WebCore/loader/PolicyChecker.cpp</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2UIProcessDownloadsDownloadProxycpp">trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestshttptestsdownloadanchordownloadnovalueexpectedtxt">trunk/LayoutTests/http/tests/download/anchor-download-no-value-expected.txt</a></li>
<li><a href="#trunkLayoutTestshttptestsdownloadanchordownloadnovaluehtml">trunk/LayoutTests/http/tests/download/anchor-download-no-value.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (213252 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2017-03-02 00:14:37 UTC (rev 213252)
+++ trunk/LayoutTests/ChangeLog        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -1,3 +1,16 @@
</span><ins>+2017-03-01  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        [WK2][!NETWORK_SESSION] Failure to download when using a download attribute with no value on an anchor
+        https://bugs.webkit.org/show_bug.cgi?id=169060
+        &lt;rdar://problem/30773140&gt;
+
+        Reviewed by Darin Adler.
+
+        Add layout test coverage.
+
+        * http/tests/download/anchor-download-no-value-expected.txt: Added.
+        * http/tests/download/anchor-download-no-value.html: Added.
+
</ins><span class="cx"> 2017-03-01  Antoine Quint  &lt;graouts@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [ios-simulator] Unskip media/modern-media-controls/audio/audio-controls-metrics.html
</span></span></pre></div>
<a id="trunkLayoutTestshttptestsdownloadanchordownloadnovalueexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/download/anchor-download-no-value-expected.txt (0 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/download/anchor-download-no-value-expected.txt                                (rev 0)
+++ trunk/LayoutTests/http/tests/download/anchor-download-no-value-expected.txt        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -0,0 +1,6 @@
</span><ins>+Download started.
+Downloading URL with suggested filename &quot;abe.png&quot;
+Download completed.
+The suggested filename above should be &quot;abe.png&quot; and the download should succeed.
+
+Link with download attribute.
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestsdownloadanchordownloadnovaluehtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/download/anchor-download-no-value.html (0 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/download/anchor-download-no-value.html                                (rev 0)
+++ trunk/LayoutTests/http/tests/download/anchor-download-no-value.html        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -0,0 +1,34 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;head&gt;
+&lt;script type='text/javascript'&gt;
+if (window.testRunner) {
+  testRunner.dumpAsText();
+  testRunner.waitUntilDone();
+}
+&lt;/script&gt;
+&lt;/head&gt;
+&lt;body&gt;
+&lt;p&gt;The suggested filename above should be &quot;abe.png&quot; and the download should succeed.&lt;/p&gt;
+&lt;a id=&quot;download-url&quot; href=&quot;/css/resources/abe.png&quot; download&gt;Link with download attribute.&lt;/a&gt;
+&lt;script&gt;
+function click(elmt)
+{
+    if (!window.eventSender) {
+        alert('Click the link to run the test.');
+        return;
+    }
+    eventSender.mouseMoveTo(elmt.offsetLeft + 5, elmt.offsetTop + 5);
+    eventSender.mouseDown();
+    eventSender.mouseUp();
+}
+
+function runTest()
+{
+    var link = document.getElementById(&quot;download-url&quot;);
+    click(link);
+}
+runTest();
+&lt;/script&gt;
+&lt;/body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorwk1TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator-wk1/TestExpectations (213252 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator-wk1/TestExpectations        2017-03-02 00:14:37 UTC (rev 213252)
+++ trunk/LayoutTests/platform/ios-simulator-wk1/TestExpectations        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -1335,6 +1335,7 @@
</span><span class="cx"> webkit.org/b/156069 http/tests/security/anchor-download-allow-data.html [ Skip ]
</span><span class="cx"> webkit.org/b/156069 http/tests/security/anchor-download-allow-sameorigin.html [ Skip ]
</span><span class="cx"> webkit.org/b/156069 http/tests/security/anchor-download-block-crossorigin.html [ Skip ]
</span><ins>+webkit.org/b/156069 http/tests/download/anchor-download-no-value.html [ Skip ]
</ins><span class="cx"> 
</span><span class="cx"> # testRunner.setShouldDownloadUndisplayableMIMETypes() is not supported on WK1.
</span><span class="cx"> fast/dom/HTMLAnchorElement/anchor-file-blob-convert-to-download.html [ Skip ]
</span></span></pre></div>
<a id="trunkLayoutTestsplatformiossimulatorwk2TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/ios-simulator-wk2/TestExpectations (213252 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/ios-simulator-wk2/TestExpectations        2017-03-02 00:14:37 UTC (rev 213252)
+++ trunk/LayoutTests/platform/ios-simulator-wk2/TestExpectations        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -1826,6 +1826,7 @@
</span><span class="cx"> webkit.org/b/156067 http/tests/security/anchor-download-allow-data.html [ Skip ]
</span><span class="cx"> webkit.org/b/156067 http/tests/security/anchor-download-allow-sameorigin.html [ Skip ]
</span><span class="cx"> webkit.org/b/156067 http/tests/security/anchor-download-block-crossorigin.html [ Skip ]
</span><ins>+webkit.org/b/156067 http/tests/download/anchor-download-no-value.html [ Skip ]
</ins><span class="cx"> 
</span><span class="cx"> webkit.org/b/149087 http/tests/cache/disk-cache/disk-cache-vary.html [ Pass Timeout ]
</span><span class="cx"> webkit.org/b/149087 http/tests/cache/disk-cache/disk-cache-vary-no-body.html [ Pass Timeout ]
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk1TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (213252 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk1/TestExpectations        2017-03-02 00:14:37 UTC (rev 213252)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -224,6 +224,7 @@
</span><span class="cx"> webkit.org/b/156069 http/tests/security/anchor-download-allow-data.html [ Skip ]
</span><span class="cx"> webkit.org/b/156069 http/tests/security/anchor-download-allow-sameorigin.html [ Skip ]
</span><span class="cx"> webkit.org/b/156069 http/tests/security/anchor-download-block-crossorigin.html [ Skip ]
</span><ins>+webkit.org/b/156069 http/tests/download/anchor-download-no-value.html [ Skip ]
</ins><span class="cx"> webkit.org/b/156069 imported/w3c/web-platform-tests/html/semantics/text-level-semantics/the-a-element/a-download-click.html [ Skip ]
</span><span class="cx"> webkit.org/b/156069 imported/w3c/web-platform-tests/html/semantics/embedded-content/the-area-element/area-download-click.html [ Skip ]
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkLayoutTestsplatformwinTestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/win/TestExpectations (213252 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/win/TestExpectations        2017-03-02 00:14:37 UTC (rev 213252)
+++ trunk/LayoutTests/platform/win/TestExpectations        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -453,6 +453,7 @@
</span><span class="cx"> http/tests/download/area-download.html [ Skip ]
</span><span class="cx"> http/tests/security/anchor-download-allow-data.html [ Skip ]
</span><span class="cx"> http/tests/security/anchor-download-allow-sameorigin.html [ Skip ]
</span><ins>+http/tests/download/anchor-download-no-value.html [ Skip ]
</ins><span class="cx"> 
</span><span class="cx"> # testRunner.setShouldDownloadUndisplayableMIMETypes() is not supported on WK1.
</span><span class="cx"> fast/dom/HTMLAnchorElement/anchor-file-blob-convert-to-download.html [ Skip ]
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (213252 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2017-03-02 00:14:37 UTC (rev 213252)
+++ trunk/Source/WebCore/ChangeLog        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -1,3 +1,19 @@
</span><ins>+2017-03-01  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        [WK2][!NETWORK_SESSION] Failure to download when using a download attribute with no value on an anchor
+        https://bugs.webkit.org/show_bug.cgi?id=169060
+        &lt;rdar://problem/30773140&gt;
+
+        Reviewed by Darin Adler.
+
+        Make sure we never set the suggested filename to the empty string when
+        the download attribute is present but has no value.
+
+        Test: http/tests/download/anchor-download-no-value.html
+
+        * loader/PolicyChecker.cpp:
+        (WebCore::PolicyChecker::checkNavigationPolicy):
+
</ins><span class="cx"> 2017-03-01  Antoine Quint  &lt;graouts@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [ios-simulator] Unskip media/modern-media-controls/audio/audio-controls-metrics.html
</span></span></pre></div>
<a id="trunkSourceWebCoreloaderPolicyCheckercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/PolicyChecker.cpp (213252 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/PolicyChecker.cpp        2017-03-02 00:14:37 UTC (rev 213252)
+++ trunk/Source/WebCore/loader/PolicyChecker.cpp        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -145,7 +145,7 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     m_delegateIsDecidingNavigationPolicy = true;
</span><del>-    m_suggestedFilename = action.downloadAttribute();
</del><ins>+    m_suggestedFilename = action.downloadAttribute().isEmpty() ? nullAtom : action.downloadAttribute();
</ins><span class="cx">     m_frame.loader().client().dispatchDecidePolicyForNavigationAction(action, request, formState, [this](PolicyAction action) {
</span><span class="cx">         continueAfterNavigationPolicy(action);
</span><span class="cx">     });
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (213252 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2017-03-02 00:14:37 UTC (rev 213252)
+++ trunk/Source/WebKit2/ChangeLog        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2017-03-01  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        [WK2][!NETWORK_SESSION] Failure to download when using a download attribute with no value on an anchor
+        https://bugs.webkit.org/show_bug.cgi?id=169060
+        &lt;rdar://problem/30773140&gt;
+
+        Reviewed by Darin Adler.
+
+        In the !NETWORK_SESSION code path, we were failing to use the suggested filename coming from the
+        network layer in the case where the download attribute is present but has no value. We were ending
+        up passing an empty string as suggested filename to Safari which is not handled properly.
+
+        * UIProcess/Downloads/DownloadProxy.cpp:
+        (WebKit::DownloadProxy::decideDestinationWithSuggestedFilename):
+
</ins><span class="cx"> 2017-02-28  Matt Rajca  &lt;mrajca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Media: notify clients when autoplayed media is muted
</span></span></pre></div>
<a id="trunkSourceWebKit2UIProcessDownloadsDownloadProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp (213252 => 213253)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp        2017-03-02 00:14:37 UTC (rev 213252)
+++ trunk/Source/WebKit2/UIProcess/Downloads/DownloadProxy.cpp        2017-03-02 00:28:27 UTC (rev 213253)
</span><span class="lines">@@ -201,7 +201,7 @@
</span><span class="cx">     if (!m_processPool)
</span><span class="cx">         return;
</span><span class="cx"> 
</span><del>-    String suggestedFilename = MIMETypeRegistry::appendFileExtensionIfNecessary(m_suggestedFilename.isNull() ? filename : m_suggestedFilename, mimeType);
</del><ins>+    String suggestedFilename = MIMETypeRegistry::appendFileExtensionIfNecessary(m_suggestedFilename.isEmpty() ? filename : m_suggestedFilename, mimeType);
</ins><span class="cx">     destination = m_processPool-&gt;downloadClient().decideDestinationWithSuggestedFilename(m_processPool.get(), this, suggestedFilename, allowOverwrite);
</span><span class="cx"> 
</span><span class="cx">     if (!destination.isNull())
</span></span></pre>
</div>
</div>

</body>
</html>