<!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>[181734] 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/181734">181734</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-03-19 00:54:06 -0700 (Thu, 19 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>The network cache should ignore &quot;cache-control: no-cache, must-revalidate&quot; on history navigation
https://bugs.webkit.org/show_bug.cgi?id=142831
&lt;rdar://problem/20209957&gt;

Reviewed by Antti Koivisto.

Source/WebKit2:

The network cache should ignore &quot;no-cache&quot; and &quot;must-revalidate&quot; as
Cache-Control policy for history navigations to avoid unnecessary
revalidation in this case. Our memory cache already behaves this way.

On history navigation, our disk cache implementation currently
revalidates unconditionally resources if &quot;cache-control: no-cache&quot; is
used. It also revalidates expired resources if &quot;cache-control:
must-revalidate&quot; is used. This is sub-optimal.

RFC 7234 does not require us to do so [1]:
&quot;&quot;&quot;
  User agents often have history mechanisms, such as &quot;Back&quot; buttons and
  history lists, that can be used to redisplay a representation
  retrieved earlier in a session.

  The freshness model (Section 4.2) does not necessarily apply to
  history mechanisms.  That is, a history mechanism can display a
  previous representation even if it has expired.
&quot;&quot;&quot;

Chrome and IE9+ [2] already ignore &quot;cache-control: must-revalidate&quot; on history navigation.

[1] https://tools.ietf.org/html/rfc7234#page-32
[2] http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx

Test: http/tests/cache/disk-cache-validation-back-navigation-policy.html

* NetworkProcess/cache/NetworkCache.cpp:
(WebKit::NetworkCache::decodeStorageEntry):

LayoutTests:

Rebaseline disk-cache-validation-back-navigation-policy.html test now
that we ignore &quot;cache-control: no-cache, must-revalidate&quot; on history
navigation. This is a progression.

