<!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>[183387] trunk/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/183387">183387</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2015-04-26 23:17:05 -0700 (Sun, 26 Apr 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>[SOUP] Add initial implementation of NetworkProcess disk cache
https://bugs.webkit.org/show_bug.cgi?id=143872

Reviewed by Martin Robinson.

Source/WebCore:

Allow to create a GRefPtr for SoupBuffer. Even though SoupBuffer
is not a GObject and has copy/free functions instead of ref/unref,
it's internally refcounted, so we could use copy/free as
ref/unref.

* PlatformGTK.cmake:
* platform/network/soup/GRefPtrSoup.cpp: Added.
(WTF::refGPtr):
(WTF::derefGPtr):
* platform/network/soup/GRefPtrSoup.h: Added.

Source/WebKit2:

Implement the platform specific parts of the disk cache
implementation for Soup. It's mainly NetworkCache::Data and
NetworkCache::IOChannel.

* CMakeLists.txt:
* NetworkProcess/cache/NetworkCache.cpp:
(WebKit::NetworkCache::dumpFileChanged):
(WebKit::NetworkCache::Cache::initialize):
* NetworkProcess/cache/NetworkCacheBlobStorage.cpp:
* NetworkProcess/cache/NetworkCacheData.h:
(WebKit::NetworkCache::Data::soupBuffer):
* NetworkProcess/cache/NetworkCacheDataSoup.cpp: Added.
(WebKit::NetworkCache::Data::Data):
(WebKit::NetworkCache::Data::empty):
(WebKit::NetworkCache::Data::data):
(WebKit::NetworkCache::Data::isNull):
(WebKit::NetworkCache::Data::apply):
(WebKit::NetworkCache::Data::subrange):
(WebKit::NetworkCache::concatenate):
(WebKit::NetworkCache::MapWrapper::~MapWrapper):
(WebKit::NetworkCache::deleteMapWrapper):
(WebKit::NetworkCache::mapFile):
(WebKit::NetworkCache::Data::adoptMap):
(WebKit::NetworkCache::computeSHA1):
(WebKit::NetworkCache::bytesEqual):
* NetworkProcess/cache/NetworkCacheIOChannel.h:
* NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp: Added.
(WebKit::NetworkCache::IOChannel::IOChannel):
(WebKit::NetworkCache::IOChannel::open):
(WebKit::NetworkCache::fillDataFromReadBuffer):
(WebKit::NetworkCache::inputStreamReadReadyCallback):
(WebKit::NetworkCache::IOChannel::read):
(WebKit::NetworkCache::IOChannel::readSync):
(WebKit::NetworkCache::outputStreamWriteReadyCallback):
(WebKit::NetworkCache::IOChannel::write):
* NetworkProcess/cache/NetworkCacheStorageSoup.cpp: Removed.
* NetworkProcess/gtk/NetworkProcessMainGtk.cpp:
* NetworkProcess/soup/NetworkProcessSoup.cpp:
(WebKit::NetworkProcess::platformInitializeNetworkProcess):
(WebKit::NetworkProcess::platformSetCacheModel):
(WebKit::NetworkProcess::clearDiskCache):
* PlatformGTK.cmake:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCorePlatformGTKcmake">trunk/Source/WebCore/PlatformGTK.cmake</a></li>
<li><a href="#trunkSourceWebKit2CMakeListstxt">trunk/Source/WebKit2/CMakeLists.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>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheBlobStoragecpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheDatah">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcessgtkNetworkProcessMainGtkcpp">trunk/Source/WebKit2/NetworkProcess/gtk/NetworkProcessMainGtk.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesssoupNetworkProcessSoupcpp">trunk/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp</a></li>
<li><a href="#trunkSourceWebKit2PlatformGTKcmake">trunk/Source/WebKit2/PlatformGTK.cmake</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreplatformnetworksoupGRefPtrSoupcpp">trunk/Source/WebCore/platform/network/soup/GRefPtrSoup.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformnetworksoupGRefPtrSouph">trunk/Source/WebCore/platform/network/soup/GRefPtrSoup.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheDataSoupcpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataSoup.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelSoupcpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageSoupcpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageSoup.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebCore/ChangeLog        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2015-04-17  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [SOUP] Add initial implementation of NetworkProcess disk cache
+        https://bugs.webkit.org/show_bug.cgi?id=143872
+
+        Reviewed by Martin Robinson.
+
+        Allow to create a GRefPtr for SoupBuffer. Even though SoupBuffer
+        is not a GObject and has copy/free functions instead of ref/unref,
+        it's internally refcounted, so we could use copy/free as
+        ref/unref.
+
+        * PlatformGTK.cmake:
+        * platform/network/soup/GRefPtrSoup.cpp: Added.
+        (WTF::refGPtr):
+        (WTF::derefGPtr):
+        * platform/network/soup/GRefPtrSoup.h: Added.
+
</ins><span class="cx"> 2015-04-26  Manuel Rego Casasnovas  &lt;rego@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [CSS Grid Layout] LayoutBox::hasDefiniteLogicalHeight() should consider abspos boxes as definite
</span></span></pre></div>
<a id="trunkSourceWebCorePlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/PlatformGTK.cmake (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/PlatformGTK.cmake        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebCore/PlatformGTK.cmake        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -159,6 +159,7 @@
</span><span class="cx">     platform/network/soup/CookieStorageSoup.cpp
</span><span class="cx">     platform/network/soup/CredentialStorageSoup.cpp
</span><span class="cx">     platform/network/soup/DNSSoup.cpp
</span><ins>+    platform/network/soup/GRefPtrSoup.cpp
</ins><span class="cx">     platform/network/soup/NetworkStorageSessionSoup.cpp
</span><span class="cx">     platform/network/soup/ProxyServerSoup.cpp
</span><span class="cx">     platform/network/soup/ResourceErrorSoup.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworksoupGRefPtrSoupcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/network/soup/GRefPtrSoup.cpp (0 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/soup/GRefPtrSoup.cpp                                (rev 0)
+++ trunk/Source/WebCore/platform/network/soup/GRefPtrSoup.cpp        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+/*
+ *  Copyright (C) 2015 Igalia S.L.
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this library; if not, write to the Free Software
+ *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include &quot;config.h&quot;
+#include &quot;GRefPtrSoup.h&quot;
+
+namespace WTF {
+
+template &lt;&gt; SoupBuffer* refGPtr(SoupBuffer* ptr)
+{
+    return ptr ? soup_buffer_copy(ptr) : nullptr;
+}
+
+template &lt;&gt; void derefGPtr(SoupBuffer* ptr)
+{
+    if (ptr)
+        soup_buffer_free(ptr);
+}
+
+} // namespace WTF
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformnetworksoupGRefPtrSouph"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/platform/network/soup/GRefPtrSoup.h (0 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/network/soup/GRefPtrSoup.h                                (rev 0)
+++ trunk/Source/WebCore/platform/network/soup/GRefPtrSoup.h        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -0,0 +1,37 @@
</span><ins>+/*
+ *  Copyright (C) 2015 Igalia S.L.
+ *
+ *  This library is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Library General Public
+ *  License as published by the Free Software Foundation; either
+ *  version 2 of the License, or (at your option) any later version.
+ *
+ *  This library is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Library General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Library General Public License
+ *  along with this library; see the file COPYING.LIB.  If not, write to
+ *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ *  Boston, MA 02110-1301, USA.
+ */
+
+#ifndef GRefPtrSoup_h
+#define GRefPtrSoup_h
+
+#if USE(SOUP)
+
+#include &lt;libsoup/soup.h&gt;
+#include &lt;wtf/gobject/GRefPtr.h&gt;
+
+namespace WTF {
+
+template &lt;&gt; SoupBuffer* refGPtr(SoupBuffer*);
+template &lt;&gt; void derefGPtr(SoupBuffer*);
+
+} // namespace WTF
+
+#endif // USE(SOUP)
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2CMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/CMakeLists.txt (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/CMakeLists.txt        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/CMakeLists.txt        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -164,10 +164,14 @@
</span><span class="cx">     NetworkProcess/FileAPI/NetworkBlobRegistry.cpp
</span><span class="cx"> 
</span><span class="cx">     NetworkProcess/cache/NetworkCache.cpp
</span><ins>+    NetworkProcess/cache/NetworkCacheBlobStorage.cpp
</ins><span class="cx">     NetworkProcess/cache/NetworkCacheCoders.cpp
</span><ins>+    NetworkProcess/cache/NetworkCacheDecoder.cpp
</ins><span class="cx">     NetworkProcess/cache/NetworkCacheEncoder.cpp
</span><del>-    NetworkProcess/cache/NetworkCacheDecoder.cpp
</del><ins>+    NetworkProcess/cache/NetworkCacheEntry.cpp
</ins><span class="cx">     NetworkProcess/cache/NetworkCacheKey.cpp
</span><ins>+    NetworkProcess/cache/NetworkCacheStatistics.cpp
+    NetworkProcess/cache/NetworkCacheStorage.cpp
</ins><span class="cx"> )
</span><span class="cx"> 
</span><span class="cx"> set(WebKit2_SOURCES
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/ChangeLog        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -1,3 +1,53 @@
</span><ins>+2015-04-17  Carlos Garcia Campos  &lt;cgarcia@igalia.com&gt;
+
+        [SOUP] Add initial implementation of NetworkProcess disk cache
+        https://bugs.webkit.org/show_bug.cgi?id=143872
+
+        Reviewed by Martin Robinson.
+
+        Implement the platform specific parts of the disk cache
+        implementation for Soup. It's mainly NetworkCache::Data and
+        NetworkCache::IOChannel.
+
+        * CMakeLists.txt:
+        * NetworkProcess/cache/NetworkCache.cpp:
+        (WebKit::NetworkCache::dumpFileChanged):
+        (WebKit::NetworkCache::Cache::initialize):
+        * NetworkProcess/cache/NetworkCacheBlobStorage.cpp:
+        * NetworkProcess/cache/NetworkCacheData.h:
+        (WebKit::NetworkCache::Data::soupBuffer):
+        * NetworkProcess/cache/NetworkCacheDataSoup.cpp: Added.
+        (WebKit::NetworkCache::Data::Data):
+        (WebKit::NetworkCache::Data::empty):
+        (WebKit::NetworkCache::Data::data):
+        (WebKit::NetworkCache::Data::isNull):
+        (WebKit::NetworkCache::Data::apply):
+        (WebKit::NetworkCache::Data::subrange):
+        (WebKit::NetworkCache::concatenate):
+        (WebKit::NetworkCache::MapWrapper::~MapWrapper):
+        (WebKit::NetworkCache::deleteMapWrapper):
+        (WebKit::NetworkCache::mapFile):
+        (WebKit::NetworkCache::Data::adoptMap):
+        (WebKit::NetworkCache::computeSHA1):
+        (WebKit::NetworkCache::bytesEqual):
+        * NetworkProcess/cache/NetworkCacheIOChannel.h:
+        * NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp: Added.
+        (WebKit::NetworkCache::IOChannel::IOChannel):
+        (WebKit::NetworkCache::IOChannel::open):
+        (WebKit::NetworkCache::fillDataFromReadBuffer):
+        (WebKit::NetworkCache::inputStreamReadReadyCallback):
+        (WebKit::NetworkCache::IOChannel::read):
+        (WebKit::NetworkCache::IOChannel::readSync):
+        (WebKit::NetworkCache::outputStreamWriteReadyCallback):
+        (WebKit::NetworkCache::IOChannel::write):
+        * NetworkProcess/cache/NetworkCacheStorageSoup.cpp: Removed.
+        * NetworkProcess/gtk/NetworkProcessMainGtk.cpp:
+        * NetworkProcess/soup/NetworkProcessSoup.cpp:
+        (WebKit::NetworkProcess::platformInitializeNetworkProcess):
+        (WebKit::NetworkProcess::platformSetCacheModel):
+        (WebKit::NetworkProcess::clearDiskCache):
+        * PlatformGTK.cmake:
+
</ins><span class="cx"> 2015-04-26  Yusuke Suzuki  &lt;utatane.tea@gmail.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [ES6] Implement ES6 template literals
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -55,6 +55,13 @@
</span><span class="cx">     return instance;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+#if PLATFORM(GTK)
+static void dumpFileChanged(Cache* cache)
+{
+    cache-&gt;dumpContentsToFile();
+}
+#endif
+
</ins><span class="cx"> bool Cache::initialize(const String&amp; cachePath, bool enableEfficacyLogging)
</span><span class="cx"> {
</span><span class="cx">     m_storage = Storage::open(cachePath);
</span><span class="lines">@@ -71,6 +78,15 @@
</span><span class="cx">         });
</span><span class="cx">     }
</span><span class="cx"> #endif
</span><ins>+#if PLATFORM(GTK)
+    // Triggers with &quot;touch $cachePath/dump&quot;.
+    if (m_storage) {
+        CString dumpFilePath = WebCore::fileSystemRepresentation(WebCore::pathByAppendingComponent(m_storage-&gt;basePath(), &quot;dump&quot;));
+        GRefPtr&lt;GFile&gt; dumpFile = adoptGRef(g_file_new_for_path(dumpFilePath.data()));
+        GFileMonitor* monitor = g_file_monitor_file(dumpFile.get(), G_FILE_MONITOR_NONE, nullptr, nullptr);
+        g_signal_connect_swapped(monitor, &quot;changed&quot;, G_CALLBACK(dumpFileChanged), this);
+    }
+#endif
</ins><span class="cx"> 
</span><span class="cx">     LOG(NetworkCache, &quot;(NetworkProcess) opened cache storage, success %d&quot;, !!m_storage);
</span><span class="cx">     return !!m_storage;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheBlobStoragecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheBlobStorage.cpp        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;NetworkCacheFileSystemPosix.h&quot;
</span><span class="cx"> #include &lt;WebCore/FileSystem.h&gt;
</span><ins>+#include &lt;fcntl.h&gt;
</ins><span class="cx"> #include &lt;sys/mman.h&gt;
</span><span class="cx"> #include &lt;wtf/RunLoop.h&gt;
</span><span class="cx"> #include &lt;wtf/SHA1.h&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -34,6 +34,10 @@
</span><span class="cx"> #include &lt;wtf/ThreadSafeRefCounted.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><ins>+#if USE(SOUP)
+#include &lt;WebCore/GRefPtrSoup.h&gt;
+#endif
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> namespace NetworkCache {
</span><span class="cx"> 
</span><span class="lines">@@ -106,6 +110,9 @@
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     Data(DispatchPtr&lt;dispatch_data_t&gt;, Backing = Backing::Buffer);
</span><span class="cx"> #endif
</span><ins>+#if USE(SOUP)
+    Data(GRefPtr&lt;SoupBuffer&gt;&amp;&amp;, Backing = Backing::Buffer);
+#endif
</ins><span class="cx">     bool isNull() const;
</span><span class="cx">     bool isEmpty() const { return !m_size; }
</span><span class="cx"> 
</span><span class="lines">@@ -120,10 +127,17 @@
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     dispatch_data_t dispatchData() const { return m_dispatchData.get(); }
</span><span class="cx"> #endif
</span><ins>+
+#if USE(SOUP)
+    SoupBuffer* soupBuffer() const { return m_buffer.get(); }
+#endif
</ins><span class="cx"> private:
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     mutable DispatchPtr&lt;dispatch_data_t&gt; m_dispatchData;
</span><span class="cx"> #endif
</span><ins>+#if USE(SOUP)
+    mutable GRefPtr&lt;SoupBuffer&gt; m_buffer;
+#endif
</ins><span class="cx">     mutable const uint8_t* m_data { nullptr };
</span><span class="cx">     size_t m_size { 0 };
</span><span class="cx">     bool m_isMap { false };
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheDataSoupcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataSoup.cpp (0 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataSoup.cpp                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataSoup.cpp        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -0,0 +1,179 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;NetworkCacheData.h&quot;
+
+#if ENABLE(NETWORK_CACHE)
+
+#include &lt;fcntl.h&gt;
+#include &lt;sys/mman.h&gt;
+#include &lt;sys/stat.h&gt;
+#include &lt;sys/types.h&gt;
+#include &lt;unistd.h&gt;
+
+namespace WebKit {
+namespace NetworkCache {
+
+Data::Data(const uint8_t* data, size_t size)
+    : m_size(size)
+{
+    uint8_t* copiedData = static_cast&lt;uint8_t*&gt;(fastMalloc(size));
+    memcpy(copiedData, data, size);
+    m_buffer = adoptGRef(soup_buffer_new_with_owner(copiedData, size, copiedData, fastFree));
+}
+
+Data::Data(GRefPtr&lt;SoupBuffer&gt;&amp;&amp; buffer, Backing backing)
+    : m_buffer(buffer)
+    , m_size(buffer ? buffer-&gt;length : 0)
+    , m_isMap(m_size &amp;&amp; backing == Backing::Map)
+{
+}
+
+Data Data::empty()
+{
+    GRefPtr&lt;SoupBuffer&gt; buffer = adoptGRef(soup_buffer_new(SOUP_MEMORY_TAKE, nullptr, 0));
+    return { WTF::move(buffer) };
+}
+
+const uint8_t* Data::data() const
+{
+    return m_buffer ? reinterpret_cast&lt;const uint8_t*&gt;(m_buffer-&gt;data) : nullptr;
+}
+
+bool Data::isNull() const
+{
+    return !m_buffer;
+}
+
+bool Data::apply(const std::function&lt;bool (const uint8_t*, size_t)&gt;&amp;&amp; applier) const
+{
+    if (!m_size)
+        return false;
+
+    return applier(reinterpret_cast&lt;const uint8_t*&gt;(m_buffer-&gt;data), m_buffer-&gt;length);
+}
+
+Data Data::subrange(size_t offset, size_t size) const
+{
+    if (!m_buffer)
+        return { };
+
+    GRefPtr&lt;SoupBuffer&gt; subBuffer = adoptGRef(soup_buffer_new_subbuffer(m_buffer.get(), offset, size));
+    return { WTF::move(subBuffer) };
+}
+
+Data concatenate(const Data&amp; a, const Data&amp; b)
+{
+    if (a.isNull())
+        return b;
+    if (b.isNull())
+        return a;
+
+    size_t size = a.size() + b.size();
+    uint8_t* data = static_cast&lt;uint8_t*&gt;(fastMalloc(size));
+    memcpy(data, a.soupBuffer()-&gt;data, a.soupBuffer()-&gt;length);
+    memcpy(data + a.soupBuffer()-&gt;length, b.soupBuffer()-&gt;data, b.soupBuffer()-&gt;length);
+    GRefPtr&lt;SoupBuffer&gt; buffer = adoptGRef(soup_buffer_new_with_owner(data, size, data, fastFree));
+    return { WTF::move(buffer) };
+}
+
+struct MapWrapper {
+    ~MapWrapper()
+    {
+        munmap(map, size);
+    }
+
+    void* map;
+    size_t size;
+};
+
+static void deleteMapWrapper(MapWrapper* wrapper)
+{
+    delete wrapper;
+}
+
+Data mapFile(int fd, size_t offset, size_t size)
+{
+    if (!size)
+        return Data::empty();
+
+    void* map = mmap(nullptr, size, PROT_READ, MAP_PRIVATE, fd, offset);
+    if (map == MAP_FAILED)
+        return { };
+    return Data::adoptMap(map, size);
+}
+
+Data Data::adoptMap(void* map, size_t size)
+{
+    ASSERT(map);
+    ASSERT(map != MAP_FAILED);
+    MapWrapper* wrapper = new MapWrapper { map, size };
+    GRefPtr&lt;SoupBuffer&gt; buffer = adoptGRef(soup_buffer_new_with_owner(map, size, wrapper, reinterpret_cast&lt;GDestroyNotify&gt;(deleteMapWrapper)));
+    return { WTF::move(buffer), Data::Backing::Map };
+}
+
+Data mapFile(const char* path)
+{
+    int fd = open(path, O_RDONLY, 0);
+    if (fd &lt; 0)
+        return { };
+    struct stat stat;
+    if (fstat(fd, &amp;stat) &lt; 0) {
+        close(fd);
+        return { };
+    }
+    size_t size = stat.st_size;
+    auto data = mapFile(fd, 0, size);
+    close(fd);
+
+    return data;
+}
+
+SHA1::Digest computeSHA1(const Data&amp; data)
+{
+    SHA1 sha1;
+    data.apply([&amp;sha1](const uint8_t* data, size_t size) {
+        sha1.addBytes(data, size);
+        return true;
+    });
+    SHA1::Digest digest;
+    sha1.computeHash(digest);
+    return digest;
+}
+
+bool bytesEqual(const Data&amp; a, const Data&amp; b)
+{
+    if (a.isNull() || b.isNull())
+        return false;
+    if (a.size() != b.size())
+        return false;
+    return !memcmp(a.data(), b.data(), a.size());
+}
+
+} // namespace NetworkCache
+} // namespace WebKit
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -34,6 +34,10 @@
</span><span class="cx"> #include &lt;wtf/WorkQueue.h&gt;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><ins>+#if USE(SOUP)
+#include &lt;wtf/gobject/GRefPtr.h&gt;
+#endif
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> namespace NetworkCache {
</span><span class="cx"> 
</span><span class="lines">@@ -63,6 +67,11 @@
</span><span class="cx"> #if PLATFORM(COCOA)
</span><span class="cx">     DispatchPtr&lt;dispatch_io_t&gt; m_dispatchIO;
</span><span class="cx"> #endif
</span><ins>+#if USE(SOUP)
+    GRefPtr&lt;GInputStream&gt; m_inputStream;
+    GRefPtr&lt;GOutputStream&gt; m_outputStream;
+    GRefPtr&lt;GFileIOStream&gt; m_ioStream;
+#endif
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelSoupcpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp (0 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -0,0 +1,211 @@
</span><ins>+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;NetworkCacheIOChannel.h&quot;
+
+#if ENABLE(NETWORK_CACHE)
+
+#include &quot;NetworkCacheFileSystemPosix.h&quot;
+
+namespace WebKit {
+namespace NetworkCache {
+
+static const size_t gDefaultReadBufferSize = 4096;
+
+IOChannel::IOChannel(const String&amp; filePath, Type type)
+    : m_path(filePath)
+    , m_type(type)
+{
+    auto path = WebCore::fileSystemRepresentation(filePath);
+    GRefPtr&lt;GFile&gt; file = adoptGRef(g_file_new_for_path(path.data()));
+    switch (m_type) {
+    case Type::Create:
+        g_file_delete(file.get(), nullptr, nullptr);
+        m_outputStream = adoptGRef(G_OUTPUT_STREAM(g_file_create(file.get(), static_cast&lt;GFileCreateFlags&gt;(G_FILE_CREATE_PRIVATE), nullptr, nullptr)));
+        ASSERT(m_outputStream);
+        break;
+    case Type::Write: {
+        m_ioStream = adoptGRef(g_file_open_readwrite(file.get(), nullptr, nullptr));
+        ASSERT(m_ioStream);
+        break;
+    }
+    case Type::Read:
+        m_inputStream = adoptGRef(G_INPUT_STREAM(g_file_read(file.get(), nullptr, nullptr)));
+        ASSERT(m_inputStream);
+        break;
+    }
+}
+
+Ref&lt;IOChannel&gt; IOChannel::open(const String&amp; filePath, IOChannel::Type type)
+{
+    return adoptRef(*new IOChannel(filePath, type));
+}
+
+static void fillDataFromReadBuffer(SoupBuffer* readBuffer, size_t size, Data&amp; data)
+{
+    GRefPtr&lt;SoupBuffer&gt; buffer;
+    if (size != readBuffer-&gt;length) {
+        // The subbuffer does not copy the data.
+        buffer = adoptGRef(soup_buffer_new_subbuffer(readBuffer, 0, size));
+    } else
+        buffer = readBuffer;
+
+    if (data.isNull()) {
+        // First chunk, we need to force the data to be copied.
+        data = { reinterpret_cast&lt;const uint8_t*&gt;(buffer-&gt;data), size };
+    } else {
+        Data dataRead(WTF::move(buffer));
+        // Concatenate will copy the data.
+        data = concatenate(data, dataRead);
+    }
+}
+
+struct ReadAsyncData {
+    RefPtr&lt;IOChannel&gt; channel;
+    GRefPtr&lt;SoupBuffer&gt; buffer;
+    size_t bytesToRead;
+    std::function&lt;void (Data&amp;, int error)&gt; completionHandler;
+    Data data;
+};
+
+static void inputStreamReadReadyCallback(GInputStream* stream, GAsyncResult* result, gpointer userData)
+{
+    std::unique_ptr&lt;ReadAsyncData&gt; asyncData(static_cast&lt;ReadAsyncData*&gt;(userData));
+    gssize bytesRead = g_input_stream_read_finish(stream, result, nullptr);
+    if (bytesRead == -1) {
+        asyncData-&gt;completionHandler(asyncData-&gt;data, -1);
+        return;
+    }
+
+    if (!bytesRead) {
+        asyncData-&gt;completionHandler(asyncData-&gt;data, 0);
+        return;
+    }
+
+    ASSERT(bytesRead &gt; 0);
+    fillDataFromReadBuffer(asyncData-&gt;buffer.get(), static_cast&lt;size_t&gt;(bytesRead), asyncData-&gt;data);
+
+    size_t pendingBytesToRead = asyncData-&gt;bytesToRead - asyncData-&gt;data.size();
+    if (!pendingBytesToRead) {
+        asyncData-&gt;completionHandler(asyncData-&gt;data, 0);
+        return;
+    }
+
+    size_t bytesToRead = std::min(pendingBytesToRead, asyncData-&gt;buffer-&gt;length);
+    // Use a local variable for the data buffer to pass it to g_input_stream_read_async(), because ReadAsyncData is released.
+    auto data = const_cast&lt;char*&gt;(asyncData-&gt;buffer-&gt;data);
+    g_input_stream_read_async(stream, data, bytesToRead, G_PRIORITY_DEFAULT, nullptr,
+        reinterpret_cast&lt;GAsyncReadyCallback&gt;(inputStreamReadReadyCallback), asyncData.release());
+}
+
+void IOChannel::read(size_t offset, size_t size, WorkQueue*, std::function&lt;void (Data&amp;, int error)&gt; completionHandler)
+{
+    ASSERT(m_inputStream);
+
+    size_t bufferSize = std::min(size, gDefaultReadBufferSize);
+    uint8_t* bufferData = static_cast&lt;uint8_t*&gt;(fastMalloc(bufferSize));
+    GRefPtr&lt;SoupBuffer&gt; buffer = adoptGRef(soup_buffer_new_with_owner(bufferData, bufferSize, bufferData, fastFree));
+    ReadAsyncData* asyncData = new ReadAsyncData { this, buffer.get(), size, completionHandler, { } };
+
+    // FIXME: implement offset.
+    g_input_stream_read_async(m_inputStream.get(), const_cast&lt;char*&gt;(buffer-&gt;data), bufferSize, G_PRIORITY_DEFAULT, nullptr,
+        reinterpret_cast&lt;GAsyncReadyCallback&gt;(inputStreamReadReadyCallback), asyncData);
+}
+
+// FIXME: It would be better to do without this.
+void IOChannel::readSync(size_t offset, size_t size, WorkQueue*, std::function&lt;void (Data&amp;, int error)&gt; completionHandler)
+{
+    ASSERT(m_inputStream);
+    size_t bufferSize = std::min(size, gDefaultReadBufferSize);
+    uint8_t* bufferData = static_cast&lt;uint8_t*&gt;(fastMalloc(bufferSize));
+    GRefPtr&lt;SoupBuffer&gt; readBuffer = adoptGRef(soup_buffer_new_with_owner(bufferData, bufferSize, bufferData, fastFree));
+    Data data;
+    size_t pendingBytesToRead = size;
+    size_t bytesToRead = bufferSize;
+    do {
+        // FIXME: implement offset.
+        gssize bytesRead = g_input_stream_read(m_inputStream.get(), const_cast&lt;char*&gt;(readBuffer-&gt;data), bytesToRead, nullptr, nullptr);
+        if (bytesRead == -1) {
+            completionHandler(data, -1);
+            return;
+        }
+
+        if (!bytesRead)
+            break;
+
+        ASSERT(bytesRead &gt; 0);
+        fillDataFromReadBuffer(readBuffer.get(), static_cast&lt;size_t&gt;(bytesRead), data);
+
+        pendingBytesToRead = size - data.size();
+        bytesToRead = std::min(pendingBytesToRead, readBuffer-&gt;length);
+    } while (pendingBytesToRead);
+
+    completionHandler(data, 0);
+}
+
+struct WriteAsyncData {
+    RefPtr&lt;IOChannel&gt; channel;
+    GRefPtr&lt;SoupBuffer&gt; buffer;
+    std::function&lt;void (int error)&gt; completionHandler;
+};
+
+static void outputStreamWriteReadyCallback(GOutputStream* stream, GAsyncResult* result, gpointer userData)
+{
+    std::unique_ptr&lt;WriteAsyncData&gt; asyncData(static_cast&lt;WriteAsyncData*&gt;(userData));
+    gssize bytesWritten = g_output_stream_write_finish(stream, result, nullptr);
+    if (bytesWritten == -1) {
+        asyncData-&gt;completionHandler(-1);
+        return;
+    }
+
+    gssize pendingBytesToWrite = asyncData-&gt;buffer-&gt;length - bytesWritten;
+    if (!pendingBytesToWrite) {
+        asyncData-&gt;completionHandler(0);
+        return;
+    }
+
+    asyncData-&gt;buffer = adoptGRef(soup_buffer_new_subbuffer(asyncData-&gt;buffer.get(), bytesWritten, pendingBytesToWrite));
+    // Use a local variable for the data buffer to pass it to g_output_stream_write_async(), because WriteAsyncData is released.
+    auto data = asyncData-&gt;buffer-&gt;data;
+    g_output_stream_write_async(stream, data, pendingBytesToWrite, G_PRIORITY_DEFAULT, nullptr,
+        reinterpret_cast&lt;GAsyncReadyCallback&gt;(outputStreamWriteReadyCallback), asyncData.release());
+}
+
+void IOChannel::write(size_t offset, const Data&amp; data, WorkQueue*, std::function&lt;void (int error)&gt; completionHandler)
+{
+    ASSERT(m_outputStream || m_ioStream);
+
+    GOutputStream* stream = m_outputStream ? m_outputStream.get() : g_io_stream_get_output_stream(G_IO_STREAM(m_ioStream.get()));
+    WriteAsyncData* asyncData = new WriteAsyncData { this, data.soupBuffer(), completionHandler };
+    // FIXME: implement offset.
+    g_output_stream_write_async(stream, asyncData-&gt;buffer-&gt;data, data.size(), G_PRIORITY_DEFAULT, nullptr,
+        reinterpret_cast&lt;GAsyncReadyCallback&gt;(outputStreamWriteReadyCallback), asyncData);
+}
+
+} // namespace NetworkCache
+} // namespace WebKit
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageSoupcpp"></a>
<div class="delfile"><h4>Deleted: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageSoup.cpp (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageSoup.cpp        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageSoup.cpp        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -1,139 +0,0 @@
</span><del>-/*
- * Copyright (C) 2014 Igalia S.L.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include &quot;config.h&quot;
-#include &quot;NetworkCacheStorage.h&quot;
-
-#if ENABLE(NETWORK_CACHE)
-
-#include &quot;Logging.h&quot;
-#include &quot;NetworkCacheCoders.h&quot;
-#include &lt;WebCore/FileSystem.h&gt;
-#include &lt;WebCore/NotImplemented.h&gt;
-#include &lt;wtf/RunLoop.h&gt;
-
-namespace WebKit {
-
-static const char* networkCacheSubdirectory = &quot;WebKitCache&quot;;
-
-NetworkCacheStorage::Data::Data()
-    : m_data(nullptr)
-    , m_size(0)
-{
-    notImplemented();
-}
-
-NetworkCacheStorage::Data::Data(const uint8_t* data, size_t size)
-    : m_data(data)
-    , m_size(size)
-{
-    notImplemented();
-}
-
-const uint8_t* NetworkCacheStorage::Data::data() const
-{
-    notImplemented();
-    return nullptr;
-}
-
-bool NetworkCacheStorage::Data::isNull() const
-{
-    notImplemented();
-    return true;
-}
-
-std::unique_ptr&lt;NetworkCacheStorage&gt; NetworkCacheStorage::open(const String&amp; applicationCachePath)
-{
-    ASSERT(RunLoop::isMain());
-    String networkCachePath = WebCore::pathByAppendingComponent(applicationCachePath, networkCacheSubdirectory);
-    if (!WebCore::makeAllDirectories(networkCachePath))
-        return nullptr;
-    return std::unique_ptr&lt;NetworkCacheStorage&gt;(new NetworkCacheStorage(networkCachePath));
-}
-
-NetworkCacheStorage::NetworkCacheStorage(const String&amp; directoryPath)
-    : m_directoryPath(directoryPath)
-    , m_maximumSize(std::numeric_limits&lt;size_t&gt;::max())
-    , m_activeRetrieveOperationCount(0)
-{
-    initializeKeyFilter();
-}
-
-void NetworkCacheStorage::initializeKeyFilter()
-{
-    ASSERT(RunLoop::isMain());
-    notImplemented();
-}
-
-void NetworkCacheStorage::removeEntry(const NetworkCacheKey&amp;)
-{
-    ASSERT(RunLoop::isMain());
-    notImplemented();
-}
-
-void NetworkCacheStorage::dispatchRetrieveOperation(const RetrieveOperation&amp;)
-{
-    ASSERT(RunLoop::isMain());
-    notImplemented();
-}
-
-void NetworkCacheStorage::dispatchPendingRetrieveOperations()
-{
-    ASSERT(RunLoop::isMain());
-    notImplemented();
-}
-
-void NetworkCacheStorage::retrieve(const NetworkCacheKey&amp;, unsigned /* priority */, std::function&lt;bool (std::unique_ptr&lt;Entry&gt;)&gt; completionHandler)
-{
-    ASSERT(RunLoop::isMain());
-    notImplemented();
-    completionHandler(nullptr);
-}
-
-void NetworkCacheStorage::store(const NetworkCacheKey&amp;, const Entry&amp;, std::function&lt;void (bool success)&gt; completionHandler)
-{
-    ASSERT(RunLoop::isMain());
-    notImplemented();
-    completionHandler(false);
-}
-
-void NetworkCacheStorage::setMaximumSize(size_t size)
-{
-    ASSERT(RunLoop::isMain());
-    notImplemented();
-    m_maximumSize = size;
-}
-
-void NetworkCacheStorage::clear()
-{
-    ASSERT(RunLoop::isMain());
-    LOG(NetworkCacheStorage, &quot;(NetworkProcess) clearing cache&quot;);
-    notImplemented();
-    m_keyFilter.clear();
-}
-
-} // namespace WebKit
-
-#endif // ENABLE(NETWORK_CACHE)
</del></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcessgtkNetworkProcessMainGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/gtk/NetworkProcessMainGtk.cpp (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/gtk/NetworkProcessMainGtk.cpp        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/NetworkProcess/gtk/NetworkProcessMainGtk.cpp        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -48,10 +48,12 @@
</span><span class="cx"> 
</span><span class="cx">     void platformFinalize() override
</span><span class="cx">     {
</span><ins>+#if !ENABLE(NETWORK_CACHE)
</ins><span class="cx">         if (SoupCache* soupCache = SoupNetworkSession::defaultSession().cache()) {
</span><span class="cx">             soup_cache_flush(soupCache);
</span><span class="cx">             soup_cache_dump(soupCache);
</span><span class="cx">         }
</span><ins>+#endif
</ins><span class="cx">     }
</span><span class="cx"> };
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesssoupNetworkProcessSoupcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/NetworkProcess/soup/NetworkProcessSoup.cpp        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> #if ENABLE(NETWORK_PROCESS)
</span><span class="cx"> #include &quot;NetworkProcess.h&quot;
</span><span class="cx"> 
</span><ins>+#include &quot;NetworkCache.h&quot;
</ins><span class="cx"> #include &quot;NetworkProcessCreationParameters.h&quot;
</span><span class="cx"> #include &quot;ResourceCachesToClear.h&quot;
</span><span class="cx"> #include &quot;WebCookieManager.h&quot;
</span><span class="lines">@@ -44,6 +45,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><ins>+#if !ENABLE(NETWORK_CACHE)
</ins><span class="cx"> static uint64_t getCacheDiskFreeSize(SoupCache* cache)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(cache);
</span><span class="lines">@@ -55,6 +57,7 @@
</span><span class="cx"> 
</span><span class="cx">     return WebCore::getVolumeFreeSizeForPath(cacheDir.get());
</span><span class="cx"> }
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> static uint64_t getMemorySize()
</span><span class="cx"> {
</span><span class="lines">@@ -83,7 +86,14 @@
</span><span class="cx"> void NetworkProcess::platformInitializeNetworkProcess(const NetworkProcessCreationParameters&amp; parameters)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!parameters.diskCacheDirectory.isEmpty());
</span><ins>+    m_diskCacheDirectory = parameters.diskCacheDirectory;
</ins><span class="cx"> 
</span><ins>+#if ENABLE(NETWORK_CACHE)
+    // Clear the old soup cache if it exists.
+    SoupNetworkSession::defaultSession().clearCache(m_diskCacheDirectory);
+
+    NetworkCache::singleton().initialize(m_diskCacheDirectory, parameters.shouldEnableNetworkCacheEfficacyLogging);
+#else
</ins><span class="cx">     // We used to use the given cache directory for the soup cache, but now we use a subdirectory to avoid
</span><span class="cx">     // conflicts with other cache files in the same directory. Remove the old cache files if they still exist.
</span><span class="cx">     SoupNetworkSession::defaultSession().clearCache(parameters.diskCacheDirectory);
</span><span class="lines">@@ -97,6 +107,7 @@
</span><span class="cx">     soup_cache_set_max_size(soupCache.get(), G_MAXUINT);
</span><span class="cx">     soup_cache_load(soupCache.get());
</span><span class="cx">     soup_cache_set_max_size(soupCache.get(), initialMaxSize);
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">     if (!parameters.cookiePersistentStoragePath.isEmpty()) {
</span><span class="cx">         supplement&lt;WebCookieManager&gt;()-&gt;setCookiePersistentStorage(parameters.cookiePersistentStoragePath,
</span><span class="lines">@@ -121,16 +132,26 @@
</span><span class="cx">     unsigned long urlCacheMemoryCapacity = 0;
</span><span class="cx">     unsigned long urlCacheDiskCapacity = 0;
</span><span class="cx"> 
</span><ins>+#if ENABLE(NETWORK_CACHE)
+    uint64_t diskFreeSize = WebCore::getVolumeFreeSizeForPath(m_diskCacheDirectory.utf8().data()) / 1024 / 1024;
+#else
</ins><span class="cx">     SoupCache* cache = SoupNetworkSession::defaultSession().cache();
</span><span class="cx">     uint64_t diskFreeSize = getCacheDiskFreeSize(cache) / 1024 / 1024;
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx">     uint64_t memSize = getMemorySize();
</span><span class="cx">     calculateCacheSizes(cacheModel, memSize, diskFreeSize,
</span><span class="cx">         cacheTotalCapacity, cacheMinDeadCapacity, cacheMaxDeadCapacity, deadDecodedDataDeletionInterval,
</span><span class="cx">         pageCacheCapacity, urlCacheMemoryCapacity, urlCacheDiskCapacity);
</span><span class="cx"> 
</span><ins>+#if ENABLE(NETWORK_CACHE)
+    auto&amp; networkCache = NetworkCache::singleton();
+    if (networkCache.isEnabled())
+        networkCache.setCapacity(urlCacheDiskCapacity);
+#else
</ins><span class="cx">     if (urlCacheDiskCapacity &gt; soup_cache_get_max_size(cache))
</span><span class="cx">         soup_cache_set_max_size(cache, urlCacheDiskCapacity);
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkProcess::setIgnoreTLSErrors(bool ignoreTLSErrors)
</span><span class="lines">@@ -154,7 +175,11 @@
</span><span class="cx"> void NetworkProcess::clearDiskCache(std::chrono::system_clock::time_point /* modifiedSince */, std::function&lt;void ()&gt; /* completionHandler */)
</span><span class="cx"> {
</span><span class="cx">     // FIXME: Find a way to only clear a part of the cache based on the date.
</span><ins>+#if ENABLE(NETWORK_CACHE)
+    NetworkCache::singleton().clear();
+#else
</ins><span class="cx">     soup_cache_clear(SoupNetworkSession::defaultSession().cache());
</span><ins>+#endif
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkProcess::platformTerminate()
</span></span></pre></div>
<a id="trunkSourceWebKit2PlatformGTKcmake"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/PlatformGTK.cmake (183386 => 183387)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/PlatformGTK.cmake        2015-04-27 05:58:36 UTC (rev 183386)
+++ trunk/Source/WebKit2/PlatformGTK.cmake        2015-04-27 06:17:05 UTC (rev 183387)
</span><span class="lines">@@ -18,7 +18,8 @@
</span><span class="cx"> list(APPEND WebKit2_SOURCES
</span><span class="cx">     DatabaseProcess/gtk/DatabaseProcessMainGtk.cpp
</span><span class="cx"> 
</span><del>-    NetworkProcess/cache/NetworkCacheStorageSoup.cpp
</del><ins>+    NetworkProcess/cache/NetworkCacheDataSoup.cpp
+    NetworkProcess/cache/NetworkCacheIOChannelSoup.cpp
</ins><span class="cx"> 
</span><span class="cx">     NetworkProcess/gtk/NetworkProcessMainGtk.cpp
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>