<!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>[181020] trunk/Source/WebKit2</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/181020">181020</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2015-03-04 13:35:11 -0800 (Wed, 04 Mar 2015)</dd>
</dl>

<h3>Log Message</h3>
<pre>Factor platform I/O out from NetworkCacheStorage
https://bugs.webkit.org/show_bug.cgi?id=142279

Reviewed by Chris Dumez.

* NetworkProcess/cache/NetworkCacheData.h: Added.
* NetworkProcess/cache/NetworkCacheDataCocoa.mm: Added.

    NetworkCacheStorage::Data -&gt; NetworkCacheData
    Move to files of its own.

* NetworkProcess/cache/NetworkCacheIOChannel.h: Added.
* NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm: Added.

    Add abstraction for dispatch IO channels.</pre>

<h3>Modified Paths</h3>
<ul>
<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="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageCocoamm">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheDatah">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheDataCocoamm">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelCocoamm">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/ChangeLog        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -1,3 +1,21 @@
</span><ins>+2015-03-04  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        Factor platform I/O out from NetworkCacheStorage
+        https://bugs.webkit.org/show_bug.cgi?id=142279
+
+        Reviewed by Chris Dumez.
+
+        * NetworkProcess/cache/NetworkCacheData.h: Added.
+        * NetworkProcess/cache/NetworkCacheDataCocoa.mm: Added.
+
+            NetworkCacheStorage::Data -&gt; NetworkCacheData
+            Move to files of its own.
+
+        * NetworkProcess/cache/NetworkCacheIOChannel.h: Added.
+        * NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm: Added.
+
+            Add abstraction for dispatch IO channels.
+
</ins><span class="cx"> 2015-03-04  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Remove WK_AVAILABLE and related macros when we cannot determine iOS/Mac version
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCachecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCache.cpp        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -93,7 +93,7 @@
</span><span class="cx"> #endif
</span><span class="cx">     if (partition.isEmpty())
</span><span class="cx">         partition = ASCIILiteral(&quot;No partition&quot;);
</span><del>-    return NetworkCacheKey(request.httpMethod(), partition, request.url().string());
</del><ins>+    return { request.httpMethod(), partition, request.url().string()  };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static NetworkCacheStorage::Entry encodeStorageEntry(const WebCore::ResourceRequest&amp; request, const WebCore::ResourceResponse&amp; response, PassRefPtr&lt;WebCore::SharedBuffer&gt; responseData)
</span><span class="lines">@@ -120,12 +120,12 @@
</span><span class="cx">     encoder.encodeChecksum();
</span><span class="cx"> 
</span><span class="cx">     auto timeStamp = std::chrono::duration_cast&lt;std::chrono::milliseconds&gt;(std::chrono::system_clock::now().time_since_epoch());
</span><del>-    NetworkCacheStorage::Data header(encoder.buffer(), encoder.bufferSize());
-    NetworkCacheStorage::Data body;
</del><ins>+    NetworkCacheData header(encoder.buffer(), encoder.bufferSize());
+    NetworkCacheData body;
</ins><span class="cx">     if (responseData)
</span><del>-        body = NetworkCacheStorage::Data(reinterpret_cast&lt;const uint8_t*&gt;(responseData-&gt;data()), responseData-&gt;size());
</del><ins>+        body = { reinterpret_cast&lt;const uint8_t*&gt;(responseData-&gt;data()), responseData-&gt;size() };
</ins><span class="cx"> 
</span><del>-    return NetworkCacheStorage::Entry { makeCacheKey(request), timeStamp, header, body };
</del><ins>+    return { makeCacheKey(request), timeStamp, header, body };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> static bool verifyVaryingRequestHeaders(const Vector&lt;std::pair&lt;String, String&gt;&gt;&amp; varyingRequestHeaders, const WebCore::ResourceRequest&amp; request)
</span><span class="lines">@@ -343,7 +343,7 @@
</span><span class="cx"> 
</span><span class="cx">     auto storageEntry = encodeStorageEntry(originalRequest, response, WTF::move(responseData));
</span><span class="cx"> 
</span><del>-    m_storage-&gt;store(storageEntry, [completionHandler](bool success, const NetworkCacheStorage::Data&amp; bodyData) {
</del><ins>+    m_storage-&gt;store(storageEntry, [completionHandler](bool success, const NetworkCacheData&amp; bodyData) {
</ins><span class="cx">         MappedBody mappedBody;
</span><span class="cx"> #if ENABLE(SHAREABLE_RESOURCE)
</span><span class="cx">         if (bodyData.isMap()) {
</span><span class="lines">@@ -367,7 +367,7 @@
</span><span class="cx"> 
</span><span class="cx">     auto updateEntry = encodeStorageEntry(originalRequest, response, entry.buffer);
</span><span class="cx"> 
</span><del>-    m_storage-&gt;update(updateEntry, entry.storageEntry, [](bool success, const NetworkCacheStorage::Data&amp;) {
</del><ins>+    m_storage-&gt;update(updateEntry, entry.storageEntry, [](bool success, const NetworkCacheData&amp;) {
</ins><span class="cx">         LOG(NetworkCache, &quot;(NetworkProcess) updated, success=%d&quot;, success);
</span><span class="cx">     });
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheDatah"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h (0 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheData.h        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -0,0 +1,125 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef NetworkCacheData_h
+#define NetworkCacheData_h
+
+#if ENABLE(NETWORK_CACHE)
+
+#include &lt;functional&gt;
+#include &lt;wtf/FunctionDispatcher.h&gt;
+#include &lt;wtf/ThreadSafeRefCounted.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace WebKit {
+
+#if PLATFORM(COCOA)
+template &lt;typename T&gt; class DispatchPtr;
+template &lt;typename T&gt; DispatchPtr&lt;T&gt; adoptDispatch(T dispatchObject);
+
+// FIXME: Use OSObjectPtr instead when it works with dispatch_data_t on all platforms.
+template&lt;typename T&gt; class DispatchPtr {
+public:
+    DispatchPtr()
+        : m_ptr(nullptr)
+    {
+    }
+    DispatchPtr(T ptr)
+        : m_ptr(ptr)
+    {
+        if (m_ptr)
+            dispatch_retain(m_ptr);
+    }
+    DispatchPtr(const DispatchPtr&amp; other)
+        : m_ptr(other.m_ptr)
+    {
+        if (m_ptr)
+            dispatch_retain(m_ptr);
+    }
+    ~DispatchPtr()
+    {
+        if (m_ptr)
+            dispatch_release(m_ptr);
+    }
+
+    DispatchPtr&amp; operator=(const DispatchPtr&amp; other)
+    {
+        auto copy = other;
+        std::swap(m_ptr, copy.m_ptr);
+        return *this;
+    }
+
+    T get() const { return m_ptr; }
+    explicit operator bool() const { return m_ptr; }
+
+    friend DispatchPtr adoptDispatch&lt;T&gt;(T);
+
+private:
+    struct Adopt { };
+    DispatchPtr(Adopt, T data)
+        : m_ptr(data)
+    {
+    }
+
+    T m_ptr;
+};
+
+template &lt;typename T&gt; DispatchPtr&lt;T&gt; adoptDispatch(T dispatchObject)
+{
+    return DispatchPtr&lt;T&gt;(typename DispatchPtr&lt;T&gt;::Adopt { }, dispatchObject);
+}
+#endif
+
+class NetworkCacheData {
+public:
+    NetworkCacheData() { }
+    NetworkCacheData(const uint8_t*, size_t);
+
+    enum class Backing { Buffer, Map };
+#if PLATFORM(COCOA)
+    NetworkCacheData(DispatchPtr&lt;dispatch_data_t&gt;, Backing = Backing::Buffer);
+#endif
+    bool isNull() const;
+
+    const uint8_t* data() const;
+    size_t size() const { return m_size; }
+    bool isMap() const { return m_isMap; }
+
+#if PLATFORM(COCOA)
+    dispatch_data_t dispatchData() const { return m_dispatchData.get(); }
+#endif
+private:
+#if PLATFORM(COCOA)
+    mutable DispatchPtr&lt;dispatch_data_t&gt; m_dispatchData;
+#endif
+    mutable const uint8_t* m_data { nullptr };
+    size_t m_size { 0 };
+    bool m_isMap { false };
+};
+
+}
+
+#endif
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheDataCocoamm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm (0 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDataCocoa.mm        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -0,0 +1,70 @@
</span><ins>+/*
+ * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
+ *
+ * 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;dispatch/dispatch.h&gt;
+
+namespace WebKit {
+
+NetworkCacheData::NetworkCacheData(const uint8_t* data, size_t size)
+    : m_dispatchData(adoptDispatch(dispatch_data_create(data, size, nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)))
+    , m_size(size)
+{
+}
+
+NetworkCacheData::NetworkCacheData(DispatchPtr&lt;dispatch_data_t&gt; dispatchData, Backing backing)
+{
+    if (!dispatchData)
+        return;
+    const void* data;
+    m_dispatchData = adoptDispatch(dispatch_data_create_map(dispatchData.get(), &amp;data, &amp;m_size));
+    m_data = static_cast&lt;const uint8_t*&gt;(data);
+    m_isMap = m_size &amp;&amp; backing == Backing::Map;
+}
+
+const uint8_t* NetworkCacheData::data() const
+{
+    if (!m_data) {
+        const void* data;
+        size_t size;
+        m_dispatchData = adoptDispatch(dispatch_data_create_map(m_dispatchData.get(), &amp;data, &amp;size));
+        ASSERT(size == m_size);
+        m_data = static_cast&lt;const uint8_t*&gt;(data);
+    }
+    return m_data;
+}
+
+bool NetworkCacheData::isNull() const
+{
+    return !m_dispatchData;
+}
+
+}
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h (0 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannel.h        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -0,0 +1,60 @@
</span><ins>+/*
+ * Copyright (C) 2015 Apple Inc. All rights reserved.
+ *
+ * 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.
+ */
+
+#ifndef NetworkCacheIOChannel_h
+#define NetworkCacheIOChannel_h
+
+#if ENABLE(NETWORK_CACHE)
+
+#include &quot;NetworkCacheData.h&quot;
+#include &lt;functional&gt;
+#include &lt;wtf/ThreadSafeRefCounted.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace WebKit {
+
+class NetworkCacheIOChannel : public ThreadSafeRefCounted&lt;NetworkCacheIOChannel&gt; {
+public:
+    enum class Type { Read, Write, Create };
+    static Ref&lt;NetworkCacheIOChannel&gt; open(const String&amp; file, Type);
+
+    void read(size_t offset, size_t, std::function&lt;void (NetworkCacheData&amp;, int error)&gt;);
+    void write(size_t offset, const NetworkCacheData&amp;, std::function&lt;void (int error)&gt;);
+
+    int fileDescriptor() const { return m_fileDescriptor; }
+
+private:
+    NetworkCacheIOChannel(int fd);
+
+#if PLATFORM(COCOA)
+    DispatchPtr&lt;dispatch_io_t&gt; m_dispatchIO;
+#endif
+    int m_fileDescriptor { 0 };
+};
+
+}
+
+#endif
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheIOChannelCocoamm"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm (0 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheIOChannelCocoa.mm        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -0,0 +1,107 @@
</span><ins>+/*
+ * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
+ *
+ * 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;
+#include &lt;dispatch/dispatch.h&gt;
+#include &lt;mach/vm_param.h&gt;
+#include &lt;sys/mman.h&gt;
+#include &lt;sys/stat.h&gt;
+#include &lt;wtf/text/CString.h&gt;
+#include &lt;wtf/text/StringBuilder.h&gt;
+
+namespace WebKit {
+
+NetworkCacheIOChannel::NetworkCacheIOChannel(int fd)
+    : m_fileDescriptor(fd)
+{
+    m_dispatchIO = adoptDispatch(dispatch_io_create(DISPATCH_IO_RANDOM, fd, dispatch_get_main_queue(), [fd](int) {
+        close(fd);
+    }));
+    ASSERT(m_dispatchIO.get());
+    // This makes the channel read/write all data before invoking the handlers.
+    dispatch_io_set_low_water(m_dispatchIO.get(), std::numeric_limits&lt;size_t&gt;::max());
+}
+
+Ref&lt;NetworkCacheIOChannel&gt; NetworkCacheIOChannel::open(const String&amp; filePath, NetworkCacheIOChannel::Type type)
+{
+    int oflag;
+    mode_t mode;
+
+    switch (type) {
+    case Type::Create:
+        oflag = O_RDWR | O_CREAT | O_TRUNC | O_NONBLOCK;
+        mode = S_IRUSR | S_IWUSR;
+        break;
+    case Type::Write:
+        oflag = O_WRONLY | O_NONBLOCK;
+        mode = S_IRUSR | S_IWUSR;
+        break;
+    case Type::Read:
+        oflag = O_RDONLY | O_NONBLOCK;
+        mode = 0;
+    }
+
+    CString path = WebCore::fileSystemRepresentation(filePath);
+    int fd = ::open(path.data(), oflag, mode);
+
+    return adoptRef(*new NetworkCacheIOChannel(fd));
+}
+
+void NetworkCacheIOChannel::read(size_t offset, size_t size, std::function&lt;void ( NetworkCacheData&amp;, int error)&gt; completionHandler)
+{
+    RefPtr&lt;NetworkCacheIOChannel&gt; channel(this);
+    bool didCallCompletionHandler = false;
+    dispatch_io_read(m_dispatchIO.get(), offset, size, dispatch_get_main_queue(), [channel, completionHandler, didCallCompletionHandler](bool done, dispatch_data_t fileData, int error) mutable {
+        if (done) {
+            if (!didCallCompletionHandler) {
+                NetworkCacheData nullData;
+                completionHandler(nullData, error);
+            }
+            return;
+        }
+        ASSERT(!didCallCompletionHandler);
+        NetworkCacheData data(fileData);
+        completionHandler(data, error);
+        didCallCompletionHandler = true;
+    });
+}
+
+void NetworkCacheIOChannel::write(size_t offset, const NetworkCacheData&amp; data, std::function&lt;void (int error)&gt; completionHandler)
+{
+    RefPtr&lt;NetworkCacheIOChannel&gt; channel(this);
+    auto dispatchData = data.dispatchData();
+    dispatch_io_write(m_dispatchIO.get(), offset, dispatchData, dispatch_get_main_queue(), [channel, completionHandler](bool done, dispatch_data_t fileData, int error) {
+        ASSERT_UNUSED(done, done);
+        completionHandler(error);
+    });
+}
+
+}
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorage.h        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -28,6 +28,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(NETWORK_CACHE)
</span><span class="cx"> 
</span><ins>+#include &quot;NetworkCacheData.h&quot;
</ins><span class="cx"> #include &quot;NetworkCacheKey.h&quot;
</span><span class="cx"> #include &lt;wtf/BloomFilter.h&gt;
</span><span class="cx"> #include &lt;wtf/Deque.h&gt;
</span><span class="lines">@@ -46,106 +47,22 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-#if PLATFORM(COCOA)
-template &lt;typename T&gt; class DispatchPtr;
-template &lt;typename T&gt; DispatchPtr&lt;T&gt; adoptDispatch(T dispatchObject);
-
-// FIXME: Use OSObjectPtr instead when it works with dispatch_data_t on all platforms.
-template&lt;typename T&gt; class DispatchPtr {
-public:
-    DispatchPtr()
-        : m_ptr(nullptr)
-    {
-    }
-    DispatchPtr(T ptr)
-        : m_ptr(ptr)
-    {
-        if (m_ptr)
-            dispatch_retain(m_ptr);
-    }
-    DispatchPtr(const DispatchPtr&amp; other)
-        : m_ptr(other.m_ptr)
-    {
-        if (m_ptr)
-            dispatch_retain(m_ptr);
-    }
-    ~DispatchPtr()
-    {
-        if (m_ptr)
-            dispatch_release(m_ptr);
-    }
-
-    DispatchPtr&amp; operator=(const DispatchPtr&amp; other)
-    {
-        auto copy = other;
-        std::swap(m_ptr, copy.m_ptr);
-        return *this;
-    }
-
-    T get() const { return m_ptr; }
-    explicit operator bool() const { return m_ptr; }
-
-    friend DispatchPtr adoptDispatch&lt;T&gt;(T);
-
-private:
-    struct Adopt { };
-    DispatchPtr(Adopt, T data)
-        : m_ptr(data)
-    {
-    }
-
-    T m_ptr;
-};
-
-template &lt;typename T&gt; DispatchPtr&lt;T&gt; adoptDispatch(T dispatchObject)
-{
-    return DispatchPtr&lt;T&gt;(typename DispatchPtr&lt;T&gt;::Adopt { }, dispatchObject);
-}
-#endif
-
</del><span class="cx"> class NetworkCacheStorage {
</span><span class="cx">     WTF_MAKE_NONCOPYABLE(NetworkCacheStorage);
</span><span class="cx"> public:
</span><span class="cx">     static std::unique_ptr&lt;NetworkCacheStorage&gt; open(const String&amp; cachePath);
</span><span class="cx"> 
</span><del>-    class Data {
-    public:
-        Data() { }
-        Data(const uint8_t*, size_t);
-
-        enum class Backing { Buffer, Map };
-#if PLATFORM(COCOA)
-        explicit Data(DispatchPtr&lt;dispatch_data_t&gt;, Backing = Backing::Buffer);
-#endif
-        bool isNull() const;
-
-        const uint8_t* data() const;
-        size_t size() const { return m_size; }
-        bool isMap() const { return m_isMap; }
-
-#if PLATFORM(COCOA)
-        dispatch_data_t dispatchData() const { return m_dispatchData.get(); }
-#endif
-    private:
-#if PLATFORM(COCOA)
-        mutable DispatchPtr&lt;dispatch_data_t&gt; m_dispatchData;
-#endif
-        mutable const uint8_t* m_data { nullptr };
-        size_t m_size { 0 };
-        bool m_isMap { false };
-    };
-
</del><span class="cx">     struct Entry {
</span><span class="cx">         NetworkCacheKey key;
</span><span class="cx">         std::chrono::milliseconds timeStamp;
</span><del>-        Data header;
-        Data body;
</del><ins>+        NetworkCacheData header;
+        NetworkCacheData body;
</ins><span class="cx">     };
</span><span class="cx">     // This may call completion handler synchronously on failure.
</span><span class="cx">     typedef std::function&lt;bool (std::unique_ptr&lt;Entry&gt;)&gt; RetrieveCompletionHandler;
</span><span class="cx">     void retrieve(const NetworkCacheKey&amp;, unsigned priority, RetrieveCompletionHandler&amp;&amp;);
</span><span class="cx"> 
</span><del>-    typedef std::function&lt;void (bool success, const Data&amp; mappedBody)&gt; StoreCompletionHandler;
</del><ins>+    typedef std::function&lt;void (bool success, const NetworkCacheData&amp; mappedBody)&gt; StoreCompletionHandler;
</ins><span class="cx">     void store(const Entry&amp;, StoreCompletionHandler&amp;&amp;);
</span><span class="cx">     void update(const Entry&amp; updateEntry, const Entry&amp; existingEntry, StoreCompletionHandler&amp;&amp;);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheStorageCocoamm"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheStorageCocoa.mm        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -31,6 +31,7 @@
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="cx"> #include &quot;NetworkCacheCoders.h&quot;
</span><span class="cx"> #include &quot;NetworkCacheFileSystemPosix.h&quot;
</span><ins>+#include &quot;NetworkCacheIOChannel.h&quot;
</ins><span class="cx"> #include &lt;dispatch/dispatch.h&gt;
</span><span class="cx"> #include &lt;mach/vm_param.h&gt;
</span><span class="cx"> #include &lt;sys/mman.h&gt;
</span><span class="lines">@@ -49,39 +50,6 @@
</span><span class="cx"> static const char networkCacheSubdirectory[] = &quot;WebKitCache&quot;;
</span><span class="cx"> static const char versionDirectoryPrefix[] = &quot;Version &quot;;
</span><span class="cx"> 
</span><del>-NetworkCacheStorage::Data::Data(const uint8_t* data, size_t size)
-    : m_dispatchData(adoptDispatch(dispatch_data_create(data, size, nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT)))
-    , m_size(size)
-{
-}
-
-NetworkCacheStorage::Data::Data(DispatchPtr&lt;dispatch_data_t&gt; dispatchData, Backing backing)
-{
-    if (!dispatchData)
-        return;
-    const void* data;
-    m_dispatchData = adoptDispatch(dispatch_data_create_map(dispatchData.get(), &amp;data, &amp;m_size));
-    m_data = static_cast&lt;const uint8_t*&gt;(data);
-    m_isMap = m_size &amp;&amp; backing == Backing::Map;
-}
-
-const uint8_t* NetworkCacheStorage::Data::data() const
-{
-    if (!m_data) {
-        const void* data;
-        size_t size;
-        m_dispatchData = adoptDispatch(dispatch_data_create_map(m_dispatchData.get(), &amp;data, &amp;size));
-        ASSERT(size == m_size);
-        m_data = static_cast&lt;const uint8_t*&gt;(data);
-    }
-    return m_data;
-}
-
-bool NetworkCacheStorage::Data::isNull() const
-{
-    return !m_dispatchData;
-}
-
</del><span class="cx"> std::unique_ptr&lt;NetworkCacheStorage&gt; NetworkCacheStorage::open(const String&amp; cachePath)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(RunLoop::isMain());
</span><span class="lines">@@ -150,49 +118,15 @@
</span><span class="cx">     return WebCore::pathByAppendingComponent(directoryPathForKey(key, cachePath), fileNameForKey(key));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-enum class FileOpenType { Read, Write, Create };
-static DispatchPtr&lt;dispatch_io_t&gt; openFile(const String&amp; fileName, const String&amp; directoryPath, FileOpenType type, int&amp; fd)
</del><ins>+static Ref&lt;NetworkCacheIOChannel&gt; openFileForKey(const NetworkCacheKey&amp; key, NetworkCacheIOChannel::Type type, const String&amp; cachePath)
</ins><span class="cx"> {
</span><del>-    int oflag;
-    mode_t mode;
-
-    switch (type) {
-    case FileOpenType::Create:
-        oflag = O_RDWR | O_CREAT | O_TRUNC | O_NONBLOCK;
-        mode = S_IRUSR | S_IWUSR;
</del><ins>+    auto directoryPath = directoryPathForKey(key, cachePath);
+    auto filePath = WebCore::pathByAppendingComponent(directoryPath, fileNameForKey(key));
+    if (type == NetworkCacheIOChannel::Type::Create)
</ins><span class="cx">         WebCore::makeAllDirectories(directoryPath);
</span><del>-        break;
-    case FileOpenType::Write:
-        oflag = O_WRONLY | O_NONBLOCK;
-        mode = S_IRUSR | S_IWUSR;
-        break;
-    case FileOpenType::Read:
-        oflag = O_RDONLY | O_NONBLOCK;
-        mode = 0;
-    }
-
-    CString path = WebCore::fileSystemRepresentation(WebCore::pathByAppendingComponent(directoryPath, fileName));
-    fd = ::open(path.data(), oflag, mode);
-
-    LOG(NetworkCacheStorage, &quot;(NetworkProcess) opening %s type=%d&quot;, path.data(), type);
-
-    auto channel = adoptDispatch(dispatch_io_create(DISPATCH_IO_RANDOM, fd, dispatch_get_main_queue(), [fd, type](int error) {
-        close(fd);
-        if (error)
-            LOG(NetworkCacheStorage, &quot;(NetworkProcess) error creating io channel %d&quot;, error);
-    }));
-
-    ASSERT(channel);
-    dispatch_io_set_low_water(channel.get(), std::numeric_limits&lt;size_t&gt;::max());
-
-    return channel;
</del><ins>+    return NetworkCacheIOChannel::open(filePath, type);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-static DispatchPtr&lt;dispatch_io_t&gt; openFileForKey(const NetworkCacheKey&amp; key, FileOpenType type, const String&amp; cachePath, int&amp; fd)
-{
-    return openFile(fileNameForKey(key), directoryPathForKey(key, cachePath), type, fd);
-}
-
</del><span class="cx"> static unsigned hashData(dispatch_data_t data)
</span><span class="cx"> {
</span><span class="cx">     if (!data || !dispatch_data_get_size(data))
</span><span class="lines">@@ -220,10 +154,10 @@
</span><span class="cx">     uint64_t bodySize;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-static bool decodeEntryMetaData(EntryMetaData&amp; metaData, dispatch_data_t fileData)
</del><ins>+static bool decodeEntryMetaData(EntryMetaData&amp; metaData, const NetworkCacheData&amp; fileData)
</ins><span class="cx"> {
</span><span class="cx">     bool success = false;
</span><del>-    dispatch_data_apply(fileData, [&amp;metaData, &amp;success](dispatch_data_t, size_t, const void* data, size_t size) {
</del><ins>+    dispatch_data_apply(fileData.dispatchData(), [&amp;metaData, &amp;success](dispatch_data_t, size_t, const void* data, size_t size) {
</ins><span class="cx">         NetworkCacheDecoder decoder(reinterpret_cast&lt;const uint8_t*&gt;(data), size);
</span><span class="cx">         if (!decoder.decode(metaData.cacheStorageVersion))
</span><span class="cx">             return false;
</span><span class="lines">@@ -260,7 +194,7 @@
</span><span class="cx">     return bodyMap;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static bool decodeEntryHeader(dispatch_data_t fileData, EntryMetaData&amp; metaData, NetworkCacheStorage::Data&amp; data)
</del><ins>+static bool decodeEntryHeader(const NetworkCacheData&amp; fileData, EntryMetaData&amp; metaData, NetworkCacheData&amp; data)
</ins><span class="cx"> {
</span><span class="cx">     if (!decodeEntryMetaData(metaData, fileData))
</span><span class="cx">         return false;
</span><span class="lines">@@ -269,25 +203,25 @@
</span><span class="cx">     if (metaData.headerOffset + metaData.headerSize &gt; metaData.bodyOffset)
</span><span class="cx">         return false;
</span><span class="cx"> 
</span><del>-    auto headerData = adoptDispatch(dispatch_data_create_subrange(fileData, metaData.headerOffset, metaData.headerSize));
</del><ins>+    auto headerData = adoptDispatch(dispatch_data_create_subrange(fileData.dispatchData(), metaData.headerOffset, metaData.headerSize));
</ins><span class="cx">     if (metaData.headerChecksum != hashData(headerData.get())) {
</span><span class="cx">         LOG(NetworkCacheStorage, &quot;(NetworkProcess) header checksum mismatch&quot;);
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><del>-    data =  NetworkCacheStorage::Data { headerData };
</del><ins>+    data = { headerData };
</ins><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static std::unique_ptr&lt;NetworkCacheStorage::Entry&gt; decodeEntry(dispatch_data_t fileData, int fd, const NetworkCacheKey&amp; key)
</del><ins>+static std::unique_ptr&lt;NetworkCacheStorage::Entry&gt; decodeEntry(const NetworkCacheData&amp; fileData, int fd, const NetworkCacheKey&amp; key)
</ins><span class="cx"> {
</span><span class="cx">     EntryMetaData metaData;
</span><del>-    NetworkCacheStorage::Data headerData;
</del><ins>+    NetworkCacheData headerData;
</ins><span class="cx">     if (!decodeEntryHeader(fileData, metaData, headerData))
</span><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><span class="cx">     if (metaData.key != key)
</span><span class="cx">         return nullptr;
</span><del>-    if (metaData.bodyOffset + metaData.bodySize != dispatch_data_get_size(fileData))
</del><ins>+    if (metaData.bodyOffset + metaData.bodySize != fileData.size())
</ins><span class="cx">         return nullptr;
</span><span class="cx"> 
</span><span class="cx">     auto bodyData = mapFile(fd, metaData.bodyOffset, metaData.bodySize);
</span><span class="lines">@@ -305,7 +239,7 @@
</span><span class="cx">         metaData.key,
</span><span class="cx">         metaData.timeStamp,
</span><span class="cx">         headerData,
</span><del>-        NetworkCacheStorage::Data { bodyData, NetworkCacheStorage::Data::Backing::Map }
</del><ins>+        { bodyData, NetworkCacheData::Backing::Map }
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -326,7 +260,7 @@
</span><span class="cx">     return adoptDispatch(dispatch_data_create(encoder.buffer(), encoder.bufferSize(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-static DispatchPtr&lt;dispatch_data_t&gt; encodeEntryHeader(const NetworkCacheStorage::Entry&amp; entry)
</del><ins>+static NetworkCacheData encodeEntryHeader(const NetworkCacheStorage::Entry&amp; entry)
</ins><span class="cx"> {
</span><span class="cx">     EntryMetaData metaData(entry.key);
</span><span class="cx">     metaData.timeStamp = entry.timeStamp;
</span><span class="lines">@@ -338,13 +272,13 @@
</span><span class="cx">     auto encodedMetaData = encodeEntryMetaData(metaData);
</span><span class="cx">     auto headerData = adoptDispatch(dispatch_data_create_concat(encodedMetaData.get(), entry.header.dispatchData()));
</span><span class="cx">     if (!entry.body.size())
</span><del>-        return headerData;
</del><ins>+        return { headerData };
</ins><span class="cx"> 
</span><span class="cx">     size_t headerSize = dispatch_data_get_size(headerData.get());
</span><span class="cx">     size_t dataOffset = round_page(headerSize);
</span><span class="cx">     Vector&lt;uint8_t, 4096&gt; filler(dataOffset - headerSize, 0);
</span><span class="cx">     auto alignmentData = adoptDispatch(dispatch_data_create(filler.data(), filler.size(), nullptr, DISPATCH_DATA_DESTRUCTOR_DEFAULT));
</span><del>-    return adoptDispatch(dispatch_data_create_concat(headerData.get(), alignmentData.get()));
</del><ins>+    return { adoptDispatch(dispatch_data_create_concat(headerData.get(), alignmentData.get())) };
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void NetworkCacheStorage::removeEntry(const NetworkCacheKey&amp; key)
</span><span class="lines">@@ -370,30 +304,25 @@
</span><span class="cx"> 
</span><span class="cx">     StringCapture cachePathCapture(m_directoryPath);
</span><span class="cx">     dispatch_async(m_ioQueue.get(), [this, &amp;read, cachePathCapture] {
</span><del>-        int fd;
-        auto channel = openFileForKey(read.key, FileOpenType::Read, cachePathCapture.string(), fd);
</del><ins>+        auto channel = openFileForKey(read.key, NetworkCacheIOChannel::Type::Read, cachePathCapture.string());
+        int fd = channel-&gt;fileDescriptor();
</ins><span class="cx"> 
</span><del>-        bool didCallCompletionHandler = false;
-        dispatch_io_read(channel.get(), 0, std::numeric_limits&lt;size_t&gt;::max(), dispatch_get_main_queue(), [this, fd, &amp;read, didCallCompletionHandler](bool done, dispatch_data_t fileData, int error) mutable {
-            if (done) {
-                if (error)
</del><ins>+        channel-&gt;read(0, std::numeric_limits&lt;size_t&gt;::max(), [this, &amp;read, fd](NetworkCacheData&amp; fileData, int error) {
+            if (error) {
+                removeEntry(read.key);
+                read.completionHandler(nullptr);
+            } else {
+                auto entry = decodeEntry(fileData, fd, read.key);
+                bool success = read.completionHandler(WTF::move(entry));
+                if (!success)
</ins><span class="cx">                     removeEntry(read.key);
</span><del>-
-                if (!didCallCompletionHandler)
-                    read.completionHandler(nullptr);
-
-                ASSERT(m_activeReadOperations.contains(&amp;read));
-                m_activeReadOperations.remove(&amp;read);
-                dispatchPendingReadOperations();
-                return;
</del><span class="cx">             }
</span><del>-            ASSERT(!didCallCompletionHandler); // We are requesting maximum sized chunk so we should never get called more than once with data.
</del><span class="cx"> 
</span><del>-            auto entry = decodeEntry(fileData, fd, read.key);
-            bool success = read.completionHandler(WTF::move(entry));
-            didCallCompletionHandler = true;
-            if (!success)
-                removeEntry(read.key);
</del><ins>+            ASSERT(m_activeReadOperations.contains(&amp;read));
+            m_activeReadOperations.remove(&amp;read);
+            dispatchPendingReadOperations();
+
+            LOG(NetworkCacheStorage, &quot;(NetworkProcess) read complete error=%d&quot;, error);
</ins><span class="cx">         });
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="lines">@@ -465,7 +394,7 @@
</span><span class="cx">     ASSERT(!entry.key.isNull());
</span><span class="cx"> 
</span><span class="cx">     if (!m_maximumSize) {
</span><del>-        completionHandler(false, Data());
</del><ins>+        completionHandler(false, { });
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -484,7 +413,7 @@
</span><span class="cx">     ASSERT(existingEntry.key == updateEntry.key);
</span><span class="cx"> 
</span><span class="cx">     if (!m_maximumSize) {
</span><del>-        completionHandler(false, Data());
</del><ins>+        completionHandler(false, { });
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -500,18 +429,17 @@
</span><span class="cx">         String cachePath = cachePathCapture.string();
</span><span class="cx">         auto semaphore = adoptDispatch(dispatch_semaphore_create(0));
</span><span class="cx">         traverseCacheFiles(cachePath, [this, &amp;semaphore, &amp;traverseHandler](const String&amp; fileName, const String&amp; partitionPath) {
</span><del>-            int fd;
-            auto channel = openFile(fileName, partitionPath, FileOpenType::Read, fd);
</del><ins>+            auto filePath = WebCore::pathByAppendingComponent(partitionPath, fileName);
+            auto channel = NetworkCacheIOChannel::open(filePath, NetworkCacheIOChannel::Type::Read);
</ins><span class="cx">             const size_t headerReadSize = 16 &lt;&lt; 10;
</span><del>-            dispatch_io_read(channel.get(), 0, headerReadSize, dispatch_get_main_queue(), [this, fd, &amp;semaphore, &amp;traverseHandler](bool done, dispatch_data_t fileData, int) {
</del><ins>+            channel-&gt;read(0, headerReadSize, [this, &amp;semaphore, &amp;traverseHandler](NetworkCacheData&amp; fileData, int) {
</ins><span class="cx">                 EntryMetaData metaData;
</span><del>-                NetworkCacheStorage::Data headerData;
</del><ins>+                NetworkCacheData headerData;
</ins><span class="cx">                 if (decodeEntryHeader(fileData, metaData, headerData)) {
</span><del>-                    Entry entry { metaData.key, metaData.timeStamp, headerData, Data() };
</del><ins>+                    Entry entry { metaData.key, metaData.timeStamp, headerData, { } };
</ins><span class="cx">                     traverseHandler(&amp;entry);
</span><span class="cx">                 }
</span><del>-                if (done)
-                    dispatch_semaphore_signal(semaphore.get());
</del><ins>+                dispatch_semaphore_signal(semaphore.get());
</ins><span class="cx">             });
</span><span class="cx">             dispatch_semaphore_wait(semaphore.get(), DISPATCH_TIME_FOREVER);
</span><span class="cx">         });
</span><span class="lines">@@ -555,14 +483,15 @@
</span><span class="cx">     StringCapture cachePathCapture(m_directoryPath);
</span><span class="cx">     dispatch_async(m_backgroundIOQueue.get(), [this, &amp;write, cachePathCapture] {
</span><span class="cx">         auto encodedHeader = encodeEntryHeader(write.entry);
</span><del>-        auto writeData = adoptDispatch(dispatch_data_create_concat(encodedHeader.get(), write.entry.body.dispatchData()));
</del><ins>+        auto headerAndBodyData = adoptDispatch(dispatch_data_create_concat(encodedHeader.dispatchData(), write.entry.body.dispatchData()));
</ins><span class="cx"> 
</span><del>-        size_t bodyOffset = dispatch_data_get_size(encodedHeader.get());
</del><ins>+        NetworkCacheData writeData(headerAndBodyData);
</ins><span class="cx"> 
</span><del>-        int fd;
-        auto channel = openFileForKey(write.entry.key, FileOpenType::Create, cachePathCapture.string(), fd);
-        dispatch_io_write(channel.get(), 0, writeData.get(), dispatch_get_main_queue(), [this, &amp;write, fd, bodyOffset](bool done, dispatch_data_t, int error) {
-            ASSERT_UNUSED(done, done);
</del><ins>+        auto channel = openFileForKey(write.entry.key, NetworkCacheIOChannel::Type::Create, cachePathCapture.string());
+        int fd = channel-&gt;fileDescriptor();
+        size_t bodyOffset = encodedHeader.size();
+
+        channel-&gt;write(0, writeData, [this, &amp;write, bodyOffset, fd](int error) {
</ins><span class="cx">             LOG(NetworkCacheStorage, &quot;(NetworkProcess) write complete error=%d&quot;, error);
</span><span class="cx">             if (error) {
</span><span class="cx">                 if (m_contentsFilter.mayContain(write.entry.key.shortHash()))
</span><span class="lines">@@ -576,7 +505,7 @@
</span><span class="cx">             bool shouldMapBody = !error &amp;&amp; bodySize &gt;= vm_page_size;
</span><span class="cx">             auto bodyMap = shouldMapBody ? mapFile(fd, bodyOffset, bodySize) : nullptr;
</span><span class="cx"> 
</span><del>-            Data bodyData(bodyMap, Data::Backing::Map);
</del><ins>+            NetworkCacheData bodyData(bodyMap, NetworkCacheData::Backing::Map);
</ins><span class="cx">             write.completionHandler(!error, bodyData);
</span><span class="cx"> 
</span><span class="cx">             ASSERT(m_activeWriteOperations.contains(&amp;write));
</span><span class="lines">@@ -601,7 +530,7 @@
</span><span class="cx">         auto headerData = encodeEntryHeader(write.entry);
</span><span class="cx">         auto existingHeaderData = encodeEntryHeader(write.existingEntry.value());
</span><span class="cx"> 
</span><del>-        bool pageRoundedHeaderSizeChanged = dispatch_data_get_size(headerData.get()) != dispatch_data_get_size(existingHeaderData.get());
</del><ins>+        bool pageRoundedHeaderSizeChanged = headerData.size() != existingHeaderData.size();
</ins><span class="cx">         if (pageRoundedHeaderSizeChanged) {
</span><span class="cx">             LOG(NetworkCacheStorage, &quot;(NetworkProcess) page-rounded header size changed, storing full entry&quot;);
</span><span class="cx">             dispatch_async(dispatch_get_main_queue(), [this, &amp;write] {
</span><span class="lines">@@ -610,16 +539,14 @@
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        int fd;
-        auto channel = openFileForKey(write.entry.key, FileOpenType::Write, cachePathCapture.string(), fd);
-        dispatch_io_write(channel.get(), 0, headerData.get(), dispatch_get_main_queue(), [this, &amp;write](bool done, dispatch_data_t, int error) {
-            ASSERT_UNUSED(done, done);
</del><ins>+        auto channel = openFileForKey(write.entry.key, NetworkCacheIOChannel::Type::Write, cachePathCapture.string());
+        channel-&gt;write(0, headerData, [this, &amp;write](int error) {
</ins><span class="cx">             LOG(NetworkCacheStorage, &quot;(NetworkProcess) update complete error=%d&quot;, error);
</span><span class="cx"> 
</span><span class="cx">             if (error)
</span><span class="cx">                 removeEntry(write.entry.key);
</span><span class="cx"> 
</span><del>-            write.completionHandler(!error, Data());
</del><ins>+            write.completionHandler(!error, { });
</ins><span class="cx"> 
</span><span class="cx">             ASSERT(m_activeWriteOperations.contains(&amp;write));
</span><span class="cx">             m_activeWriteOperations.remove(&amp;write);
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (181019 => 181020)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2015-03-04 21:32:27 UTC (rev 181019)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2015-03-04 21:35:11 UTC (rev 181020)
</span><span class="lines">@@ -1753,6 +1753,10 @@
</span><span class="cx">                 E1E552C516AE065F004ED653 /* SandboxInitializationParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = E1E552C316AE065E004ED653 /* SandboxInitializationParameters.h */; };
</span><span class="cx">                 E1EE53E311F8CFC000CCBEE4 /* InjectedBundlePageEditorClient.h in Headers */ = {isa = PBXBuildFile; fileRef = E1EE53DC11F8CF9F00CCBEE4 /* InjectedBundlePageEditorClient.h */; };
</span><span class="cx">                 E1EE53E711F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E1EE53E611F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp */; };
</span><ins>+                E42E060F1AA7523400B11699 /* NetworkCacheIOChannelCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = E42E060D1AA750E500B11699 /* NetworkCacheIOChannelCocoa.mm */; };
+                E42E06101AA7523B00B11699 /* NetworkCacheIOChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */; };
+                E42E06121AA75ABD00B11699 /* NetworkCacheData.h in Headers */ = {isa = PBXBuildFile; fileRef = E42E06111AA75ABD00B11699 /* NetworkCacheData.h */; };
+                E42E06141AA75B7000B11699 /* NetworkCacheDataCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = E42E06131AA75B7000B11699 /* NetworkCacheDataCocoa.mm */; };
</ins><span class="cx">                 E4436ECA1A0D03FA00EAD204 /* NetworkCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4436EBE1A0CFDB200EAD204 /* NetworkCache.cpp */; };
</span><span class="cx">                 E4436ECC1A0D040B00EAD204 /* NetworkCache.h in Headers */ = {isa = PBXBuildFile; fileRef = E4436EBF1A0CFDB200EAD204 /* NetworkCache.h */; };
</span><span class="cx">                 E4436ECD1A0D040B00EAD204 /* NetworkCacheKey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E4436EC01A0CFDB200EAD204 /* NetworkCacheKey.cpp */; };
</span><span class="lines">@@ -3985,6 +3989,10 @@
</span><span class="cx">                 E1EE53E611F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InjectedBundlePageEditorClient.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E1FEF39A190F76F300731658 /* com.apple.WebKit.Databases.sb.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = com.apple.WebKit.Databases.sb.in; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E1FEF39C190F791C00731658 /* DatabaseProcessIOS.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DatabaseProcessIOS.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheIOChannel.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E42E060D1AA750E500B11699 /* NetworkCacheIOChannelCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkCacheIOChannelCocoa.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E42E06111AA75ABD00B11699 /* NetworkCacheData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheData.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E42E06131AA75B7000B11699 /* NetworkCacheDataCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = NetworkCacheDataCocoa.mm; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 E4436EBE1A0CFDB200EAD204 /* NetworkCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCache.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E4436EBF1A0CFDB200EAD204 /* NetworkCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCache.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 E4436EC01A0CFDB200EAD204 /* NetworkCacheKey.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheKey.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -7417,11 +7425,15 @@
</span><span class="cx">                                 E489D2831A0A2DB80078C06A /* NetworkCacheCoder.h */,
</span><span class="cx">                                 E489D2841A0A2DB80078C06A /* NetworkCacheCoders.cpp */,
</span><span class="cx">                                 E489D2851A0A2DB80078C06A /* NetworkCacheCoders.h */,
</span><ins>+                                E42E06111AA75ABD00B11699 /* NetworkCacheData.h */,
+                                E42E06131AA75B7000B11699 /* NetworkCacheDataCocoa.mm */,
</ins><span class="cx">                                 E489D2861A0A2DB80078C06A /* NetworkCacheDecoder.cpp */,
</span><span class="cx">                                 E489D2871A0A2DB80078C06A /* NetworkCacheDecoder.h */,
</span><span class="cx">                                 E489D2881A0A2DB80078C06A /* NetworkCacheEncoder.cpp */,
</span><span class="cx">                                 E489D2891A0A2DB80078C06A /* NetworkCacheEncoder.h */,
</span><span class="cx">                                 834B250E1A831A8D00CFB150 /* NetworkCacheFileSystemPosix.h */,
</span><ins>+                                E42E060B1AA7440D00B11699 /* NetworkCacheIOChannel.h */,
+                                E42E060D1AA750E500B11699 /* NetworkCacheIOChannelCocoa.mm */,
</ins><span class="cx">                                 E4436EC01A0CFDB200EAD204 /* NetworkCacheKey.cpp */,
</span><span class="cx">                                 E4436EC11A0CFDB200EAD204 /* NetworkCacheKey.h */,
</span><span class="cx">                                 834B25101A842C8700CFB150 /* NetworkCacheStatistics.h */,
</span><span class="lines">@@ -7536,6 +7548,7 @@
</span><span class="cx">                                 3769079A18F31CB2001DFF04 /* APIInjectedBundlePageUIClient.h in Headers */,
</span><span class="cx">                                 7C89D2B61A6B0DD9003A5FDE /* WKUserContentControllerPrivate.h in Headers */,
</span><span class="cx">                                 7CE4D2071A46776100C7F152 /* APILegacyContextHistoryClient.h in Headers */,
</span><ins>+                                E42E06121AA75ABD00B11699 /* NetworkCacheData.h in Headers */,
</ins><span class="cx">                                 1A2464F31891E45100234C5B /* APILoaderClient.h in Headers */,
</span><span class="cx">                                 7CD3A4831A5D02FA009623B8 /* APINavigation.h in Headers */,
</span><span class="cx">                                 BCF69FA21176D01400471A52 /* APINavigationData.h in Headers */,
</span><span class="lines">@@ -7849,6 +7862,7 @@
</span><span class="cx">                                 51654F00184EF34A007DC837 /* UniqueIDBDatabaseBackingStore.h in Headers */,
</span><span class="cx">                                 51654EFE184EF33F007DC837 /* UniqueIDBDatabaseBackingStoreSQLite.h in Headers */,
</span><span class="cx">                                 515E773418402D510007203F /* UniqueIDBDatabaseIdentifier.h in Headers */,
</span><ins>+                                E42E06101AA7523B00B11699 /* NetworkCacheIOChannel.h in Headers */,
</ins><span class="cx">                                 1A64245E12DE29A100CAAE2C /* UpdateInfo.h in Headers */,
</span><span class="cx">                                 1AC1336818565B5700F3EC05 /* UserData.h in Headers */,
</span><span class="cx">                                 4A3CC18B19B0640F00D14AEF /* UserMediaPermissionRequestManagerProxy.h in Headers */,
</span><span class="lines">@@ -9607,6 +9621,7 @@
</span><span class="cx">                                 296BD85E15019BC30071F424 /* StringUtilities.mm in Sources */,
</span><span class="cx">                                 1ZZ417EF12C00D87002BE67B /* TextCheckerCompletion.cpp in Sources */,
</span><span class="cx">                                 2DA944AD1884E9BA00ED86DB /* TextCheckerIOS.mm in Sources */,
</span><ins>+                                E42E06141AA75B7000B11699 /* NetworkCacheDataCocoa.mm in Sources */,
</ins><span class="cx">                                 1AA417EF12C00D87002BE67B /* TextCheckerMac.mm in Sources */,
</span><span class="cx">                                 1AAF263814687C39004A1E8A /* TiledCoreAnimationDrawingArea.mm in Sources */,
</span><span class="cx">                                 1AF05D8614688348008B1E81 /* TiledCoreAnimationDrawingAreaProxy.mm in Sources */,
</span><span class="lines">@@ -9854,6 +9869,7 @@
</span><span class="cx">                                 2D0730A219F9C7DA00E9D9C4 /* WKActionMenuController.mm in Sources */,
</span><span class="cx">                                 0FCB4E4918BBE044000FCFC9 /* WKActionSheet.mm in Sources */,
</span><span class="cx">                                 0FCB4E4B18BBE044000FCFC9 /* WKActionSheetAssistant.mm in Sources */,
</span><ins>+                                E42E060F1AA7523400B11699 /* NetworkCacheIOChannelCocoa.mm in Sources */,
</ins><span class="cx">                                 C5FA1ED418E1062200B3F402 /* WKAirPlayRoutePicker.mm in Sources */,
</span><span class="cx">                                 512E34E4130B4D0500ABD19A /* WKApplicationCacheManager.cpp in Sources */,
</span><span class="cx">                                 BC4075F3124FF0270068F20A /* WKArray.cpp in Sources */,
</span></span></pre>
</div>
</div>

</body>
</html>