* http/tests/cache/disk-cache-validation-back-navigation-policy-expected.txt:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestshttptestscachediskcachevalidationbacknavigationpolicyexpectedtxt">trunk/LayoutTests/http/tests/cache/disk-cache-validation-back-navigation-policy-expected.txt</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (181733 => 181734)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-03-19 06:30:11 UTC (rev 181733)
+++ trunk/LayoutTests/ChangeLog        2015-03-19 07:54:06 UTC (rev 181734)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2015-03-19  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        The network cache should ignore &quot;cache-control: no-cache, must-revalidate&quot; on history navigation
+        https://bugs.webkit.org/show_bug.cgi?id=142831
+        &lt;rdar://problem/20209957&gt;
+
+        Reviewed by Antti Koivisto.
+
+        Rebaseline disk-cache-validation-back-navigation-policy.html test now
+        that we ignore &quot;cache-control: no-cache, must-revalidate&quot; on history
+        navigation. This is a progression.
+
+        * http/tests/cache/disk-cache-validation-back-navigation-policy-expected.txt:
+
</ins><span class="cx"> 2015-03-18  Brent Fulgham  &lt;bfulgham@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [Win] Windows gardening for debug bots.
</span></span></pre></div>
<a id="trunkLayoutTestshttptestscachediskcachevalidationbacknavigationpolicyexpectedtxt"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/http/tests/cache/disk-cache-validation-back-navigation-policy-expected.txt (181733 => 181734)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cache/disk-cache-validation-back-navigation-policy-expected.txt        2015-03-19 06:30:11 UTC (rev 181733)
+++ trunk/LayoutTests/http/tests/cache/disk-cache-validation-back-navigation-policy-expected.txt        2015-03-19 07:54:06 UTC (rev 181734)
</span><span class="lines">@@ -24,13 +24,13 @@
</span><span class="cx"> response source: Network
</span><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;no-cache&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=0, no-cache&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=100, no-cache&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;ETag&quot;:&quot;match&quot;}
</span><span class="cx"> response source: Disk cache
</span><span class="lines">@@ -51,13 +51,13 @@
</span><span class="cx"> response source: Network
</span><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;no-cache&quot;,&quot;ETag&quot;:&quot;match&quot;}
</span><del>-response source: Disk cache after validation
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=0, no-cache&quot;,&quot;ETag&quot;:&quot;match&quot;}
</span><del>-response source: Disk cache after validation
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=100, no-cache&quot;,&quot;ETag&quot;:&quot;match&quot;}
</span><del>-response source: Disk cache after validation
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;ETag&quot;:&quot;nomatch&quot;}
</span><span class="cx"> response source: Disk cache
</span><span class="lines">@@ -78,19 +78,19 @@
</span><span class="cx"> response source: Network
</span><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;no-cache&quot;,&quot;ETag&quot;:&quot;nomatch&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=0, no-cache&quot;,&quot;ETag&quot;:&quot;nomatch&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=100, no-cache&quot;,&quot;ETag&quot;:&quot;nomatch&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;must-revalidate&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=0, must-revalidate&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=100, must-revalidate&quot;}
</span><span class="cx"> response source: Disk cache
</span><span class="lines">@@ -105,19 +105,19 @@
</span><span class="cx"> response source: Network
</span><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;no-cache, must-revalidate&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=0, no-cache, must-revalidate&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=100, no-cache, must-revalidate&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;ETag&quot;:&quot;match&quot;,&quot;Cache-control&quot;:&quot;must-revalidate&quot;}
</span><del>-response source: Disk cache after validation
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=0, must-revalidate&quot;,&quot;ETag&quot;:&quot;match&quot;}
</span><del>-response source: Disk cache after validation
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=100, must-revalidate&quot;,&quot;ETag&quot;:&quot;match&quot;}
</span><span class="cx"> response source: Disk cache
</span><span class="lines">@@ -132,19 +132,19 @@
</span><span class="cx"> response source: Network
</span><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;no-cache, must-revalidate&quot;,&quot;ETag&quot;:&quot;match&quot;}
</span><del>-response source: Disk cache after validation
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=0, no-cache, must-revalidate&quot;,&quot;ETag&quot;:&quot;match&quot;}
</span><del>-response source: Disk cache after validation
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=100, no-cache, must-revalidate&quot;,&quot;ETag&quot;:&quot;match&quot;}
</span><del>-response source: Disk cache after validation
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;ETag&quot;:&quot;nomatch&quot;,&quot;Cache-control&quot;:&quot;must-revalidate&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=0, must-revalidate&quot;,&quot;ETag&quot;:&quot;nomatch&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=100, must-revalidate&quot;,&quot;ETag&quot;:&quot;nomatch&quot;}
</span><span class="cx"> response source: Disk cache
</span><span class="lines">@@ -159,13 +159,13 @@
</span><span class="cx"> response source: Network
</span><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;no-cache, must-revalidate&quot;,&quot;ETag&quot;:&quot;nomatch&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=0, no-cache, must-revalidate&quot;,&quot;ETag&quot;:&quot;nomatch&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> response headers: {&quot;Cache-control&quot;:&quot;max-age=100, no-cache, must-revalidate&quot;,&quot;ETag&quot;:&quot;nomatch&quot;}
</span><del>-response source: Network
</del><ins>+response source: Disk cache
</ins><span class="cx"> 
</span><span class="cx"> PASS successfullyParsed is true
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (181733 => 181734)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-03-19 06:30:11 UTC (rev 181733)
+++ trunk/Source/WebKit2/ChangeLog        2015-03-19 07:54:06 UTC (rev 181734)
</span><span class="lines">@@ -1,3 +1,41 @@
</span><ins>+2015-03-19  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        The network cache should ignore &quot;cache-control: no-cache, must-revalidate&quot; on history navigation
+        https://bugs.webkit.org/show_bug.cgi?id=142831
+        &lt;rdar://problem/20209957&gt;
+
+        Reviewed by Antti Koivisto.
+
+        The network cache should ignore &quot;no-cache&quot; and &quot;must-revalidate&quot; as
+        Cache-Control policy for history navigations to avoid unnecessary
+        revalidation in this case. Our memory cache already behaves this way.
+
+        On history navigation, our disk cache implementation currently
+        revalidates unconditionally resources if &quot;cache-control: no-cache&quot; is
+        used. It also revalidates expired resources if &quot;cache-control:
+        must-revalidate&quot; is used. This is sub-optimal.
+
+        RFC 7234 does not require us to do so [1]:
+        &quot;&quot;&quot;
+          User agents often have history mechanisms, such as &quot;Back&quot; buttons and
+          history lists, that can be used to redisplay a representation
+          retrieved earlier in a session.
+
+          The freshness model (Section 4.2) does not necessarily apply to
+          history mechanisms.  That is, a history mechanism can display a
+          previous representation even if it has expired.
+        &quot;&quot;&quot;
+
+        Chrome and IE9+ [2] already ignore &quot;cache-control: must-revalidate&quot; on history navigation.
+
+        [1] https://tools.ietf.org/html/rfc7234#page-32
+        [2] http://blogs.msdn.com/b/ie/archive/2010/07/14/caching-improvements-in-internet-explorer-9.aspx
+
+        Test: http/tests/cache/disk-cache-validation-back-navigation-policy.html
+
+        * NetworkProcess/cache/NetworkCache.cpp:
+        (WebKit::NetworkCache::decodeStorageEntry):
+
</ins><span class="cx"> 2015-03-18  Simon Fraser  &lt;simon.fraser@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Don't paint PDFs on every scroll
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp (181733 => 181734)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-03-19 06:30:11 UTC (rev 181733)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-03-19 07:54:06 UTC (rev 181734)
</span><span class="lines">@@ -206,12 +206,13 @@
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    bool allowExpired = cachePolicyAllowsExpired(request.cachePolicy()) &amp;&amp; !cachedResponse.cacheControlContainsMustRevalidate();
</del><ins>+    bool allowExpired = cachePolicyAllowsExpired(request.cachePolicy());
</ins><span class="cx">     auto timeStamp = std::chrono::duration_cast&lt;std::chrono::duration&lt;double&gt;&gt;(storageEntry.timeStamp);
</span><span class="cx">     double age = WebCore::computeCurrentAge(cachedResponse, timeStamp.count());
</span><span class="cx">     double lifetime = WebCore::computeFreshnessLifetimeForHTTPFamily(cachedResponse, timeStamp.count());
</span><span class="cx">     bool isExpired = age &gt; lifetime;
</span><del>-    bool needsRevalidation = (isExpired &amp;&amp; !allowExpired) || cachedResponse.cacheControlContainsNoCache();
</del><ins>+    // We never revalidate in the case of a history navigation (i.e. allowExpired is true).
+    bool needsRevalidation = !allowExpired &amp;&amp; (cachedResponse.cacheControlContainsNoCache() || isExpired);
</ins><span class="cx"> 
</span><span class="cx">     if (needsRevalidation) {
</span><span class="cx">         bool hasValidatorFields = cachedResponse.hasCacheValidatorFields();
</span></span></pre>
</div>
</div>

</body>
</html>