<!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>[184096] releases/WebKitGTK/webkit-2.8/Source</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/184096">184096</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-05-11 07:00:44 -0700 (Mon, 11 May 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/183255">r183255</a> - [SOUP] Use a webkit subdirectory for the disk cache
https://bugs.webkit.org/show_bug.cgi?id=144048

Reviewed by Martin Robinson.

Source/WebCore:

Add a static method to SoupNetworkSession to clear a soup cache
given its directory.

* platform/network/soup/SoupNetworkSession.cpp:
(WebCore::strIsNumeric):
(WebCore::SoupNetworkSession::clearCache):
* platform/network/soup/SoupNetworkSession.h:

Source/WebKit2:

Recent versions of libsoup remove any file in cache dir not
referenced by the index when the cache is loaded to workaround
leaked resources when load/dump is unbalanced for whatever reason,
like a crash. We currently use $XDG_CACHE_HOME/app-name as default
disk cache directory, but that directory could be used by apps to
cache other things, and the soup cache might end up deleting other
stuff. The soup cache assumes the given directory is only for the
disk cache, so we should ensure that.

* NetworkProcess/soup/NetworkProcessSoup.cpp:
(WebKit::NetworkProcess::platformInitializeNetworkProcess): Append
webkit to the given disk cache and clear the previous soup cache if it exists.
* WebProcess/soup/WebProcessSoup.cpp:
(WebKit::WebProcess::platformInitializeWebProcess): Ditto.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCoreplatformnetworksoupSoupNetworkSessioncpp">releases/WebKitGTK/webkit-2.8/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebCoreplatformnetworksoupSoupNetworkSessionh">releases/WebKitGTK/webkit-2.8/Source/WebCore/platform/network/soup/SoupNetworkSession.h</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebKit2ChangeLog">releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebKit2NetworkProcesssoupNetworkProcessSoupcpp">releases/WebKitGTK/webkit-2.8/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit28SourceWebKit2WebProcesssoupWebProcessSoupcpp">releases/WebKitGTK/webkit-2.8/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit28SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog (184095 => 184096)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog        2015-05-11 13:43:33 UTC (rev 184095)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/ChangeLog        2015-05-11 14:00:44 UTC (rev 184096)
</span><span class="lines">@@ -1,3 +1,18 @@
</span><ins>+2015-04-24  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [SOUP] Use a webkit subdirectory for the disk cache
+        https://bugs.webkit.org/show_bug.cgi?id=144048
+
+        Reviewed by Martin Robinson.
+
+        Add a static method to SoupNetworkSession to clear a soup cache
+        given its directory.
+
+        * platform/network/soup/SoupNetworkSession.cpp:
+        (WebCore::strIsNumeric):
+        (WebCore::SoupNetworkSession::clearCache):
+        * platform/network/soup/SoupNetworkSession.h:
+
</ins><span class="cx"> 2015-04-23  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WK2] WebDiagnosticLoggingClient is leaking
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCoreplatformnetworksoupSoupNetworkSessioncpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp (184095 => 184096)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp        2015-05-11 13:43:33 UTC (rev 184095)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/platform/network/soup/SoupNetworkSession.cpp        2015-05-11 14:00:44 UTC (rev 184096)
</span><span class="lines">@@ -31,9 +31,11 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;AuthenticationChallenge.h&quot;
</span><span class="cx"> #include &quot;CookieJarSoup.h&quot;
</span><ins>+#include &quot;FileSystem.h&quot;
</ins><span class="cx"> #include &quot;GUniquePtrSoup.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;ResourceHandle.h&quot;
</span><ins>+#include &lt;glib/gstdio.h&gt;
</ins><span class="cx"> #include &lt;libsoup/soup.h&gt;
</span><span class="cx"> #include &lt;wtf/text/CString.h&gt;
</span><span class="cx"> #include &lt;wtf/text/StringBuilder.h&gt;
</span><span class="lines">@@ -165,6 +167,37 @@
</span><span class="cx">     return soupCache ? SOUP_CACHE(soupCache) : nullptr;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static inline bool stringIsNumeric(const char* str)
+{
+    while (*str) {
+        if (!g_ascii_isdigit(*str))
+            return false;
+        str++;
+    }
+    return true;
+}
+
+void SoupNetworkSession::clearCache(const String&amp; cacheDirectory)
+{
+    CString cachePath = fileSystemRepresentation(cacheDirectory);
+    GUniquePtr&lt;char&gt; cacheFile(g_build_filename(cachePath.data(), &quot;soup.cache2&quot;, nullptr));
+    if (!g_file_test(cacheFile.get(), G_FILE_TEST_IS_REGULAR))
+        return;
+
+    GUniquePtr&lt;GDir&gt; dir(g_dir_open(cachePath.data(), 0, nullptr));
+    if (!dir)
+        return;
+
+    while (const char* name = g_dir_read_name(dir.get())) {
+        if (!g_str_has_prefix(name, &quot;soup.cache&quot;) &amp;&amp; !stringIsNumeric(name))
+            continue;
+
+        GUniquePtr&lt;gchar&gt; filename(g_build_filename(cachePath.data(), name, nullptr));
+        if (g_file_test(filename.get(), G_FILE_TEST_IS_REGULAR))
+            g_unlink(filename.get());
+    }
+}
+
</ins><span class="cx"> void SoupNetworkSession::setSSLPolicy(SSLPolicy flags)
</span><span class="cx"> {
</span><span class="cx">     g_object_set(m_soupSession.get(),
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebCoreplatformnetworksoupSoupNetworkSessionh"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebCore/platform/network/soup/SoupNetworkSession.h (184095 => 184096)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebCore/platform/network/soup/SoupNetworkSession.h        2015-05-11 13:43:33 UTC (rev 184095)
+++ releases/WebKitGTK/webkit-2.8/Source/WebCore/platform/network/soup/SoupNetworkSession.h        2015-05-11 14:00:44 UTC (rev 184096)
</span><span class="lines">@@ -60,6 +60,7 @@
</span><span class="cx"> 
</span><span class="cx">     void setCache(SoupCache*);
</span><span class="cx">     SoupCache* cache() const;
</span><ins>+    static void clearCache(const String&amp; cacheDirectory);
</ins><span class="cx"> 
</span><span class="cx">     void setSSLPolicy(SSLPolicy);
</span><span class="cx">     SSLPolicy sslPolicy() const;
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog (184095 => 184096)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog        2015-05-11 13:43:33 UTC (rev 184095)
+++ releases/WebKitGTK/webkit-2.8/Source/WebKit2/ChangeLog        2015-05-11 14:00:44 UTC (rev 184096)
</span><span class="lines">@@ -1,3 +1,25 @@
</span><ins>+2015-04-24  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [SOUP] Use a webkit subdirectory for the disk cache
+        https://bugs.webkit.org/show_bug.cgi?id=144048
+
+        Reviewed by Martin Robinson.
+
+        Recent versions of libsoup remove any file in cache dir not
+        referenced by the index when the cache is loaded to workaround
+        leaked resources when load/dump is unbalanced for whatever reason,
+        like a crash. We currently use $XDG_CACHE_HOME/app-name as default
+        disk cache directory, but that directory could be used by apps to
+        cache other things, and the soup cache might end up deleting other
+        stuff. The soup cache assumes the given directory is only for the
+        disk cache, so we should ensure that.
+
+        * NetworkProcess/soup/NetworkProcessSoup.cpp:
+        (WebKit::NetworkProcess::platformInitializeNetworkProcess): Append
+        webkit to the given disk cache and clear the previous soup cache if it exists.
+        * WebProcess/soup/WebProcessSoup.cpp:
+        (WebKit::WebProcess::platformInitializeWebProcess): Ditto.
+
</ins><span class="cx"> 2015-04-23  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WK2] WebDiagnosticLoggingClient is leaking
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebKit2NetworkProcesssoupNetworkProcessSoupcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp (184095 => 184096)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp        2015-05-11 13:43:33 UTC (rev 184095)
+++ releases/WebKitGTK/webkit-2.8/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp        2015-05-11 14:00:44 UTC (rev 184096)
</span><span class="lines">@@ -83,7 +83,13 @@
</span><span class="cx"> void NetworkProcess::platformInitializeNetworkProcess(const NetworkProcessCreationParameters&amp; parameters)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!parameters.diskCacheDirectory.isEmpty());
</span><del>-    GRefPtr&lt;SoupCache&gt; soupCache = adoptGRef(soup_cache_new(parameters.diskCacheDirectory.utf8().data(), SOUP_CACHE_SINGLE_USER));
</del><ins>+
+    // We used to use the given cache directory for the soup cache, but now we use a subdirectory to avoid
+    // conflicts with other cache files in the same directory. Remove the old cache files if they still exist.
+    SoupNetworkSession::defaultSession().clearCache(parameters.diskCacheDirectory);
+
+    String diskCachePath = WebCore::pathByAppendingComponent(parameters.diskCacheDirectory, &quot;webkit&quot;);
+    GRefPtr&lt;SoupCache&gt; soupCache = adoptGRef(soup_cache_new(diskCachePath.utf8().data(), SOUP_CACHE_SINGLE_USER));
</ins><span class="cx">     SoupNetworkSession::defaultSession().setCache(soupCache.get());
</span><span class="cx">     // Set an initial huge max_size for the SoupCache so the call to soup_cache_load() won't evict any cached
</span><span class="cx">     // resource. The final size of the cache will be set by NetworkProcess::platformSetCacheModel().
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit28SourceWebKit2WebProcesssoupWebProcessSoupcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.8/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp (184095 => 184096)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.8/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp        2015-05-11 13:43:33 UTC (rev 184095)
+++ releases/WebKitGTK/webkit-2.8/Source/WebKit2/WebProcess/soup/WebProcessSoup.cpp        2015-05-11 14:00:44 UTC (rev 184096)
</span><span class="lines">@@ -154,7 +154,13 @@
</span><span class="cx">         return;
</span><span class="cx"> 
</span><span class="cx">     ASSERT(!parameters.diskCacheDirectory.isEmpty());
</span><del>-    GRefPtr&lt;SoupCache&gt; soupCache = adoptGRef(soup_cache_new(parameters.diskCacheDirectory.utf8().data(), SOUP_CACHE_SINGLE_USER));
</del><ins>+
+    // We used to use the given cache directory for the soup cache, but now we use a subdirectory to avoid
+    // conflicts with other cache files in the same directory. Remove the old cache files if they still exist.
+    WebCore::SoupNetworkSession::defaultSession().clearCache(parameters.diskCacheDirectory);
+
+    String diskCachePath = WebCore::pathByAppendingComponent(parameters.diskCacheDirectory, &quot;webkit&quot;);
+    GRefPtr&lt;SoupCache&gt; soupCache = adoptGRef(soup_cache_new(diskCachePath.utf8().data(), SOUP_CACHE_SINGLE_USER));
</ins><span class="cx">     WebCore::SoupNetworkSession::defaultSession().setCache(soupCache.get());
</span><span class="cx">     // Set an initial huge max_size for the SoupCache so the call to soup_cache_load() won't evict any cached
</span><span class="cx">     // resource. The final size of the cache will be set by NetworkProcess::platformSetCacheModel().
</span></span></pre>
</div>
</div>

</body>
</html>