<!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>[185070] 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/185070">185070</a></dd>
<dt>Author</dt> <dd>cdumez@apple.com</dd>
<dt>Date</dt> <dd>2015-06-01 12:31:34 -0700 (Mon, 01 Jun 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>ASSERT(revalidatingResource.inCache()) in MemoryCache when reloading tumblr.com
https://bugs.webkit.org/show_bug.cgi?id=145518
&lt;rdar://problem/21168573&gt;

Reviewed by Darin Adler.

Source/WebCore:

There was an assertion in MemoryCache::revalidationSucceeded() making
sure that the resource that was revalidated is still in the memory
cache. However, nothing prevents this resource from being pruned while
it is being revalidated. We do make sure that the resource in question
cannot be destroyed though (see CachedResource::canDelete()).

This patch gets rid of this assertion as it is incorrect. Also, the
fact that the resource is no longer in the memory cache is not an
issue. We are merely going to call MemoryCache::remove() to remove
it from the memory cache before re-adding it and updating its
HTTP response. The call to MemoryCache::remove() will simply be a
no-op in this case and we will not have any problem adding the
resource back to the memory cache because the resource is kept alive.

Test: http/tests/cache/memory-cache-pruning-during-revalidation.html

* loader/cache/MemoryCache.cpp:
(WebCore::MemoryCache::revalidationSucceeded): Deleted.

LayoutTests:

Add layout test to make sure we no longer crash if the memory cache is
pruned while a resource is being revalidated.

* http/tests/cache/memory-cache-pruning-during-revalidation-expected.txt: Added.
* http/tests/cache/memory-cache-pruning-during-revalidation.html: Added.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreloadercacheMemoryCachecpp">trunk/Source/WebCore/loader/cache/MemoryCache.cpp</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkLayoutTestshttptestscachememorycachepruningduringrevalidationexpectedtxt">trunk/LayoutTests/http/tests/cache/memory-cache-pruning-during-revalidation-expected.txt</a></li>
<li><a href="#trunkLayoutTestshttptestscachememorycachepruningduringrevalidationhtml">trunk/LayoutTests/http/tests/cache/memory-cache-pruning-during-revalidation.html</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (185069 => 185070)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2015-06-01 19:05:44 UTC (rev 185069)
+++ trunk/LayoutTests/ChangeLog        2015-06-01 19:31:34 UTC (rev 185070)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2015-06-01  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        ASSERT(revalidatingResource.inCache()) in MemoryCache when reloading tumblr.com
+        https://bugs.webkit.org/show_bug.cgi?id=145518
+        &lt;rdar://problem/21168573&gt;
+
+        Reviewed by Darin Adler.
+
+        Add layout test to make sure we no longer crash if the memory cache is
+        pruned while a resource is being revalidated.
+
+        * http/tests/cache/memory-cache-pruning-during-revalidation-expected.txt: Added.
+        * http/tests/cache/memory-cache-pruning-during-revalidation.html: Added.
+
</ins><span class="cx"> 2015-05-31  Youenn Fablet  &lt;youenn.fablet@crf.canon.fr&gt;
</span><span class="cx"> 
</span><span class="cx">         Async XMLHttpRequest should get access to AppCache resources stored as flat files
</span></span></pre></div>
<a id="trunkLayoutTestshttptestscachememorycachepruningduringrevalidationexpectedtxt"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cache/memory-cache-pruning-during-revalidation-expected.txt (0 => 185070)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cache/memory-cache-pruning-during-revalidation-expected.txt                                (rev 0)
+++ trunk/LayoutTests/http/tests/cache/memory-cache-pruning-during-revalidation-expected.txt        2015-06-01 19:31:34 UTC (rev 185070)
</span><span class="lines">@@ -0,0 +1,9 @@
</span><ins>+Make sure we don't crash if the memory cache is getting pruned while a resource is being revalidated.
+
+On success, you will see a series of &quot;PASS&quot; messages, followed by &quot;TEST COMPLETE&quot;.
+
+
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
</ins></span></pre></div>
<a id="trunkLayoutTestshttptestscachememorycachepruningduringrevalidationhtml"></a>
<div class="addfile"><h4>Added: trunk/LayoutTests/http/tests/cache/memory-cache-pruning-during-revalidation.html (0 => 185070)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/http/tests/cache/memory-cache-pruning-during-revalidation.html                                (rev 0)
+++ trunk/LayoutTests/http/tests/cache/memory-cache-pruning-during-revalidation.html        2015-06-01 19:31:34 UTC (rev 185070)
</span><span class="lines">@@ -0,0 +1,31 @@
</span><ins>+&lt;!DOCTYPE html&gt;
+&lt;html&gt;
+&lt;body onload=&quot;runTest()&quot;&gt;
+&lt;script src=&quot;/resources/js-test-pre.js&quot;&gt;&lt;/script&gt;
+&lt;script&gt;
+description(&quot;Make sure we don't crash if the memory cache is getting pruned while a resource is being revalidated.&quot;);
+window.jsTestIsAsync = true;
+
+function removeImageAndReload() {
+  img.remove();
+
+  img = document.createElement(&quot;img&quot;);
+  img.src = &quot;/cache/resources/compass-no-cache.jpg&quot;
+  img.onload = finishJSTest;
+  document.body.appendChild(img);
+
+  internals.clearMemoryCache();
+}
+
+function runTest() {
+    setTimeout(function() {
+        img = document.createElement(&quot;img&quot;);
+        img.src = &quot;/cache/resources/compass-no-cache.jpg&quot;
+        img.onload = removeImageAndReload;
+        document.body.appendChild(img);
+    }, 0);
+}
+&lt;/script&gt;
+&lt;script src=&quot;../resources/js-test-post.js&quot;&gt;&lt;/script&gt;
+&lt;body&gt;
+&lt;/html&gt;
</ins></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (185069 => 185070)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-06-01 19:05:44 UTC (rev 185069)
+++ trunk/Source/WebCore/ChangeLog        2015-06-01 19:31:34 UTC (rev 185070)
</span><span class="lines">@@ -1,3 +1,30 @@
</span><ins>+2015-06-01  Chris Dumez  &lt;cdumez@apple.com&gt;
+
+        ASSERT(revalidatingResource.inCache()) in MemoryCache when reloading tumblr.com
+        https://bugs.webkit.org/show_bug.cgi?id=145518
+        &lt;rdar://problem/21168573&gt;
+
+        Reviewed by Darin Adler.
+
+        There was an assertion in MemoryCache::revalidationSucceeded() making
+        sure that the resource that was revalidated is still in the memory
+        cache. However, nothing prevents this resource from being pruned while
+        it is being revalidated. We do make sure that the resource in question
+        cannot be destroyed though (see CachedResource::canDelete()).
+
+        This patch gets rid of this assertion as it is incorrect. Also, the
+        fact that the resource is no longer in the memory cache is not an
+        issue. We are merely going to call MemoryCache::remove() to remove
+        it from the memory cache before re-adding it and updating its
+        HTTP response. The call to MemoryCache::remove() will simply be a
+        no-op in this case and we will not have any problem adding the
+        resource back to the memory cache because the resource is kept alive.
+
+        Test: http/tests/cache/memory-cache-pruning-during-revalidation.html
+
+        * loader/cache/MemoryCache.cpp:
+        (WebCore::MemoryCache::revalidationSucceeded): Deleted.
+
</ins><span class="cx"> 2015-06-01  Matt Rajca  &lt;mrajca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Add stub implementation of MediaRemoteControls, part of the Media Session spec.
</span></span></pre></div>
<a id="trunkSourceWebCoreloadercacheMemoryCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/loader/cache/MemoryCache.cpp (185069 => 185070)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/loader/cache/MemoryCache.cpp        2015-06-01 19:05:44 UTC (rev 185069)
+++ trunk/Source/WebCore/loader/cache/MemoryCache.cpp        2015-06-01 19:31:34 UTC (rev 185070)
</span><span class="lines">@@ -129,7 +129,6 @@
</span><span class="cx">     CachedResource&amp; resource = *revalidatingResource.resourceToRevalidate();
</span><span class="cx">     ASSERT(!resource.inCache());
</span><span class="cx">     ASSERT(resource.isLoaded());
</span><del>-    ASSERT(revalidatingResource.inCache());
</del><span class="cx"> 
</span><span class="cx">     // Calling remove() can potentially delete revalidatingResource, which we use
</span><span class="cx">     // below. This mustn't be the case since revalidation means it is loaded
</span></span></pre>
</div>
</div>

</body>
</html>