<!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 <cgarcia@igalia.com>
+
+ [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 <rego@igalia.com>
</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 "config.h"
+#include "GRefPtrSoup.h"
+
+namespace WTF {
+
+template <> SoupBuffer* refGPtr(SoupBuffer* ptr)
+{
+ return ptr ? soup_buffer_copy(ptr) : nullptr;
+}
+
+template <> 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 <libsoup/soup.h>
+#include <wtf/gobject/GRefPtr.h>
+
+namespace WTF {
+
+template <> SoupBuffer* refGPtr(SoupBuffer*);
+template <> 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 <cgarcia@igalia.com>
+
+ [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 <utatane.tea@gmail.com>
</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->dumpContentsToFile();
+}
+#endif
+
</ins><span class="cx"> bool Cache::initialize(const String& 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 "touch $cachePath/dump".
+ if (m_storage) {
+ CString dumpFilePath = WebCore::fileSystemRepresentation(WebCore::pathByAppendingComponent(m_storage->basePath(), "dump"));
+ GRefPtr<GFile> 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, "changed", G_CALLBACK(dumpFileChanged), this);
+ }
+#endif
</ins><span class="cx">
</span><span class="cx"> LOG(NetworkCache, "(NetworkProcess) opened cache storage, success %d", !!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 "Logging.h"
</span><span class="cx"> #include "NetworkCacheFileSystemPosix.h"
</span><span class="cx"> #include <WebCore/FileSystem.h>
</span><ins>+#include <fcntl.h>
</ins><span class="cx"> #include <sys/mman.h>
</span><span class="cx"> #include <wtf/RunLoop.h>
</span><span class="cx"> #include <wtf/SHA1.h>
</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 <wtf/ThreadSafeRefCounted.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><ins>+#if USE(SOUP)
+#include <WebCore/GRefPtrSoup.h>
+#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<dispatch_data_t>, Backing = Backing::Buffer);
</span><span class="cx"> #endif
</span><ins>+#if USE(SOUP)
+ Data(GRefPtr<SoupBuffer>&&, 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<dispatch_data_t> m_dispatchData;
</span><span class="cx"> #endif
</span><ins>+#if USE(SOUP)
+ mutable GRefPtr<SoupBuffer> 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 "config.h"
+#include "NetworkCacheData.h"
+
+#if ENABLE(NETWORK_CACHE)
+
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+namespace WebKit {
+namespace NetworkCache {
+
+Data::Data(const uint8_t* data, size_t size)
+ : m_size(size)
+{
+ uint8_t* copiedData = static_cast<uint8_t*>(fastMalloc(size));
+ memcpy(copiedData, data, size);
+ m_buffer = adoptGRef(soup_buffer_new_with_owner(copiedData, size, copiedData, fastFree));
+}
+
+Data::Data(GRefPtr<SoupBuffer>&& buffer, Backing backing)
+ : m_buffer(buffer)
+ , m_size(buffer ? buffer->length : 0)
+ , m_isMap(m_size && backing == Backing::Map)
+{
+}
+
+Data Data::empty()
+{
+ GRefPtr<SoupBuffer> 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<const uint8_t*>(m_buffer->data) : nullptr;
+}
+
+bool Data::isNull() const
+{
+ return !m_buffer;
+}
+
+bool Data::apply(const std::function<bool (const uint8_t*, size_t)>&& applier) const
+{
+ if (!m_size)
+ return false;
+
+ return applier(reinterpret_cast<const uint8_t*>(m_buffer->data), m_buffer->length);
+}
+
+Data Data::subrange(size_t offset, size_t size) const
+{
+ if (!m_buffer)
+ return { };
+
+ GRefPtr<SoupBuffer> subBuffer = adoptGRef(soup_buffer_new_subbuffer(m_buffer.get(), offset, size));
+ return { WTF::move(subBuffer) };
+}
+
+Data concatenate(const Data& a, const Data& b)
+{
+ if (a.isNull())
+ return b;
+ if (b.isNull())
+ return a;
+
+ size_t size = a.size() + b.size();
+ uint8_t* data = static_cast<uint8_t*>(fastMalloc(size));
+ memcpy(data, a.soupBuffer()->data, a.soupBuffer()->length);
+ memcpy(data + a.soupBuffer()->length, b.soupBuffer()->data, b.soupBuffer()->length);
+ GRefPtr<SoupBuffer> 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<SoupBuffer> buffer = adoptGRef(soup_buffer_new_with_owner(map, size, wrapper, reinterpret_cast<GDestroyNotify>(deleteMapWrapper)));
+ return { WTF::move(buffer), Data::Backing::Map };
+}
+
+Data mapFile(const char* path)
+{
+ int fd = open(path, O_RDONLY, 0);
+ if (fd < 0)
+ return { };
+ struct stat stat;
+ if (fstat(fd, &stat) < 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& data)
+{
+ SHA1 sha1;
+ data.apply([&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& a, const Data& 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 <wtf/WorkQueue.h>
</span><span class="cx"> #include <wtf/text/WTFString.h>
</span><span class="cx">
</span><ins>+#if USE(SOUP)
+#include <wtf/gobject/GRefPtr.h>
+#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<dispatch_io_t> m_dispatchIO;
</span><span class="cx"> #endif
</span><ins>+#if USE(SOUP)
+ GRefPtr<GInputStream> m_inputStream;
+ GRefPtr<GOutputStream> m_outputStream;
+ GRefPtr<GFileIOStream> 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 "config.h"
+#include "NetworkCacheIOChannel.h"
+
+#if ENABLE(NETWORK_CACHE)
+
+#include "NetworkCacheFileSystemPosix.h"
+
+namespace WebKit {
+namespace NetworkCache {
+
+static const size_t gDefaultReadBufferSize = 4096;
+
+IOChannel::IOChannel(const String& filePath, Type type)
+ : m_path(filePath)
+ , m_type(type)
+{
+ auto path = WebCore::fileSystemRepresentation(filePath);
+ GRefPtr<GFile> 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<GFileCreateFlags>(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<IOChannel> IOChannel::open(const String& filePath, IOChannel::Type type)
+{
+ return adoptRef(*new IOChannel(filePath, type));
+}
+
+static void fillDataFromReadBuffer(SoupBuffer* readBuffer, size_t size, Data& data)
+{
+ GRefPtr<SoupBuffer> buffer;
+ if (size != readBuffer->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<const uint8_t*>(buffer->data), size };
+ } else {
+ Data dataRead(WTF::move(buffer));
+ // Concatenate will copy the data.
+ data = concatenate(data, dataRead);
+ }
+}
+
+struct ReadAsyncData {
+ RefPtr<IOChannel> channel;
+ GRefPtr<SoupBuffer> buffer;
+ size_t bytesToRead;
+ std::function<void (Data&, int error)> completionHandler;
+ Data data;
+};
+
+static void inputStreamReadReadyCallback(GInputStream* stream, GAsyncResult* result, gpointer userData)
+{
+ std::unique_ptr<ReadAsyncData> asyncData(static_cast<ReadAsyncData*>(userData));
+ gssize bytesRead = g_input_stream_read_finish(stream, result, nullptr);
+ if (bytesRead == -1) {
+ asyncData->completionHandler(asyncData->data, -1);
+ return;
+ }
+
+ if (!bytesRead) {
+ asyncData->completionHandler(asyncData->data, 0);
+ return;
+ }
+
+ ASSERT(bytesRead > 0);
+ fillDataFromReadBuffer(asyncData->buffer.get(), static_cast<size_t>(bytesRead), asyncData->data);
+
+ size_t pendingBytesToRead = asyncData->bytesToRead - asyncData->data.size();
+ if (!pendingBytesToRead) {
+ asyncData->completionHandler(asyncData->data, 0);
+ return;
+ }
+
+ size_t bytesToRead = std::min(pendingBytesToRead, asyncData->buffer->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<char*>(asyncData->buffer->data);
+ g_input_stream_read_async(stream, data, bytesToRead, G_PRIORITY_DEFAULT, nullptr,
+ reinterpret_cast<GAsyncReadyCallback>(inputStreamReadReadyCallback), asyncData.release());
+}
+
+void IOChannel::read(size_t offset, size_t size, WorkQueue*, std::function<void (Data&, int error)> completionHandler)
+{
+ ASSERT(m_inputStream);
+
+ size_t bufferSize = std::min(size, gDefaultReadBufferSize);
+ uint8_t* bufferData = static_cast<uint8_t*>(fastMalloc(bufferSize));
+ GRefPtr<SoupBuffer> 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<char*>(buffer->data), bufferSize, G_PRIORITY_DEFAULT, nullptr,
+ reinterpret_cast<GAsyncReadyCallback>(inputStreamReadReadyCallback), asyncData);
+}
+
+// FIXME: It would be better to do without this.
+void IOChannel::readSync(size_t offset, size_t size, WorkQueue*, std::function<void (Data&, int error)> completionHandler)
+{
+ ASSERT(m_inputStream);
+ size_t bufferSize = std::min(size, gDefaultReadBufferSize);
+ uint8_t* bufferData = static_cast<uint8_t*>(fastMalloc(bufferSize));
+ GRefPtr<SoupBuffer> 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<char*>(readBuffer->data), bytesToRead, nullptr, nullptr);
+ if (bytesRead == -1) {
+ completionHandler(data, -1);
+ return;
+ }
+
+ if (!bytesRead)
+ break;
+
+ ASSERT(bytesRead > 0);
+ fillDataFromReadBuffer(readBuffer.get(), static_cast<size_t>(bytesRead), data);
+
+ pendingBytesToRead = size - data.size();
+ bytesToRead = std::min(pendingBytesToRead, readBuffer->length);
+ } while (pendingBytesToRead);
+
+ completionHandler(data, 0);
+}
+
+struct WriteAsyncData {
+ RefPtr<IOChannel> channel;
+ GRefPtr<SoupBuffer> buffer;
+ std::function<void (int error)> completionHandler;
+};
+
+static void outputStreamWriteReadyCallback(GOutputStream* stream, GAsyncResult* result, gpointer userData)
+{
+ std::unique_ptr<WriteAsyncData> asyncData(static_cast<WriteAsyncData*>(userData));
+ gssize bytesWritten = g_output_stream_write_finish(stream, result, nullptr);
+ if (bytesWritten == -1) {
+ asyncData->completionHandler(-1);
+ return;
+ }
+
+ gssize pendingBytesToWrite = asyncData->buffer->length - bytesWritten;
+ if (!pendingBytesToWrite) {
+ asyncData->completionHandler(0);
+ return;
+ }
+
+ asyncData->buffer = adoptGRef(soup_buffer_new_subbuffer(asyncData->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->buffer->data;
+ g_output_stream_write_async(stream, data, pendingBytesToWrite, G_PRIORITY_DEFAULT, nullptr,
+ reinterpret_cast<GAsyncReadyCallback>(outputStreamWriteReadyCallback), asyncData.release());
+}
+
+void IOChannel::write(size_t offset, const Data& data, WorkQueue*, std::function<void (int error)> 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->buffer->data, data.size(), G_PRIORITY_DEFAULT, nullptr,
+ reinterpret_cast<GAsyncReadyCallback>(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 "config.h"
-#include "NetworkCacheStorage.h"
-
-#if ENABLE(NETWORK_CACHE)
-
-#include "Logging.h"
-#include "NetworkCacheCoders.h"
-#include <WebCore/FileSystem.h>
-#include <WebCore/NotImplemented.h>
-#include <wtf/RunLoop.h>
-
-namespace WebKit {
-
-static const char* networkCacheSubdirectory = "WebKitCache";
-
-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<NetworkCacheStorage> NetworkCacheStorage::open(const String& applicationCachePath)
-{
- ASSERT(RunLoop::isMain());
- String networkCachePath = WebCore::pathByAppendingComponent(applicationCachePath, networkCacheSubdirectory);
- if (!WebCore::makeAllDirectories(networkCachePath))
- return nullptr;
- return std::unique_ptr<NetworkCacheStorage>(new NetworkCacheStorage(networkCachePath));
-}
-
-NetworkCacheStorage::NetworkCacheStorage(const String& directoryPath)
- : m_directoryPath(directoryPath)
- , m_maximumSize(std::numeric_limits<size_t>::max())
- , m_activeRetrieveOperationCount(0)
-{
- initializeKeyFilter();
-}
-
-void NetworkCacheStorage::initializeKeyFilter()
-{
- ASSERT(RunLoop::isMain());
- notImplemented();
-}
-
-void NetworkCacheStorage::removeEntry(const NetworkCacheKey&)
-{
- ASSERT(RunLoop::isMain());
- notImplemented();
-}
-
-void NetworkCacheStorage::dispatchRetrieveOperation(const RetrieveOperation&)
-{
- ASSERT(RunLoop::isMain());
- notImplemented();
-}
-
-void NetworkCacheStorage::dispatchPendingRetrieveOperations()
-{
- ASSERT(RunLoop::isMain());
- notImplemented();
-}
-
-void NetworkCacheStorage::retrieve(const NetworkCacheKey&, unsigned /* priority */, std::function<bool (std::unique_ptr<Entry>)> completionHandler)
-{
- ASSERT(RunLoop::isMain());
- notImplemented();
- completionHandler(nullptr);
-}
-
-void NetworkCacheStorage::store(const NetworkCacheKey&, const Entry&, std::function<void (bool success)> 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, "(NetworkProcess) clearing cache");
- 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 "NetworkProcess.h"
</span><span class="cx">
</span><ins>+#include "NetworkCache.h"
</ins><span class="cx"> #include "NetworkProcessCreationParameters.h"
</span><span class="cx"> #include "ResourceCachesToClear.h"
</span><span class="cx"> #include "WebCookieManager.h"
</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& 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<WebCookieManager>()->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& networkCache = NetworkCache::singleton();
+ if (networkCache.isEnabled())
+ networkCache.setCapacity(urlCacheDiskCapacity);
+#else
</ins><span class="cx"> if (urlCacheDiskCapacity > 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<void ()> /* 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>