<!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>[196822] trunk/Source/WebCore</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/196822">196822</a></dd>
<dt>Author</dt> <dd>jer.noble@apple.com</dd>
<dt>Date</dt> <dd>2016-02-19 10:05:55 -0800 (Fri, 19 Feb 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Allow CachedRawResource clients to opt out of caching on a per-response basis
https://bugs.webkit.org/show_bug.cgi?id=154453

Reviewed by Brady Eidson.

For CF or NS networking clients, the system loader will ask whether the client (the
SubResourceLoader in this case) wants the response to be cached. This breaks for byte
range requests due to &lt;rdar://problem/20001985&gt;. Allow the SubresourceLoader to query
its clients, and return null, if they opt out.

* loader/cache/CachedRawResource.cpp:
(WebCore::CachedRawResource::shouldCacheResponse):
* loader/cache/CachedRawResource.h:
* loader/cache/CachedRawResourceClient.h:
(WebCore::CachedRawResourceClient::shouldCacheResponse):
* loader/cache/CachedResource.h:
(WebCore::CachedResource::shouldCacheResponse):
* loader/cocoa/SubresourceLoaderCocoa.mm:
(WebCore::SubresourceLoader::willCacheResponse):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedRawResourcecpp">trunk/Source/WebCore/loader/cache/CachedRawResource.cpp</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedRawResourceh">trunk/Source/WebCore/loader/cache/CachedRawResource.h</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedRawResourceClienth">trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h</a></li>
<li><a href="#trunkSourceWebCoreloadercacheCachedResourceh">trunk/Source/WebCore/loader/cache/CachedResource.h</a></li>
<li><a href="#trunkSourceWebCoreloadercocoaSubresourceLoaderCocoamm">trunk/Source/WebCore/loader/cocoa/SubresourceLoaderCocoa.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (196821 => 196822)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-02-19 17:35:52 UTC (rev 196821)
+++ trunk/Source/WebCore/ChangeLog        2016-02-19 18:05:55 UTC (rev 196822)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2016-02-19  Jer Noble  &lt;jer.noble@apple.com&gt;
+
+        Allow CachedRawResource clients to opt out of caching on a per-response basis
+        https://bugs.webkit.org/show_bug.cgi?id=154453
+
+        Reviewed by Brady Eidson.
+
+        For CF or NS networking clients, the system loader will ask whether the client (the
+        SubResourceLoader in this case) wants the response to be cached. This breaks for byte
+        range requests due to &lt;rdar://problem/20001985&gt;. Allow the SubresourceLoader to query
+        its clients, and return null, if they opt out.
+
+        * loader/cache/CachedRawResource.cpp:
+        (WebCore::CachedRawResource::shouldCacheResponse):
+        * loader/cache/CachedRawResource.h:
+        * loader/cache/CachedRawResourceClient.h:
+        (WebCore::CachedRawResourceClient::shouldCacheResponse):
+        * loader/cache/CachedResource.h:
+        (WebCore::CachedResource::shouldCacheResponse):
+        * loader/cocoa/SubresourceLoaderCocoa.mm:
+        (WebCore::SubresourceLoader::willCacheResponse):
+
</ins><span class="cx"> 2016-02-19  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Blocked plug-in placeholder is sometimes not shown.
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedRawResourcecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedRawResource.cpp (196821 => 196822)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedRawResource.cpp        2016-02-19 17:35:52 UTC (rev 196821)
+++ trunk/Source/WebCore/loader/cache/CachedRawResource.cpp        2016-02-19 18:05:55 UTC (rev 196822)
</span><span class="lines">@@ -186,6 +186,16 @@
</span><span class="cx">         c-&gt;responseReceived(this, m_response);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool CachedRawResource::shouldCacheResponse(const ResourceResponse&amp; response)
+{
+    CachedResourceClientWalker&lt;CachedRawResourceClient&gt; w(m_clients);
+    while (CachedRawResourceClient* c = w.next()) {
+        if (!c-&gt;shouldCacheResponse(this, response))
+            return false;
+    }
+    return true;
+}
+
</ins><span class="cx"> void CachedRawResource::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
</span><span class="cx"> {
</span><span class="cx">     CachedResourceClientWalker&lt;CachedRawResourceClient&gt; w(m_clients);
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedRawResourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedRawResource.h (196821 => 196822)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedRawResource.h        2016-02-19 17:35:52 UTC (rev 196821)
+++ trunk/Source/WebCore/loader/cache/CachedRawResource.h        2016-02-19 18:05:55 UTC (rev 196822)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void redirectReceived(ResourceRequest&amp;, const ResourceResponse&amp;) override;
</span><span class="cx">     virtual void responseReceived(const ResourceResponse&amp;) override;
</span><ins>+    virtual bool shouldCacheResponse(const ResourceResponse&amp;) override;
</ins><span class="cx">     virtual void didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent) override;
</span><span class="cx"> 
</span><span class="cx">     virtual void switchClientsToRevalidatedResource() override;
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedRawResourceClienth"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h (196821 => 196822)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h        2016-02-19 17:35:52 UTC (rev 196821)
+++ trunk/Source/WebCore/loader/cache/CachedRawResourceClient.h        2016-02-19 18:05:55 UTC (rev 196822)
</span><span class="lines">@@ -39,6 +39,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void dataSent(CachedResource*, unsigned long long /* bytesSent */, unsigned long long /* totalBytesToBeSent */) { }
</span><span class="cx">     virtual void responseReceived(CachedResource*, const ResourceResponse&amp;) { }
</span><ins>+    virtual bool shouldCacheResponse(CachedResource*, const ResourceResponse&amp;) { return true; }
</ins><span class="cx">     virtual void dataReceived(CachedResource*, const char* /* data */, int /* length */) { }
</span><span class="cx">     virtual void redirectReceived(CachedResource*, ResourceRequest&amp;, const ResourceResponse&amp;) { }
</span><span class="cx"> #if USE(SOUP)
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheCachedResourceh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/CachedResource.h (196821 => 196822)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/CachedResource.h        2016-02-19 17:35:52 UTC (rev 196821)
+++ trunk/Source/WebCore/loader/cache/CachedResource.h        2016-02-19 18:05:55 UTC (rev 196822)
</span><span class="lines">@@ -194,6 +194,7 @@
</span><span class="cx"> 
</span><span class="cx">     virtual void redirectReceived(ResourceRequest&amp;, const ResourceResponse&amp;);
</span><span class="cx">     virtual void responseReceived(const ResourceResponse&amp;);
</span><ins>+    virtual bool shouldCacheResponse(const ResourceResponse&amp;) { return true; }
</ins><span class="cx">     void setResponse(const ResourceResponse&amp; response) { m_response = response; }
</span><span class="cx">     const ResourceResponse&amp; response() const { return m_response; }
</span><span class="cx">     // This is the same as response() except after HTTP redirect to data: URL.
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercocoaSubresourceLoaderCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cocoa/SubresourceLoaderCocoa.mm (196821 => 196822)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cocoa/SubresourceLoaderCocoa.mm        2016-02-19 17:35:52 UTC (rev 196821)
+++ trunk/Source/WebCore/loader/cocoa/SubresourceLoaderCocoa.mm        2016-02-19 18:05:55 UTC (rev 196822)
</span><span class="lines">@@ -40,6 +40,8 @@
</span><span class="cx"> CFCachedURLResponseRef SubresourceLoader::willCacheResponse(ResourceHandle* handle, CFCachedURLResponseRef cachedResponse)
</span><span class="cx"> {
</span><span class="cx">     DiskCacheMonitor::monitorFileBackingStoreCreation(request(), m_resource-&gt;sessionID(), cachedResponse);
</span><ins>+    if (!m_resource-&gt;shouldCacheResponse(CFCachedURLResponseGetWrappedResponse(cachedResponse))
+        return nullptr;
</ins><span class="cx">     return ResourceLoader::willCacheResponse(handle, cachedResponse);
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -48,6 +50,8 @@
</span><span class="cx"> NSCachedURLResponse* SubresourceLoader::willCacheResponse(ResourceHandle* handle, NSCachedURLResponse* response)
</span><span class="cx"> {
</span><span class="cx">     DiskCacheMonitor::monitorFileBackingStoreCreation(request(), m_resource-&gt;sessionID(), [response _CFCachedURLResponse]);
</span><ins>+    if (!m_resource-&gt;shouldCacheResponse(response.response))
+        return nullptr;
</ins><span class="cx">     return ResourceLoader::willCacheResponse(handle, response);
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>