<!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>[175748] 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/175748">175748</a></dd>
<dt>Author</dt> <dd>antti@apple.com</dd>
<dt>Date</dt> <dd>2014-11-07 03:29:55 -0800 (Fri, 07 Nov 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>Add cache coders
https://bugs.webkit.org/show_bug.cgi?id=138413

Reviewed by Anders Carlsson.

Add encoding and decoding support for cache types.

This is largely a copy of the IPC coder classes with some unnecessary features removed.
The coders compute a type-sensitive checksum that can be used to verify the data integrity.

The code is behind ENABLE(NETWORK_CACHE) and not yet used.

* NetworkProcess/cache: Added.
* NetworkProcess/cache/NetworkCacheCoder.h: Added.
* NetworkProcess/cache/NetworkCacheCoders.cpp: Added.
* NetworkProcess/cache/NetworkCacheCoders.h: Added.
* NetworkProcess/cache/NetworkCacheDecoder.cpp: Added.
* NetworkProcess/cache/NetworkCacheDecoder.h: Added.
* NetworkProcess/cache/NetworkCacheEncoder.cpp: Added.
* NetworkProcess/cache/NetworkCacheEncoder.h: Added.
* WebKit2.xcodeproj/project.pbxproj:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li>trunk/Source/WebKit2/NetworkProcess/cache/</li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheCoderh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoder.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheCoderscpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoders.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheCodersh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoders.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheDecodercpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheDecoderh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheEncodercpp">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp</a></li>
<li><a href="#trunkSourceWebKit2NetworkProcesscacheNetworkCacheEncoderh">trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (175747 => 175748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-11-07 11:28:53 UTC (rev 175747)
+++ trunk/Source/WebKit2/ChangeLog        2014-11-07 11:29:55 UTC (rev 175748)
</span><span class="lines">@@ -1,3 +1,27 @@
</span><ins>+2014-11-07  Antti Koivisto  &lt;antti@apple.com&gt;
+
+        Add cache coders
+        https://bugs.webkit.org/show_bug.cgi?id=138413
+
+        Reviewed by Anders Carlsson.
+
+        Add encoding and decoding support for cache types.
+
+        This is largely a copy of the IPC coder classes with some unnecessary features removed.
+        The coders compute a type-sensitive checksum that can be used to verify the data integrity.
+
+        The code is behind ENABLE(NETWORK_CACHE) and not yet used.
+
+        * NetworkProcess/cache: Added.
+        * NetworkProcess/cache/NetworkCacheCoder.h: Added.
+        * NetworkProcess/cache/NetworkCacheCoders.cpp: Added.
+        * NetworkProcess/cache/NetworkCacheCoders.h: Added.
+        * NetworkProcess/cache/NetworkCacheDecoder.cpp: Added.
+        * NetworkProcess/cache/NetworkCacheDecoder.h: Added.
+        * NetworkProcess/cache/NetworkCacheEncoder.cpp: Added.
+        * NetworkProcess/cache/NetworkCacheEncoder.h: Added.
+        * WebKit2.xcodeproj/project.pbxproj:
+
</ins><span class="cx"> 2014-11-06  Conrad Shultz  &lt;conrad_shultz@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Clients should be able to customize the view used for page previews
</span></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheCoderh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoder.h (0 => 175748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoder.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoder.h        2014-11-07 11:29:55 UTC (rev 175748)
</span><span class="lines">@@ -0,0 +1,51 @@
</span><ins>+/*
+ * Copyright (C) 2010, 2014 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 NetworkCacheCoder_h
+#define NetworkCacheCoder_h
+
+#if ENABLE(NETWORK_CACHE)
+
+namespace WebKit {
+
+class NetworkCacheDecoder;
+class NetworkCacheEncoder;
+    
+template&lt;typename T&gt; struct NetworkCacheCoder {
+    static void encode(NetworkCacheEncoder&amp; encoder, const T&amp; t)
+    {
+        t.encode(encoder);
+    }
+
+    static bool decode(NetworkCacheDecoder&amp; decoder, T&amp; t)
+    {
+        return T::decode(decoder, t);
+    }
+};
+
+}
+
+#endif
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheCoderscpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoders.cpp (0 => 175748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoders.cpp                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoders.cpp        2014-11-07 11:29:55 UTC (rev 175748)
</span><span class="lines">@@ -0,0 +1,178 @@
</span><ins>+/*
+ * Copyright (C) 2011, 2014 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;NetworkCacheCoders.h&quot;
+
+#if ENABLE(NETWORK_CACHE)
+
+#include &quot;WebCoreArgumentCoders.h&quot;
+#include &lt;wtf/text/CString.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+namespace WebKit {
+
+void NetworkCacheCoder&lt;AtomicString&gt;::encode(NetworkCacheEncoder&amp; encoder, const AtomicString&amp; atomicString)
+{
+    encoder &lt;&lt; atomicString.string();
+}
+
+bool NetworkCacheCoder&lt;AtomicString&gt;::decode(NetworkCacheDecoder&amp; decoder, AtomicString&amp; atomicString)
+{
+    String string;
+    if (!decoder.decode(string))
+        return false;
+
+    atomicString = string;
+    return true;
+}
+
+void NetworkCacheCoder&lt;CString&gt;::encode(NetworkCacheEncoder&amp; encoder, const CString&amp; string)
+{
+    // Special case the null string.
+    if (string.isNull()) {
+        encoder &lt;&lt; std::numeric_limits&lt;uint32_t&gt;::max();
+        return;
+    }
+
+    uint32_t length = string.length();
+    encoder &lt;&lt; length;
+    encoder.encodeFixedLengthData(reinterpret_cast&lt;const uint8_t*&gt;(string.data()), length, 1);
+}
+
+bool NetworkCacheCoder&lt;CString&gt;::decode(NetworkCacheDecoder&amp; decoder, CString&amp; result)
+{
+    uint32_t length;
+    if (!decoder.decode(length))
+        return false;
+
+    if (length == std::numeric_limits&lt;uint32_t&gt;::max()) {
+        // This is the null string.
+        result = CString();
+        return true;
+    }
+
+    // Before allocating the string, make sure that the decoder buffer is big enough.
+    if (!decoder.bufferIsLargeEnoughToContain&lt;char&gt;(length)) {
+        decoder.markInvalid();
+        return false;
+    }
+
+    char* buffer;
+    CString string = CString::newUninitialized(length, buffer);
+    if (!decoder.decodeFixedLengthData(reinterpret_cast&lt;uint8_t*&gt;(buffer), length, 1))
+        return false;
+
+    result = string;
+    return true;
+}
+
+
+void NetworkCacheCoder&lt;String&gt;::encode(NetworkCacheEncoder&amp; encoder, const String&amp; string)
+{
+    // Special case the null string.
+    if (string.isNull()) {
+        encoder &lt;&lt; std::numeric_limits&lt;uint32_t&gt;::max();
+        return;
+    }
+
+    uint32_t length = string.length();
+    bool is8Bit = string.is8Bit();
+
+    encoder &lt;&lt; length &lt;&lt; is8Bit;
+
+    if (is8Bit)
+        encoder.encodeFixedLengthData(reinterpret_cast&lt;const uint8_t*&gt;(string.characters8()), length * sizeof(LChar), alignof(LChar));
+    else
+        encoder.encodeFixedLengthData(reinterpret_cast&lt;const uint8_t*&gt;(string.characters16()), length * sizeof(UChar), alignof(UChar));
+}
+
+template &lt;typename CharacterType&gt;
+static inline bool decodeStringText(NetworkCacheDecoder&amp; decoder, uint32_t length, String&amp; result)
+{
+    // Before allocating the string, make sure that the decoder buffer is big enough.
+    if (!decoder.bufferIsLargeEnoughToContain&lt;CharacterType&gt;(length)) {
+        decoder.markInvalid();
+        return false;
+    }
+    
+    CharacterType* buffer;
+    String string = String::createUninitialized(length, buffer);
+    if (!decoder.decodeFixedLengthData(reinterpret_cast&lt;uint8_t*&gt;(buffer), length * sizeof(CharacterType), alignof(CharacterType)))
+        return false;
+    
+    result = string;
+    return true;    
+}
+
+bool NetworkCacheCoder&lt;String&gt;::decode(NetworkCacheDecoder&amp; decoder, String&amp; result)
+{
+    uint32_t length;
+    if (!decoder.decode(length))
+        return false;
+
+    if (length == std::numeric_limits&lt;uint32_t&gt;::max()) {
+        // This is the null string.
+        result = String();
+        return true;
+    }
+
+    bool is8Bit;
+    if (!decoder.decode(is8Bit))
+        return false;
+
+    if (is8Bit)
+        return decodeStringText&lt;LChar&gt;(decoder, length, result);
+    return decodeStringText&lt;UChar&gt;(decoder, length, result);
+}
+
+void NetworkCacheCoder&lt;WebCore::CertificateInfo&gt;::encode(NetworkCacheEncoder&amp; encoder, const WebCore::CertificateInfo&amp; certificateInfo)
+{
+    // FIXME: Cocoa CertificateInfo is a CF object tree. Generalize CF type coding so we don't need to use ArgumentCoder here.
+    IPC::ArgumentEncoder argumentEncoder;
+    argumentEncoder &lt;&lt; certificateInfo;
+    encoder &lt;&lt; static_cast&lt;uint64_t&gt;(argumentEncoder.bufferSize());
+    encoder.encodeFixedLengthData(argumentEncoder.buffer(), argumentEncoder.bufferSize(), 1);
+}
+
+bool NetworkCacheCoder&lt;WebCore::CertificateInfo&gt;::decode(NetworkCacheDecoder&amp; decoder, WebCore::CertificateInfo&amp; certificateInfo)
+{
+    uint64_t certificateSize;
+    if (!decoder.decode(certificateSize))
+        return false;
+    Vector&lt;uint8_t&gt; data(certificateSize);
+    if (!decoder.decodeFixedLengthData(data.data(), data.size(), 1))
+        return false;
+    IPC::ArgumentDecoder argumentDecoder(data.data(), data.size());
+    if (!argumentDecoder.decode(certificateInfo)) {
+        decoder.markInvalid();
+        return false;
+    }
+    return true;
+}
+
+}
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheCodersh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoders.h (0 => 175748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoders.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheCoders.h        2014-11-07 11:29:55 UTC (rev 175748)
</span><span class="lines">@@ -0,0 +1,261 @@
</span><ins>+/*
+ * Copyright (C) 2010, 2014 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 NetworkCacheCoders_h
+#define NetworkCacheCoders_h
+
+#if ENABLE(NETWORK_CACHE)
+
+#include &quot;NetworkCacheDecoder.h&quot;
+#include &quot;NetworkCacheEncoder.h&quot;
+#include &lt;WebCore/CertificateInfo.h&gt;
+#include &lt;utility&gt;
+#include &lt;wtf/Forward.h&gt;
+#include &lt;wtf/HashMap.h&gt;
+#include &lt;wtf/HashSet.h&gt;
+#include &lt;wtf/Vector.h&gt;
+
+namespace WebKit {
+
+template&lt;typename T, typename U&gt; struct NetworkCacheCoder&lt;std::pair&lt;T, U&gt;&gt; {
+    static void encode(NetworkCacheEncoder&amp; encoder, const std::pair&lt;T, U&gt;&amp; pair)
+    {
+        encoder &lt;&lt; pair.first &lt;&lt; pair.second;
+    }
+
+    static bool decode(NetworkCacheDecoder&amp; decoder, std::pair&lt;T, U&gt;&amp; pair)
+    {
+        T first;
+        if (!decoder.decode(first))
+            return false;
+
+        U second;
+        if (!decoder.decode(second))
+            return false;
+
+        pair.first = first;
+        pair.second = second;
+        return true;
+    }
+};
+
+template&lt;typename Rep, typename Period&gt; struct NetworkCacheCoder&lt;std::chrono::duration&lt;Rep, Period&gt;&gt; {
+    static void encode(NetworkCacheEncoder&amp; encoder, const std::chrono::duration&lt;Rep, Period&gt;&amp; duration)
+    {
+        static_assert(std::is_integral&lt;Rep&gt;::value &amp;&amp; std::is_signed&lt;Rep&gt;::value &amp;&amp; sizeof(Rep) &lt;= sizeof(int64_t), &quot;Serialization of this Rep type is not supported yet. Only signed integer type which can be fit in an int64_t is currently supported.&quot;);
+        encoder &lt;&lt; static_cast&lt;int64_t&gt;(duration.count());
+    }
+
+    static bool decode(NetworkCacheDecoder&amp; decoder, std::chrono::duration&lt;Rep, Period&gt;&amp; result)
+    {
+        int64_t count;
+        if (!decoder.decode(count))
+            return false;
+        result = std::chrono::duration&lt;Rep, Period&gt;(static_cast&lt;Rep&gt;(count));
+        return true;
+    }
+};
+
+template&lt;typename KeyType, typename ValueType&gt; struct NetworkCacheCoder&lt;WTF::KeyValuePair&lt;KeyType, ValueType&gt;&gt; {
+    static void encode(NetworkCacheEncoder&amp; encoder, const WTF::KeyValuePair&lt;KeyType, ValueType&gt;&amp; pair)
+    {
+        encoder &lt;&lt; pair.key &lt;&lt; pair.value;
+    }
+
+    static bool decode(NetworkCacheDecoder&amp; decoder, WTF::KeyValuePair&lt;KeyType, ValueType&gt;&amp; pair)
+    {
+        KeyType key;
+        if (!decoder.decode(key))
+            return false;
+
+        ValueType value;
+        if (!decoder.decode(value))
+            return false;
+
+        pair.key = key;
+        pair.value = value;
+        return true;
+    }
+};
+
+template&lt;bool fixedSizeElements, typename T, size_t inlineCapacity&gt; struct VectorNetworkCacheCoder;
+
+template&lt;typename T, size_t inlineCapacity&gt; struct VectorNetworkCacheCoder&lt;false, T, inlineCapacity&gt; {
+    static void encode(NetworkCacheEncoder&amp; encoder, const Vector&lt;T, inlineCapacity&gt;&amp; vector)
+    {
+        encoder &lt;&lt; static_cast&lt;uint64_t&gt;(vector.size());
+        for (size_t i = 0; i &lt; vector.size(); ++i)
+            encoder &lt;&lt; vector[i];
+    }
+
+    static bool decode(NetworkCacheDecoder&amp; decoder, Vector&lt;T, inlineCapacity&gt;&amp; vector)
+    {
+        uint64_t size;
+        if (!decoder.decode(size))
+            return false;
+
+        Vector&lt;T, inlineCapacity&gt; tmp;
+        for (size_t i = 0; i &lt; size; ++i) {
+            T element;
+            if (!decoder.decode(element))
+                return false;
+            
+            tmp.append(WTF::move(element));
+        }
+
+        tmp.shrinkToFit();
+        vector.swap(tmp);
+        return true;
+    }
+};
+
+template&lt;typename T, size_t inlineCapacity&gt; struct VectorNetworkCacheCoder&lt;true, T, inlineCapacity&gt; {
+    static void encode(NetworkCacheEncoder&amp; encoder, const Vector&lt;T, inlineCapacity&gt;&amp; vector)
+    {
+        encoder &lt;&lt; static_cast&lt;uint64_t&gt;(vector.size());
+        encoder.encodeFixedLengthData(reinterpret_cast&lt;const uint8_t*&gt;(vector.data()), vector.size() * sizeof(T), alignof(T));
+    }
+    
+    static bool decode(NetworkCacheDecoder&amp; decoder, Vector&lt;T, inlineCapacity&gt;&amp; vector)
+    {
+        uint64_t size;
+        if (!decoder.decode(size))
+            return false;
+
+        // Since we know the total size of the elements, we can allocate the vector in
+        // one fell swoop. Before allocating we must however make sure that the decoder buffer
+        // is big enough.
+        if (!decoder.bufferIsLargeEnoughToContain&lt;T&gt;(size)) {
+            decoder.markInvalid();
+            return false;
+        }
+
+        Vector&lt;T, inlineCapacity&gt; temp;
+        temp.resize(size);
+
+        decoder.decodeFixedLengthData(reinterpret_cast&lt;uint8_t*&gt;(temp.data()), size * sizeof(T), alignof(T));
+
+        vector.swap(temp);
+        return true;
+    }
+};
+
+template&lt;typename T, size_t inlineCapacity&gt; struct NetworkCacheCoder&lt;Vector&lt;T, inlineCapacity&gt;&gt; : VectorNetworkCacheCoder&lt;std::is_arithmetic&lt;T&gt;::value, T, inlineCapacity&gt; { };
+
+template&lt;typename KeyArg, typename MappedArg, typename HashArg, typename KeyTraitsArg, typename MappedTraitsArg&gt; struct NetworkCacheCoder&lt;HashMap&lt;KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg&gt;&gt; {
+    typedef HashMap&lt;KeyArg, MappedArg, HashArg, KeyTraitsArg, MappedTraitsArg&gt; HashMapType;
+
+    static void encode(NetworkCacheEncoder&amp; encoder, const HashMapType&amp; hashMap)
+    {
+        encoder &lt;&lt; static_cast&lt;uint64_t&gt;(hashMap.size());
+        for (typename HashMapType::const_iterator it = hashMap.begin(), end = hashMap.end(); it != end; ++it)
+            encoder &lt;&lt; *it;
+    }
+
+    static bool decode(NetworkCacheDecoder&amp; decoder, HashMapType&amp; hashMap)
+    {
+        uint64_t hashMapSize;
+        if (!decoder.decode(hashMapSize))
+            return false;
+
+        HashMapType tempHashMap;
+        for (uint64_t i = 0; i &lt; hashMapSize; ++i) {
+            KeyArg key;
+            MappedArg value;
+            if (!decoder.decode(key))
+                return false;
+            if (!decoder.decode(value))
+                return false;
+
+            if (!tempHashMap.add(key, value).isNewEntry) {
+                // The hash map already has the specified key, bail.
+                decoder.markInvalid();
+                return false;
+            }
+        }
+
+        hashMap.swap(tempHashMap);
+        return true;
+    }
+};
+
+template&lt;typename KeyArg, typename HashArg, typename KeyTraitsArg&gt; struct NetworkCacheCoder&lt;HashSet&lt;KeyArg, HashArg, KeyTraitsArg&gt;&gt; {
+    typedef HashSet&lt;KeyArg, HashArg, KeyTraitsArg&gt; HashSetType;
+
+    static void encode(NetworkCacheEncoder&amp; encoder, const HashSetType&amp; hashSet)
+    {
+        encoder &lt;&lt; static_cast&lt;uint64_t&gt;(hashSet.size());
+        for (typename HashSetType::const_iterator it = hashSet.begin(), end = hashSet.end(); it != end; ++it)
+            encoder &lt;&lt; *it;
+    }
+
+    static bool decode(NetworkCacheDecoder&amp; decoder, HashSetType&amp; hashSet)
+    {
+        uint64_t hashSetSize;
+        if (!decoder.decode(hashSetSize))
+            return false;
+
+        HashSetType tempHashSet;
+        for (uint64_t i = 0; i &lt; hashSetSize; ++i) {
+            KeyArg key;
+            if (!decoder.decode(key))
+                return false;
+
+            if (!tempHashSet.add(key).isNewEntry) {
+                // The hash map already has the specified key, bail.
+                decoder.markInvalid();
+                return false;
+            }
+        }
+
+        hashSet.swap(tempHashSet);
+        return true;
+    }
+};
+
+template&lt;&gt; struct NetworkCacheCoder&lt;AtomicString&gt; {
+    static void encode(NetworkCacheEncoder&amp;, const AtomicString&amp;);
+    static bool decode(NetworkCacheDecoder&amp;, AtomicString&amp;);
+};
+
+template&lt;&gt; struct NetworkCacheCoder&lt;CString&gt; {
+    static void encode(NetworkCacheEncoder&amp;, const CString&amp;);
+    static bool decode(NetworkCacheDecoder&amp;, CString&amp;);
+};
+
+template&lt;&gt; struct NetworkCacheCoder&lt;String&gt; {
+    static void encode(NetworkCacheEncoder&amp;, const String&amp;);
+    static bool decode(NetworkCacheDecoder&amp;, String&amp;);
+};
+
+template&lt;&gt; struct NetworkCacheCoder&lt;WebCore::CertificateInfo&gt; {
+    static void encode(NetworkCacheEncoder&amp;, const WebCore::CertificateInfo&amp;);
+    static bool decode(NetworkCacheDecoder&amp;, WebCore::CertificateInfo&amp;);
+};
+
+}
+
+#endif
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheDecodercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp (0 => 175748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.cpp        2014-11-07 11:29:55 UTC (rev 175748)
</span><span class="lines">@@ -0,0 +1,160 @@
</span><ins>+/*
+ * Copyright (C) 2010, 2011, 2014 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;NetworkCacheDecoder.h&quot;
+
+#if ENABLE(NETWORK_CACHE)
+
+#include &quot;NetworkCacheEncoder.h&quot;
+
+namespace WebKit {
+
+NetworkCacheDecoder::NetworkCacheDecoder(const uint8_t* buffer, size_t bufferSize)
+    : m_buffer(buffer)
+    , m_bufferPos(buffer)
+    , m_bufferEnd(buffer + bufferSize)
+    , m_checksum(0)
+{
+}
+
+NetworkCacheDecoder::~NetworkCacheDecoder()
+{
+}
+
+static inline uint8_t* roundUpToAlignment(const uint8_t* ptr, unsigned alignment)
+{
+    // Assert that the alignment is a power of 2.
+    ASSERT(alignment &amp;&amp; !(alignment &amp; (alignment - 1)));
+
+    uintptr_t alignmentMask = alignment - 1;
+    return reinterpret_cast&lt;uint8_t*&gt;((reinterpret_cast&lt;uintptr_t&gt;(ptr) + alignmentMask) &amp; ~alignmentMask);
+}
+
+static inline bool alignedBufferIsLargeEnoughToContain(const uint8_t* alignedPosition, const uint8_t* bufferEnd, size_t size)
+{
+    return bufferEnd &gt;= alignedPosition &amp;&amp; static_cast&lt;size_t&gt;(bufferEnd - alignedPosition) &gt;= size;
+}
+
+bool NetworkCacheDecoder::alignBufferPosition(unsigned alignment, size_t size)
+{
+    uint8_t* alignedPosition = roundUpToAlignment(m_bufferPos, alignment);
+    if (!alignedBufferIsLargeEnoughToContain(alignedPosition, m_bufferEnd, size)) {
+        // We've walked off the end of this buffer.
+        markInvalid();
+        return false;
+    }
+    
+    m_bufferPos = alignedPosition;
+    return true;
+}
+
+bool NetworkCacheDecoder::bufferIsLargeEnoughToContain(unsigned alignment, size_t size) const
+{
+    return alignedBufferIsLargeEnoughToContain(roundUpToAlignment(m_bufferPos, alignment), m_bufferEnd, size);
+}
+
+bool NetworkCacheDecoder::decodeFixedLengthData(uint8_t* data, size_t size, unsigned alignment)
+{
+    if (!alignBufferPosition(alignment, size))
+        return false;
+
+    memcpy(data, m_bufferPos, size);
+    m_bufferPos += size;
+
+    NetworkCacheEncoder::updateChecksumForData(m_checksum, data, size);
+    return true;
+}
+
+template&lt;typename Type&gt;
+bool NetworkCacheDecoder::decodeNumber(Type&amp; value)
+{
+    if (!alignBufferPosition(sizeof(value), sizeof(value)))
+        return false;
+
+    memcpy(&amp;value, m_bufferPos, sizeof(value));
+    m_bufferPos += sizeof(Type);
+
+    NetworkCacheEncoder::updateChecksumForNumber(m_checksum, value);
+    return true;
+}
+
+bool NetworkCacheDecoder::decode(bool&amp; result)
+{
+    return decodeNumber(result);
+}
+
+bool NetworkCacheDecoder::decode(uint8_t&amp; result)
+{
+    return decodeNumber(result);
+}
+
+bool NetworkCacheDecoder::decode(uint16_t&amp; result)
+{
+    return decodeNumber(result);
+}
+
+bool NetworkCacheDecoder::decode(uint32_t&amp; result)
+{
+    return decodeNumber(result);
+}
+
+bool NetworkCacheDecoder::decode(uint64_t&amp; result)
+{
+    return decodeNumber(result);
+}
+
+bool NetworkCacheDecoder::decode(int32_t&amp; result)
+{
+    return decodeNumber(result);
+}
+
+bool NetworkCacheDecoder::decode(int64_t&amp; result)
+{
+    return decodeNumber(result);
+}
+
+bool NetworkCacheDecoder::decode(float&amp; result)
+{
+    return decodeNumber(result);
+}
+
+bool NetworkCacheDecoder::decode(double&amp; result)
+{
+    return decodeNumber(result);
+}
+
+bool NetworkCacheDecoder::verifyChecksum()
+{
+    unsigned computedChecksum = m_checksum;
+    unsigned decodedChecksum;
+    if (!decodeNumber(decodedChecksum))
+        return false;
+    return computedChecksum == decodedChecksum;
+}
+
+}
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheDecoderh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h (0 => 175748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheDecoder.h        2014-11-07 11:29:55 UTC (rev 175748)
</span><span class="lines">@@ -0,0 +1,104 @@
</span><ins>+/*
+ * Copyright (C) 2014 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 NetworkCacheDecoder_h
+#define NetworkCacheDecoder_h
+
+#if ENABLE(NETWORK_CACHE)
+
+#include &quot;NetworkCacheCoder.h&quot;
+
+namespace WebKit {
+
+class NetworkCacheDecoder {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    NetworkCacheDecoder(const uint8_t* buffer, size_t bufferSize);
+    virtual ~NetworkCacheDecoder();
+
+    size_t length() const { return m_bufferEnd - m_buffer; }
+    size_t currentOffset() const { return m_bufferPos - m_buffer; }
+
+    bool isInvalid() const { return m_bufferPos &gt; m_bufferEnd; }
+    void markInvalid() { m_bufferPos = m_bufferEnd + 1; }
+
+    bool verifyChecksum();
+
+    bool decodeFixedLengthData(uint8_t*, size_t, unsigned alignment);
+
+    bool decode(bool&amp;);
+    bool decode(uint8_t&amp;);
+    bool decode(uint16_t&amp;);
+    bool decode(uint32_t&amp;);
+    bool decode(uint64_t&amp;);
+    bool decode(int32_t&amp;);
+    bool decode(int64_t&amp;);
+    bool decode(float&amp;);
+    bool decode(double&amp;);
+
+    template&lt;typename T&gt; bool decodeEnum(T&amp; result)
+    {
+        static_assert(sizeof(T) &lt;= 8, &quot;Enum type T must not be larger than 64 bits!&quot;);
+
+        uint64_t value;
+        if (!decode(value))
+            return false;
+        
+        result = static_cast&lt;T&gt;(value);
+        return true;
+    }
+
+    template&lt;typename T&gt; bool decode(T&amp; t)
+    {
+        return NetworkCacheCoder&lt;T&gt;::decode(*this, t);
+    }
+
+    template&lt;typename T&gt;
+    bool bufferIsLargeEnoughToContain(size_t numElements) const
+    {
+        static_assert(std::is_arithmetic&lt;T&gt;::value, &quot;Type T must have a fixed, known encoded size!&quot;);
+
+        if (numElements &gt; std::numeric_limits&lt;size_t&gt;::max() / sizeof(T))
+            return false;
+
+        return bufferIsLargeEnoughToContain(alignof(T), numElements * sizeof(T));
+    }
+
+private:
+    bool alignBufferPosition(unsigned alignment, size_t);
+    bool bufferIsLargeEnoughToContain(unsigned alignment, size_t) const;
+    template&lt;typename Type&gt; bool decodeNumber(Type&amp;);
+
+    const uint8_t* m_buffer;
+    const uint8_t* m_bufferPos;
+    const uint8_t* m_bufferEnd;
+
+    unsigned m_checksum;
+};
+
+} 
+
+#endif
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheEncodercpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp (0 => 175748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.cpp        2014-11-07 11:29:55 UTC (rev 175748)
</span><span class="lines">@@ -0,0 +1,136 @@
</span><ins>+/*
+ * Copyright (C) 2010, 2014 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;NetworkCacheEncoder.h&quot;
+
+#if ENABLE(NETWORK_CACHE)
+
+namespace WebKit {
+
+NetworkCacheEncoder::NetworkCacheEncoder()
+    : m_checksum(0)
+{
+}
+
+NetworkCacheEncoder::~NetworkCacheEncoder()
+{
+}
+
+static inline size_t roundUpToAlignment(size_t value, unsigned alignment)
+{
+    return ((value + alignment - 1) / alignment) * alignment;
+}
+
+uint8_t* NetworkCacheEncoder::grow(unsigned alignment, size_t size)
+{
+    size_t alignedSize = roundUpToAlignment(m_buffer.size(), alignment);
+
+    m_buffer.grow(alignedSize + size);
+    
+    return m_buffer.data() + alignedSize;
+}
+
+void NetworkCacheEncoder::updateChecksumForData(unsigned&amp; checksum, const uint8_t* data, size_t size)
+{
+    // FIXME: hashMemory should not require alignment.
+    size_t hashSize = size - size % 2;
+    unsigned hash = StringHasher::hashMemory(data, hashSize) ^ NetworkCacheEncoder::Salt&lt;uint8_t*&gt;::value;
+    checksum = WTF::pairIntHash(checksum, hash);
+}
+
+void NetworkCacheEncoder::encodeFixedLengthData(const uint8_t* data, size_t size, unsigned alignment)
+{
+    ASSERT(!(reinterpret_cast&lt;uintptr_t&gt;(data) % alignment));
+
+    updateChecksumForData(m_checksum, data, size);
+
+    uint8_t* buffer = grow(alignment, size);
+    memcpy(buffer, data, size);
+}
+
+template&lt;typename Type&gt;
+void NetworkCacheEncoder::encodeNumber(Type value)
+{
+    uint8_t* buffer = grow(sizeof(Type), sizeof(Type));
+
+    NetworkCacheEncoder::updateChecksumForNumber(m_checksum, value);
+
+    memcpy(buffer, &amp;value, sizeof(Type));
+}
+
+void NetworkCacheEncoder::encode(bool value)
+{
+    encodeNumber(value);
+}
+
+void NetworkCacheEncoder::encode(uint8_t value)
+{
+    encodeNumber(value);
+}
+
+void NetworkCacheEncoder::encode(uint16_t value)
+{
+    encodeNumber(value);
+}
+
+void NetworkCacheEncoder::encode(uint32_t value)
+{
+    encodeNumber(value);
+}
+
+void NetworkCacheEncoder::encode(uint64_t value)
+{
+    encodeNumber(value);
+}
+
+void NetworkCacheEncoder::encode(int32_t value)
+{
+    encodeNumber(value);
+}
+
+void NetworkCacheEncoder::encode(int64_t value)
+{
+    encodeNumber(value);
+}
+
+void NetworkCacheEncoder::encode(float value)
+{
+    encodeNumber(value);
+}
+
+void NetworkCacheEncoder::encode(double value)
+{
+    encodeNumber(value);
+}
+
+void NetworkCacheEncoder::encodeChecksum()
+{
+    encodeNumber(m_checksum);
+}
+
+}
+
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2NetworkProcesscacheNetworkCacheEncoderh"></a>
<div class="addfile"><h4>Added: trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h (0 => 175748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h                                (rev 0)
+++ trunk/Source/WebKit2/NetworkProcess/cache/NetworkCacheEncoder.h        2014-11-07 11:29:55 UTC (rev 175748)
</span><span class="lines">@@ -0,0 +1,116 @@
</span><ins>+/*
+ * Copyright (C) 2010 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 NetworkCacheEncoder_h
+#define NetworkCacheEncoder_h
+
+#if ENABLE(NETWORK_CACHE)
+
+#include &quot;NetworkCacheCoder.h&quot;
+
+#include &lt;wtf/StringHasher.h&gt;
+#include &lt;wtf/Vector.h&gt;
+
+namespace WebKit {
+
+class NetworkCacheEncoder;
+class DataReference;
+
+class NetworkCacheEncoder {
+    WTF_MAKE_FAST_ALLOCATED;
+public:
+    NetworkCacheEncoder();
+    virtual ~NetworkCacheEncoder();
+
+    void encodeChecksum();
+    void encodeFixedLengthData(const uint8_t*, size_t, unsigned alignment);
+
+    template&lt;typename T&gt; void encodeEnum(T t)
+    {
+        COMPILE_ASSERT(sizeof(T) &lt;= sizeof(uint64_t), enum_type_must_not_be_larger_than_64_bits);
+
+        encode(static_cast&lt;uint64_t&gt;(t));
+    }
+
+    template&lt;typename T&gt; void encode(const T&amp; t)
+    {
+        NetworkCacheCoder&lt;T&gt;::encode(*this, t);
+    }
+
+    template&lt;typename T&gt; NetworkCacheEncoder&amp; operator&lt;&lt;(const T&amp; t)
+    {
+        encode(t);
+        return *this;
+    }
+
+    const uint8_t* buffer() const { return m_buffer.data(); }
+    size_t bufferSize() const { return m_buffer.size(); }
+
+    static void updateChecksumForData(unsigned&amp; checksum, const uint8_t*, size_t);
+    template &lt;typename Type&gt; static void updateChecksumForNumber(unsigned&amp; checksum, Type);
+
+private:
+    void encode(bool);
+    void encode(uint8_t);
+    void encode(uint16_t);
+    void encode(uint32_t);
+    void encode(uint64_t);
+    void encode(int32_t);
+    void encode(int64_t);
+    void encode(float);
+    void encode(double);
+
+    template&lt;typename Type&gt; void encodeNumber(Type);
+
+    uint8_t* grow(unsigned alignment, size_t);
+
+    template &lt;typename Type&gt; struct Salt;
+
+    Vector&lt;uint8_t, 4096&gt; m_buffer;
+    unsigned m_checksum;
+};
+
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;bool&gt; { static const unsigned value = 3; };
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;uint8_t&gt; { static const  unsigned value = 5; };
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;uint16_t&gt; { static const unsigned value = 7; };
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;uint32_t&gt; { static const unsigned value = 11; };
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;uint64_t&gt; { static const unsigned value = 13; };
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;int32_t&gt; { static const unsigned value = 17; };
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;int64_t&gt; { static const unsigned value = 19; };
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;float&gt; { static const unsigned value = 23; };
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;double&gt; { static const unsigned value = 29; };
+template &lt;&gt; struct NetworkCacheEncoder::Salt&lt;uint8_t*&gt; { static const unsigned value = 101; };
+
+template &lt;typename Type&gt;
+void NetworkCacheEncoder::updateChecksumForNumber(unsigned&amp; checksum, Type value)
+{
+    unsigned hash = WTF::intHash(static_cast&lt;uint64_t&gt;(value)) ^ NetworkCacheEncoder::Salt&lt;Type&gt;::value;
+    checksum = WTF::pairIntHash(checksum, hash);
+}
+
+}
+
+#endif
+#endif
</ins></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (175747 => 175748)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2014-11-07 11:28:53 UTC (rev 175747)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2014-11-07 11:29:55 UTC (rev 175748)
</span><span class="lines">@@ -1652,6 +1652,13 @@
</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>+                E489D28A1A0A2DB80078C06A /* NetworkCacheCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E489D2831A0A2DB80078C06A /* NetworkCacheCoder.h */; };
+                E489D28B1A0A2DB80078C06A /* NetworkCacheCoders.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E489D2841A0A2DB80078C06A /* NetworkCacheCoders.cpp */; };
+                E489D28C1A0A2DB80078C06A /* NetworkCacheCoders.h in Headers */ = {isa = PBXBuildFile; fileRef = E489D2851A0A2DB80078C06A /* NetworkCacheCoders.h */; };
+                E489D28D1A0A2DB80078C06A /* NetworkCacheDecoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E489D2861A0A2DB80078C06A /* NetworkCacheDecoder.cpp */; };
+                E489D28E1A0A2DB80078C06A /* NetworkCacheDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E489D2871A0A2DB80078C06A /* NetworkCacheDecoder.h */; };
+                E489D28F1A0A2DB80078C06A /* NetworkCacheEncoder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E489D2881A0A2DB80078C06A /* NetworkCacheEncoder.cpp */; };
+                E489D2901A0A2DB80078C06A /* NetworkCacheEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = E489D2891A0A2DB80078C06A /* NetworkCacheEncoder.h */; };
</ins><span class="cx">                 ED82A7F2128C6FAF004477B3 /* WKBundlePageOverlay.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A22F0FF1289FCD90085E74F /* WKBundlePageOverlay.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 EDCA71B7128DDA8C00201B26 /* WKBundlePageOverlay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A22F1001289FCD90085E74F /* WKBundlePageOverlay.cpp */; };
</span><span class="cx">                 F036978815F4BF0500C3A80E /* WebColorPicker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F036978715F4BF0500C3A80E /* WebColorPicker.cpp */; };
</span><span class="lines">@@ -3752,6 +3759,13 @@
</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>+                E489D2831A0A2DB80078C06A /* NetworkCacheCoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheCoder.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E489D2841A0A2DB80078C06A /* NetworkCacheCoders.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheCoders.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E489D2851A0A2DB80078C06A /* NetworkCacheCoders.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheCoders.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E489D2861A0A2DB80078C06A /* NetworkCacheDecoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheDecoder.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E489D2871A0A2DB80078C06A /* NetworkCacheDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheDecoder.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E489D2881A0A2DB80078C06A /* NetworkCacheEncoder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = NetworkCacheEncoder.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                E489D2891A0A2DB80078C06A /* NetworkCacheEncoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NetworkCacheEncoder.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 F036978715F4BF0500C3A80E /* WebColorPicker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebColorPicker.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 F6113E24126CE1820057D0A7 /* WebUserContentURLPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebUserContentURLPattern.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 F6113E26126CE19B0057D0A7 /* WKUserContentURLPattern.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKUserContentURLPattern.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -5182,6 +5196,7 @@
</span><span class="cx">                 510CC7DA16138E0100D03ED3 /* NetworkProcess */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><ins>+                                E489D2821A0A2BE80078C06A /* cache */,
</ins><span class="cx">                                 7EC4F0F818E4A922008056AF /* cocoa */,
</span><span class="cx">                                 2DA944BB188511DD00ED86DB /* ios */,
</span><span class="cx">                                 BC82837C16B45DA500A278FE /* EntryPoint */,
</span><span class="lines">@@ -7004,6 +7019,21 @@
</span><span class="cx">                         path = ios;
</span><span class="cx">                         sourceTree = &quot;&lt;group&gt;&quot;;
</span><span class="cx">                 };
</span><ins>+                E489D2821A0A2BE80078C06A /* cache */ = {
+                        isa = PBXGroup;
+                        children = (
+                                E489D2831A0A2DB80078C06A /* NetworkCacheCoder.h */,
+                                E489D2841A0A2DB80078C06A /* NetworkCacheCoders.cpp */,
+                                E489D2851A0A2DB80078C06A /* NetworkCacheCoders.h */,
+                                E489D2861A0A2DB80078C06A /* NetworkCacheDecoder.cpp */,
+                                E489D2871A0A2DB80078C06A /* NetworkCacheDecoder.h */,
+                                E489D2881A0A2DB80078C06A /* NetworkCacheEncoder.cpp */,
+                                E489D2891A0A2DB80078C06A /* NetworkCacheEncoder.h */,
+                        );
+                        name = cache;
+                        path = NetworkProcess/cache;
+                        sourceTree = &quot;&lt;group&gt;&quot;;
+                };
</ins><span class="cx">                 F638955A133BF57D008941D5 /* mac */ = {
</span><span class="cx">                         isa = PBXGroup;
</span><span class="cx">                         children = (
</span><span class="lines">@@ -7109,6 +7139,7 @@
</span><span class="cx">                                 293EBEAB1627D9C9005F89F1 /* WKDOMText.h in Headers */,
</span><span class="cx">                                 BC017D2116263308007054F5 /* WKDOMTextIterator.h in Headers */,
</span><span class="cx">                                 37DFA7001810BB92001F4A9F /* WKFoundation.h in Headers */,
</span><ins>+                                E489D28E1A0A2DB80078C06A /* NetworkCacheDecoder.h in Headers */,
</ins><span class="cx">                                 1ABC3DF11899C6B6004F0626 /* WKNavigationInternal.h in Headers */,
</span><span class="cx">                                 0F0C365A18C0555800F607D7 /* LayerRepresentation.h in Headers */,
</span><span class="cx">                                 1F604BA81889FA7400EE0395 /* WKRenderingProgressEvents.h in Headers */,
</span><span class="lines">@@ -7243,6 +7274,7 @@
</span><span class="cx">                                 BCB0AEE9122F53E300B1341E /* MutableDictionary.h in Headers */,
</span><span class="cx">                                 1A6FBA2A11E6862700DB1371 /* NetscapeBrowserFuncs.h in Headers */,
</span><span class="cx">                                 1A6FBD2811E69BC200DB1371 /* NetscapePlugin.h in Headers */,
</span><ins>+                                E489D28C1A0A2DB80078C06A /* NetworkCacheCoders.h in Headers */,
</ins><span class="cx">                                 A1C512C9190656E500448914 /* WebQuickLookHandleClient.h in Headers */,
</span><span class="cx">                                 1A4A9C5612B816CF008FE984 /* NetscapePluginModule.h in Headers */,
</span><span class="cx">                                 1AA5889211EE70400061B882 /* NetscapePluginStream.h in Headers */,
</span><span class="lines">@@ -7441,6 +7473,7 @@
</span><span class="cx">                                 BCDE059B11CDA8AE00E41AF1 /* WebContextInjectedBundleClient.h in Headers */,
</span><span class="cx">                                 1A6509CE18B4146200614332 /* WKProcessPoolPrivate.h in Headers */,
</span><span class="cx">                                 51871B5C127CB89D00F76232 /* WebContextMenu.h in Headers */,
</span><ins>+                                E489D2901A0A2DB80078C06A /* NetworkCacheEncoder.h in Headers */,
</ins><span class="cx">                                 BC032D7710F4378D0058C15A /* WebContextMenuClient.h in Headers */,
</span><span class="cx">                                 75E749EC180DBB9800088BA6 /* WebOriginDataManagerProxyMessages.h in Headers */,
</span><span class="cx">                                 512935D81288D19400A4B695 /* WebContextMenuItem.h in Headers */,
</span><span class="lines">@@ -7450,6 +7483,7 @@
</span><span class="cx">                                 51ACBB82127A8BAD00D203B9 /* WebContextMenuProxy.h in Headers */,
</span><span class="cx">                                 1AB8A1F418400B8F00E9AE69 /* WKPageFindClient.h in Headers */,
</span><span class="cx">                                 75E749EA180DBB9800088BA6 /* WebOriginDataManagerMessages.h in Headers */,
</span><ins>+                                E489D28A1A0A2DB80078C06A /* NetworkCacheCoder.h in Headers */,
</ins><span class="cx">                                 37A64E5518F38E3C00EB30F1 /* _WKFormDelegate.h in Headers */,
</span><span class="cx">                                 51ACBBA0127A8F2C00D203B9 /* WebContextMenuProxyMac.h in Headers */,
</span><span class="cx">                                 BCCB75C61203A1CE00222D1B /* WebContextMessageKinds.h in Headers */,
</span><span class="lines">@@ -8851,6 +8885,7 @@
</span><span class="cx">                                 2684054C18B86C350022C38B /* VisibleContentRectUpdateInfo.cpp in Sources */,
</span><span class="cx">                                 BC4BEEAC120A0A5F00FBA0C7 /* InjectedBundleNodeHandle.cpp in Sources */,
</span><span class="cx">                                 512935E31288D97800A4B695 /* InjectedBundlePageContextMenuClient.cpp in Sources */,
</span><ins>+                                E489D28B1A0A2DB80078C06A /* NetworkCacheCoders.cpp in Sources */,
</ins><span class="cx">                                 CD67D30E15C08F9A00843ADF /* InjectedBundlePageDiagnosticLoggingClient.cpp in Sources */,
</span><span class="cx">                                 E1EE53E711F8CFFB00CCBEE4 /* InjectedBundlePageEditorClient.cpp in Sources */,
</span><span class="cx">                                 BC14E109120B905E00826C0C /* InjectedBundlePageFormClient.cpp in Sources */,
</span><span class="lines">@@ -8965,7 +9000,9 @@
</span><span class="cx">                                 CEDBA84719FDA00A006866A5 /* WebSQLiteDatabaseTracker.cpp in Sources */,
</span><span class="cx">                                 31A67E0C165B2A99006CBA66 /* PlugInAutoStartProvider.cpp in Sources */,
</span><span class="cx">                                 1A8EF4CC1252403700F7067F /* PluginControllerProxy.cpp in Sources */,
</span><ins>+                                E489D28D1A0A2DB80078C06A /* NetworkCacheDecoder.cpp in Sources */,
</ins><span class="cx">                                 1A2D91A61281D739001EB962 /* PluginControllerProxyMac.mm in Sources */,
</span><ins>+                                E489D28F1A0A2DB80078C06A /* NetworkCacheEncoder.cpp in Sources */,
</ins><span class="cx">                                 1A8EF96E1252AF6B00F7067F /* PluginControllerProxyMessageReceiver.cpp in Sources */,
</span><span class="cx">                                 1A17977F137EE82C00F97D45 /* PluginCreationParameters.cpp in Sources */,
</span><span class="cx">                                 C55CB5B718C269CF00CA81E1 /* WKFormSelectPopover.mm in Sources */,
</span></span></pre>
</div>
</div>

</body>
</html>