<!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>[162566] trunk/Source</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/162566">162566</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2014-01-22 15:48:27 -0800 (Wed, 22 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>IDB: &quot;Put&quot; support
&lt;rdar://problem/15779643&gt; and https://bugs.webkit.org/show_bug.cgi?id=127401

Reviewed by Alexey Proskuryakov.

Source/WebCore:

Add persistent encode/decode for storage to the database:
* Modules/indexeddb/IDBKey.cpp:
(WebCore::IDBKey::encode):
(WebCore::IDBKey::decode):
* Modules/indexeddb/IDBKey.h:

Add a data class to represent IDBKey suitable for crossing IPC:
* Modules/indexeddb/IDBKeyData.cpp: Added.
(WebCore::IDBKeyData::IDBKeyData):
(WebCore::IDBKeyData::maybeCreateIDBKey):
(WebCore::IDBKeyData::isolatedCopy):
* Modules/indexeddb/IDBKeyData.h: Added.
(WebCore::IDBKeyData::IDBKeyData):

* platform/CrossThreadCopier.cpp:
(WebCore::IDBKeyData&gt;::copy):
* platform/CrossThreadCopier.h:

* WebCore.exp.in:
* WebCore.xcodeproj/project.pbxproj:

Source/WebKit2:

Ship putRecord requests over to the DatabaseProcess, and listen for completion from the DatabaseProcess:
* WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp:
(WebKit::WebIDBServerConnection::put):
(WebKit::WebIDBServerConnection::didPutRecord):
* WebProcess/Databases/IndexedDB/WebIDBServerConnection.h:
* WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in:

Pass off the putRecord request to the Unique IDBDatabase:
* DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp:
(WebKit::DatabaseProcessIDBConnection::putRecord):
* DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h:
* DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in:

Pass off the putRecord request to the backing store:
* DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp:
(WebKit::UniqueIDBDatabase::putRecord):
(WebKit::UniqueIDBDatabase::putRecordInBackingStore):
(WebKit::UniqueIDBDatabase::didPutRecordInBackingStore):
* DatabaseProcess/IndexedDB/UniqueIDBDatabase.h:

Add backing store methods related to putRecord, though only one is critical right now:
* DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h:
* DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp:
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::createAndPopulateInitialMetadata):
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::generateKey):
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::keyExistsInObjectStore):
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::putRecord):
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::updateKeyGenerator):
* DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h:

Add the IDBKeyData type to IPC:
* Scripts/webkit2/messages.py:
(struct_or_class):

* Shared/WebCoreArgumentCoders.cpp:
(IPC::ArgumentCoder&lt;IDBKeyData&gt;::encode):
(IPC::ArgumentCoder&lt;IDBKeyData&gt;::decode):
* Shared/WebCoreArgumentCoders.h:

* DatabaseProcess/IndexedDB/IDBSerialization.cpp:
(WebKit::serializeIDBKey):
* DatabaseProcess/IndexedDB/IDBSerialization.h:

Implement more cross-thread copying:
* Shared/WebCrossThreadCopier.cpp:
(WebCore::Vector&lt;uint8_t&gt;&gt;::copy):
(WebCore::Vector&lt;Vector&lt;IDBKeyData&gt;&gt;&gt;::copy):
(WebCore::ASCIILiteral&gt;::copy):
* Shared/WebCrossThreadCopier.h:

Implement more numbers of generic AsyncTask templates:
* Shared/AsyncTask.h:
(WebKit::createAsyncTask):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreCMakeListstxt">trunk/Source/WebCore/CMakeLists.txt</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreGNUmakefilelistam">trunk/Source/WebCore/GNUmakefile.list.am</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBKeycpp">trunk/Source/WebCore/Modules/indexeddb/IDBKey.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBKeyh">trunk/Source/WebCore/Modules/indexeddb/IDBKey.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBTransactionBackendOperationscpp">trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendOperations.cpp</a></li>
<li><a href="#trunkSourceWebCoreWebCoreexpin">trunk/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#trunkSourceWebCoreWebCorevcxprojWebCorevcxproj">trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj</a></li>
<li><a href="#trunkSourceWebCoreWebCorexcodeprojprojectpbxproj">trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj</a></li>
<li><a href="#trunkSourceWebCoreplatformCrossThreadCopiercpp">trunk/Source/WebCore/platform/CrossThreadCopier.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformCrossThreadCopierh">trunk/Source/WebCore/platform/CrossThreadCopier.h</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBDatabaseProcessIDBConnectioncpp">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBDatabaseProcessIDBConnectionh">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBDatabaseProcessIDBConnectionmessagesin">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBIDBSerializationcpp">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.cpp</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBIDBSerializationh">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.h</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabasecpp">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabaseh">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.h</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabaseBackingStoreh">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBsqliteUniqueIDBDatabaseBackingStoreSQLitecpp">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBsqliteUniqueIDBDatabaseBackingStoreSQLiteh">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h</a></li>
<li><a href="#trunkSourceWebKit2Scriptswebkit2messagespy">trunk/Source/WebKit2/Scripts/webkit2/messages.py</a></li>
<li><a href="#trunkSourceWebKit2SharedAsyncTaskh">trunk/Source/WebKit2/Shared/AsyncTask.h</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCoreArgumentCoderscpp">trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCoreArgumentCodersh">trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCrossThreadCopiercpp">trunk/Source/WebKit2/Shared/WebCrossThreadCopier.cpp</a></li>
<li><a href="#trunkSourceWebKit2SharedWebCrossThreadCopierh">trunk/Source/WebKit2/Shared/WebCrossThreadCopier.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessDatabasesIndexedDBWebIDBServerConnectioncpp">trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp</a></li>
<li><a href="#trunkSourceWebKit2WebProcessDatabasesIndexedDBWebIDBServerConnectionh">trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.h</a></li>
<li><a href="#trunkSourceWebKit2WebProcessDatabasesIndexedDBWebIDBServerConnectionmessagesin">trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBKeyDatacpp">trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBKeyDatah">trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreCMakeListstxt"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/CMakeLists.txt (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/CMakeLists.txt        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/CMakeLists.txt        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -811,6 +811,7 @@
</span><span class="cx">     Modules/indexeddb/IDBFactoryBackendInterface.cpp
</span><span class="cx">     Modules/indexeddb/IDBIndex.cpp
</span><span class="cx">     Modules/indexeddb/IDBKey.cpp
</span><ins>+    Modules/indexeddb/IDBKeyData.cpp
</ins><span class="cx">     Modules/indexeddb/IDBKeyPath.cpp
</span><span class="cx">     Modules/indexeddb/IDBKeyRange.cpp
</span><span class="cx">     Modules/indexeddb/IDBObjectStore.cpp
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/ChangeLog        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -1,3 +1,31 @@
</span><ins>+2014-01-21  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IDB: &quot;Put&quot; support
+        &lt;rdar://problem/15779643&gt; and https://bugs.webkit.org/show_bug.cgi?id=127401
+
+        Reviewed by Alexey Proskuryakov.
+
+        Add persistent encode/decode for storage to the database:
+        * Modules/indexeddb/IDBKey.cpp:
+        (WebCore::IDBKey::encode):
+        (WebCore::IDBKey::decode):
+        * Modules/indexeddb/IDBKey.h:
+
+        Add a data class to represent IDBKey suitable for crossing IPC:
+        * Modules/indexeddb/IDBKeyData.cpp: Added.
+        (WebCore::IDBKeyData::IDBKeyData):
+        (WebCore::IDBKeyData::maybeCreateIDBKey):
+        (WebCore::IDBKeyData::isolatedCopy):
+        * Modules/indexeddb/IDBKeyData.h: Added.
+        (WebCore::IDBKeyData::IDBKeyData):
+
+        * platform/CrossThreadCopier.cpp:
+        (WebCore::IDBKeyData&gt;::copy):
+        * platform/CrossThreadCopier.h:
+
+        * WebCore.exp.in:
+        * WebCore.xcodeproj/project.pbxproj:
+
</ins><span class="cx"> 2014-01-22  Dean Jackson  &lt;dino@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [WebGL] Implement ANGLE_instanced_arrays
</span></span></pre></div>
<a id="trunkSourceWebCoreGNUmakefilelistam"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/GNUmakefile.list.am (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/GNUmakefile.list.am        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/GNUmakefile.list.am        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -25,7 +25,7 @@
</span><span class="cx">         DerivedSources/WebCore/InspectorWebBackendDispatchers.cpp \
</span><span class="cx">         DerivedSources/WebCore/InspectorWebBackendDispatchers.h \
</span><span class="cx">         DerivedSources/WebCore/InspectorWebFrontendDispatchers.cpp \
</span><del>-        DerivedSources/WebCore/InspectorWebFrontendDispatchers.h \
</del><ins>+        DerivedSources/WebCore/InspectorWebFrontendDispatchers.h \    
</ins><span class="cx">         DerivedSources/WebCore/InspectorWebTypeBuilders.cpp \
</span><span class="cx">         DerivedSources/WebCore/InspectorWebTypeBuilders.h \
</span><span class="cx">         DerivedSources/WebCore/JSANGLEInstancedArrays.cpp \
</span><span class="lines">@@ -1845,6 +1845,8 @@
</span><span class="cx">         Source/WebCore/Modules/indexeddb/IDBIndex.h \
</span><span class="cx">         Source/WebCore/Modules/indexeddb/IDBKey.cpp \
</span><span class="cx">         Source/WebCore/Modules/indexeddb/IDBKey.h \
</span><ins>+        Source/WebCore/Modules/indexeddb/IDBKeyData.cpp \
+        Source/WebCore/Modules/indexeddb/IDBKeyData.h \
</ins><span class="cx">         Source/WebCore/Modules/indexeddb/IDBKeyPath.cpp \
</span><span class="cx">         Source/WebCore/Modules/indexeddb/IDBKeyPath.h \
</span><span class="cx">         Source/WebCore/Modules/indexeddb/IDBKeyRange.cpp \
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBKeycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBKey.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBKey.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBKey.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -28,6 +28,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><ins>+#include &quot;KeyedCoding.h&quot;
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> IDBKey::~IDBKey()
</span><span class="lines">@@ -96,6 +98,41 @@
</span><span class="cx">     return !compare(other);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void IDBKey::encode(KeyedEncoder&amp; encoder) const
+{
+    encoder.encodeEnum(&quot;type&quot;, m_type);
+
+    switch (m_type) {
+    case InvalidType:
+        return;
+    case ArrayType:
+        encoder.encodeObjects(&quot;array&quot;, m_array.begin(), m_array.end(), [](WebCore::KeyedEncoder&amp; encoder, const RefPtr&lt;IDBKey&gt;&amp; key) {
+            encoder.encodeObject(&quot;idbKey&quot;, *key, [](KeyedEncoder&amp; encoder, const IDBKey&amp; key) {
+                key.encode(encoder);
+            });
+        });
+        return;
+    case StringType:
+        encoder.encodeString(&quot;string&quot;, m_string);
+        return;
+    case DateType:
+    case NumberType:
+        encoder.encodeDouble(&quot;number&quot;, m_number);
+        return;
+    case MinType:
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
+    ASSERT_NOT_REACHED();
+}
+
+bool IDBKey::decode(KeyedDecoder&amp;, IDBKey&amp;)
+{
+    // FIXME: Implement when IDB Get support is implemented (&lt;rdar://problem/15779644&gt;)
+    return false;
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBKeyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBKey.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBKey.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBKey.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -35,6 +35,9 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><ins>+class KeyedDecoder;
+class KeyedEncoder;
+
</ins><span class="cx"> class IDBKey : public RefCounted&lt;IDBKey&gt; {
</span><span class="cx"> public:
</span><span class="cx">     typedef Vector&lt;RefPtr&lt;IDBKey&gt;&gt; KeyArray;
</span><span class="lines">@@ -147,6 +150,9 @@
</span><span class="cx">     using RefCounted&lt;IDBKey&gt;::ref;
</span><span class="cx">     using RefCounted&lt;IDBKey&gt;::deref;
</span><span class="cx"> 
</span><ins>+    void encode(KeyedEncoder&amp;) const;
+    static bool decode(KeyedDecoder&amp;, IDBKey&amp;);
+
</ins><span class="cx"> private:
</span><span class="cx">     IDBKey() : m_type(InvalidType), m_number(0), m_sizeEstimate(OverheadSize) { }
</span><span class="cx">     IDBKey(Type type, double number) : m_type(type), m_number(number), m_sizeEstimate(OverheadSize + sizeof(double)) { }
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBKeyDatacpp"></a>
<div class="addfile"><h4>Added: trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp (0 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp                                (rev 0)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -0,0 +1,131 @@
</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.
+ */
+
+#include &quot;config.h&quot;
+#include &quot;IDBKeyData.h&quot;
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+IDBKeyData::IDBKeyData(IDBKey* key)
+    : type(IDBKey::InvalidType)
+    , numberValue(0)
+    , isNull(false)
+{
+    if (!key) {
+        isNull = true;
+        return;
+    }
+
+    type = key-&gt;type();
+    numberValue = 0;
+
+    switch (type) {
+    case IDBKey::InvalidType:
+        break;
+    case IDBKey::ArrayType:
+        for (auto key2 : key-&gt;array())
+            arrayValue.append(IDBKeyData(key2.get()));
+        break;
+    case IDBKey::StringType:
+        stringValue = key-&gt;string();
+        break;
+    case IDBKey::DateType:
+        numberValue = key-&gt;date();
+        break;
+    case IDBKey::NumberType:
+        numberValue = key-&gt;number();
+        break;
+    case IDBKey::MinType:
+        ASSERT_NOT_REACHED();
+        break;
+    }
+}
+
+PassRefPtr&lt;IDBKey&gt; IDBKeyData::maybeCreateIDBKey() const
+{
+    if (isNull)
+        return nullptr;
+
+    switch (type) {
+    case IDBKey::InvalidType:
+        return IDBKey::createInvalid();
+    case IDBKey::ArrayType:
+        {
+            IDBKey::KeyArray array;
+            for (auto keyData : arrayValue) {
+                array.append(keyData.maybeCreateIDBKey());
+                ASSERT(array.last());
+            }
+            return IDBKey::createArray(array);
+        }
+    case IDBKey::StringType:
+        return IDBKey::createString(stringValue);
+    case IDBKey::DateType:
+        return IDBKey::createDate(numberValue);
+    case IDBKey::NumberType:
+        return IDBKey::createNumber(numberValue);
+    case IDBKey::MinType:
+        ASSERT_NOT_REACHED();
+        return nullptr;
+    }
+
+    ASSERT_NOT_REACHED();
+    return nullptr;
+}
+
+IDBKeyData IDBKeyData::isolatedCopy() const
+{
+    IDBKeyData result;
+    result.type = type;
+    result.isNull = isNull;
+
+    switch (type) {
+    case IDBKey::InvalidType:
+        return result;
+    case IDBKey::ArrayType:
+        for (auto key : arrayValue)
+            result.arrayValue.append(key.isolatedCopy());
+        return result;
+    case IDBKey::StringType:
+        result.stringValue = stringValue.isolatedCopy();
+        return result;
+    case IDBKey::DateType:
+    case IDBKey::NumberType:
+        result.numberValue = numberValue;
+        return result;
+    case IDBKey::MinType:
+        ASSERT_NOT_REACHED();
+        return result;
+    }
+
+    ASSERT_NOT_REACHED();
+    return result;
+}
+
+}
+
+#endif // ENABLE(INDEXED_DATABASE)
</ins></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBKeyDatahfromrev162565trunkSourceWebKit2DatabaseProcessIndexedDBIDBSerializationh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.h (from rev 162565, trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.h) (0 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.h                                (rev 0)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -0,0 +1,59 @@
</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 IDBKeyData_h
+#define IDBKeyData_h
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include &quot;IDBKey.h&quot;
+
+namespace WebCore {
+
+struct IDBKeyData {
+    IDBKeyData()
+        : type(IDBKey::InvalidType)
+        , numberValue(0)
+        , isNull(true)
+    {
+    }
+
+    IDBKeyData(IDBKey*);
+
+    PassRefPtr&lt;IDBKey&gt; maybeCreateIDBKey() const;
+
+    IDBKeyData isolatedCopy() const;
+
+    IDBKey::Type type;
+    Vector&lt;IDBKeyData&gt; arrayValue;
+    String stringValue;
+    double numberValue;
+    bool isNull;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
+#endif // IDBKeyData_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBTransactionBackendOperationscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendOperations.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendOperations.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendOperations.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -106,7 +106,8 @@
</span><span class="cx">     RefPtr&lt;PutOperation&gt; operation(this);
</span><span class="cx">     STANDARD_DATABASE_ERROR_CALLBACK;
</span><span class="cx"> 
</span><del>-    m_transaction-&gt;database().serverConnection().put(*m_transaction, *this, [this, operation, operationCallback](PassRefPtr&lt;IDBKey&gt; key, PassRefPtr&lt;IDBDatabaseError&gt; error) {
</del><ins>+    m_transaction-&gt;database().serverConnection().put(*m_transaction, *this, [this, operation, operationCallback](PassRefPtr&lt;IDBKey&gt; key, PassRefPtr&lt;IDBDatabaseError&gt; prpError) {
+        RefPtr&lt;IDBDatabaseError&gt; error = prpError;
</ins><span class="cx">         if (key) {
</span><span class="cx">             ASSERT(!error);
</span><span class="cx">             m_callbacks-&gt;onSuccess(key);
</span><span class="lines">@@ -114,6 +115,7 @@
</span><span class="cx">             ASSERT(error);
</span><span class="cx">             m_callbacks-&gt;onError(error);
</span><span class="cx">         }
</span><ins>+        operationCallback(error.release());
</ins><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/WebCore.exp.in        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -3077,13 +3077,19 @@
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><ins>+__ZNK7WebCore10IDBKeyData17maybeCreateIDBKeyEv
</ins><span class="cx"> __ZNK7WebCore10IDBKeyPath6encodeERNS_12KeyedEncoderE
</span><ins>+__ZNK7WebCore6IDBKey6encodeERNS_12KeyedEncoderE
+__ZNK7WebCore6IDBKey7isValidEv
+__ZN7WebCore10IDBKeyDataC1EPNS_6IDBKeyE
</ins><span class="cx"> __ZN7WebCore10IDBKeyPathC1ERKN3WTF6StringE
</span><span class="cx"> __ZN7WebCore10IDBKeyPathC1ERKN3WTF6VectorINS1_6StringELm0ENS1_15CrashOnOverflowEEE
</span><span class="cx"> __ZN7WebCore10IDBKeyPath6decodeERNS_12KeyedDecoderERS0_
</span><span class="cx"> __ZN7WebCore18IDBDatabaseBackend14openConnectionEN3WTF10PassRefPtrINS_12IDBCallbacksEEENS2_INS_20IDBDatabaseCallbacksEEExy
</span><span class="cx"> __ZN7WebCore18IDBDatabaseBackend6createERKN3WTF6StringES4_PNS_26IDBFactoryBackendInterfaceERNS_19IDBServerConnectionE
</span><span class="cx"> __ZN7WebCore18IDBDatabaseBackendD1Ev
</span><ins>+__ZN7WebCore21CrossThreadCopierBaseILb0ELb0ENS_10IDBKeyDataEE4copyERKS1_
</ins><span class="cx"> __ZN7WebCore21CrossThreadCopierBaseILb0ELb0ENS_22IDBObjectStoreMetadataEE4copyERKS1_
</span><span class="cx"> __ZN7WebCore21CrossThreadCopierBaseILb0ELb0ENS_9IndexedDB15TransactionModeEE4copyERKS2_
</span><ins>+__ZN7WebCore6IDBKeyD1Ev
</ins><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorevcxprojWebCorevcxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/WebCore.vcxproj/WebCore.vcxproj        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -6614,6 +6614,7 @@
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Modules\indexeddb\IDBFactoryBackendInterface.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Modules\indexeddb\IDBIndex.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Modules\indexeddb\IDBKey.cpp&quot; /&gt;
</span><ins>+    &lt;ClCompile Include=&quot;..\Modules\indexeddb\IDBKeyData.cpp&quot; /&gt;
</ins><span class="cx">     &lt;ClCompile Include=&quot;..\Modules\indexeddb\IDBKeyRange.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Modules\indexeddb\IDBObjectStore.cpp&quot; /&gt;
</span><span class="cx">     &lt;ClCompile Include=&quot;..\Modules\indexeddb\IDBRequest.cpp&quot; /&gt;
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -1779,6 +1779,8 @@
</span><span class="cx">                 510D4A38103165EE0049EA54 /* SocketStreamHandleClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 510D4A32103165EE0049EA54 /* SocketStreamHandleClient.h */; };
</span><span class="cx">                 5112935F3D54B4B52FAF973F /* InspectorHeapProfilerAgent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 511293613D6DB4B52FAF973F /* InspectorHeapProfilerAgent.cpp */; };
</span><span class="cx">                 511293603D60B4B52FAF973F /* InspectorHeapProfilerAgent.h in Headers */ = {isa = PBXBuildFile; fileRef = 511293623D85B4B52FAF973F /* InspectorHeapProfilerAgent.h */; };
</span><ins>+                511EC1A6188DACA400BA3EB6 /* IDBKeyData.h in Headers */ = {isa = PBXBuildFile; fileRef = 511EC1A5188DACA400BA3EB6 /* IDBKeyData.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                511EC1A8188DAE7B00BA3EB6 /* IDBKeyData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 511EC1A7188DAE7B00BA3EB6 /* IDBKeyData.cpp */; };
</ins><span class="cx">                 511EF2C017F0FD3500E4FA16 /* JSIDBAny.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 511EF2A817F0FC4800E4FA16 /* JSIDBAny.cpp */; };
</span><span class="cx">                 511EF2C117F0FD3500E4FA16 /* JSIDBCursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 511EF2A917F0FC4800E4FA16 /* JSIDBCursor.cpp */; };
</span><span class="cx">                 511EF2C217F0FD3500E4FA16 /* JSIDBCursorWithValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 511EF2AA17F0FC4800E4FA16 /* JSIDBCursorWithValue.cpp */; };
</span><span class="lines">@@ -8730,6 +8732,8 @@
</span><span class="cx">                 510D4A32103165EE0049EA54 /* SocketStreamHandleClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocketStreamHandleClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 511293613D6DB4B52FAF973F /* InspectorHeapProfilerAgent.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = InspectorHeapProfilerAgent.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 511293623D85B4B52FAF973F /* InspectorHeapProfilerAgent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InspectorHeapProfilerAgent.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                511EC1A5188DACA400BA3EB6 /* IDBKeyData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBKeyData.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                511EC1A7188DAE7B00BA3EB6 /* IDBKeyData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBKeyData.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 511EF2A817F0FC4800E4FA16 /* JSIDBAny.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSIDBAny.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 511EF2A917F0FC4800E4FA16 /* JSIDBCursor.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSIDBCursor.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 511EF2AA17F0FC4800E4FA16 /* JSIDBCursorWithValue.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSIDBCursorWithValue.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -17704,6 +17708,8 @@
</span><span class="cx">                                 51ABB5B6186D0ED1008391A1 /* IDBIndexMetadata.h */,
</span><span class="cx">                                 51D71991181106E00016DC51 /* IDBKey.cpp */,
</span><span class="cx">                                 51D71992181106E00016DC51 /* IDBKey.h */,
</span><ins>+                                511EC1A7188DAE7B00BA3EB6 /* IDBKeyData.cpp */,
+                                511EC1A5188DACA400BA3EB6 /* IDBKeyData.h */,
</ins><span class="cx">                                 51D71993181106E00016DC51 /* IDBKeyPath.cpp */,
</span><span class="cx">                                 51D71994181106E00016DC51 /* IDBKeyPath.h */,
</span><span class="cx">                                 51D71995181106E00016DC51 /* IDBKeyRange.cpp */,
</span><span class="lines">@@ -24001,6 +24007,7 @@
</span><span class="cx">                                 CD8B5A49180E138B008B8E65 /* TextTrackMediaSource.h in Headers */,
</span><span class="cx">                                 A8EA7CAF0A192B9C00A8EF5F /* HTMLHRElement.h in Headers */,
</span><span class="cx">                                 A871DE270A152AC800B12A68 /* HTMLHtmlElement.h in Headers */,
</span><ins>+                                511EC1A6188DACA400BA3EB6 /* IDBKeyData.h in Headers */,
</ins><span class="cx">                                 07969DB417D14151007FF842 /* JSRTCPeerConnectionErrorCallback.h in Headers */,
</span><span class="cx">                                 A871DE2A0A152AC800B12A68 /* HTMLIFrameElement.h in Headers */,
</span><span class="cx">                                 A8EA7D2D0A19385500A8EF5F /* HTMLImageElement.h in Headers */,
</span><span class="lines">@@ -28813,6 +28820,7 @@
</span><span class="cx">                                 51771C8E182DB4B7008E781E /* IDBDatabaseBackend.cpp in Sources */,
</span><span class="cx">                                 1A22464B0CC98DDB00C05240 /* SQLiteStatement.cpp in Sources */,
</span><span class="cx">                                 1A22464D0CC98DDB00C05240 /* SQLiteTransaction.cpp in Sources */,
</span><ins>+                                511EC1A8188DAE7B00BA3EB6 /* IDBKeyData.cpp in Sources */,
</ins><span class="cx">                                 97BC6A411505F081001B74AC /* SQLResultSet.cpp in Sources */,
</span><span class="cx">                                 97BC6A441505F081001B74AC /* SQLResultSetRowList.cpp in Sources */,
</span><span class="cx">                                 97BC6A471505F081001B74AC /* SQLStatement.cpp in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformCrossThreadCopiercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/CrossThreadCopier.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/CrossThreadCopier.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/platform/CrossThreadCopier.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> #include &quot;IDBDatabaseMetadata.h&quot;
</span><ins>+#include &quot;IDBKeyData.h&quot;
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -98,6 +99,11 @@
</span><span class="cx">     return metadata.isolatedCopy();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+CrossThreadCopierBase&lt;false, false, IDBKeyData&gt;::Type CrossThreadCopierBase&lt;false, false, IDBKeyData&gt;::copy(const IDBKeyData&amp; keyData)
+{
+    return keyData.isolatedCopy();
+}
+
</ins><span class="cx"> CrossThreadCopierBase&lt;false, false, IDBObjectStoreMetadata&gt;::Type CrossThreadCopierBase&lt;false, false, IDBObjectStoreMetadata&gt;::copy(const IDBObjectStoreMetadata&amp; metadata)
</span><span class="cx"> {
</span><span class="cx">     return metadata.isolatedCopy();
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformCrossThreadCopierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/CrossThreadCopier.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/CrossThreadCopier.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebCore/platform/CrossThreadCopier.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -173,6 +173,12 @@
</span><span class="cx">         static Type copy(const IDBIndexMetadata&amp;);
</span><span class="cx">     };
</span><span class="cx"> 
</span><ins>+    struct IDBKeyData;
+    template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, IDBKeyData&gt; {
+        typedef IDBKeyData Type;
+        static Type copy(const IDBKeyData&amp;);
+    };
+
</ins><span class="cx">     struct IDBObjectStoreMetadata;
</span><span class="cx">     template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, IDBObjectStoreMetadata&gt; {
</span><span class="cx">         typedef IDBObjectStoreMetadata Type;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/ChangeLog        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -1,3 +1,64 @@
</span><ins>+2014-01-21  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IDB: &quot;Put&quot; support
+        &lt;rdar://problem/15779643&gt; and https://bugs.webkit.org/show_bug.cgi?id=127401
+
+        Reviewed by Alexey Proskuryakov.
+
+        Ship putRecord requests over to the DatabaseProcess, and listen for completion from the DatabaseProcess:
+        * WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp:
+        (WebKit::WebIDBServerConnection::put):
+        (WebKit::WebIDBServerConnection::didPutRecord):
+        * WebProcess/Databases/IndexedDB/WebIDBServerConnection.h:
+        * WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in:
+
+        Pass off the putRecord request to the Unique IDBDatabase:
+        * DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp:
+        (WebKit::DatabaseProcessIDBConnection::putRecord):
+        * DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h:
+        * DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in:
+
+        Pass off the putRecord request to the backing store:
+        * DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp:
+        (WebKit::UniqueIDBDatabase::putRecord):
+        (WebKit::UniqueIDBDatabase::putRecordInBackingStore):
+        (WebKit::UniqueIDBDatabase::didPutRecordInBackingStore):
+        * DatabaseProcess/IndexedDB/UniqueIDBDatabase.h:
+
+        Add backing store methods related to putRecord, though only one is critical right now:
+        * DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h:
+        * DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp:
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::createAndPopulateInitialMetadata):
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::generateKey):
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::keyExistsInObjectStore):
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::putRecord):
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::updateKeyGenerator):
+        * DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h:
+
+        Add the IDBKeyData type to IPC:
+        * Scripts/webkit2/messages.py:
+        (struct_or_class):
+
+        * Shared/WebCoreArgumentCoders.cpp:
+        (IPC::ArgumentCoder&lt;IDBKeyData&gt;::encode):
+        (IPC::ArgumentCoder&lt;IDBKeyData&gt;::decode):
+        * Shared/WebCoreArgumentCoders.h:
+
+        * DatabaseProcess/IndexedDB/IDBSerialization.cpp:
+        (WebKit::serializeIDBKey):
+        * DatabaseProcess/IndexedDB/IDBSerialization.h:
+
+        Implement more cross-thread copying:
+        * Shared/WebCrossThreadCopier.cpp:
+        (WebCore::Vector&lt;uint8_t&gt;&gt;::copy):
+        (WebCore::Vector&lt;Vector&lt;IDBKeyData&gt;&gt;&gt;::copy):
+        (WebCore::ASCIILiteral&gt;::copy):
+        * Shared/WebCrossThreadCopier.h:
+
+        Implement more numbers of generic AsyncTask templates:
+        * Shared/AsyncTask.h:
+        (WebKit::createAsyncTask):
+
</ins><span class="cx"> 2014-01-22  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WKProcessClass should create a WebContext
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBDatabaseProcessIDBConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -177,6 +177,18 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DatabaseProcessIDBConnection::putRecord(uint64_t requestID, int64_t transactionID, int64_t objectStoreID, const WebCore::IDBKeyData&amp; key, const IPC::DataReference&amp; value, int64_t putMode, const Vector&lt;int64_t&gt;&amp; indexIDs, const Vector&lt;Vector&lt;WebCore::IDBKeyData&gt;&gt;&amp; indexKeys)
+{
+    ASSERT(m_uniqueIDBDatabase);
+
+    LOG(IDB, &quot;DatabaseProcess putRecord request ID %llu, object store id %lli&quot;, requestID, objectStoreID);
+    RefPtr&lt;DatabaseProcessIDBConnection&gt; connection(this);
+    m_uniqueIDBDatabase-&gt;putRecord(IDBTransactionIdentifier(*this, transactionID), objectStoreID, key, value, putMode, indexIDs, indexKeys, [connection, requestID](const IDBKeyData&amp; keyData, uint32_t errorCode, const String&amp; errorMessage) {
+        connection-&gt;send(Messages::WebIDBServerConnection::DidPutRecord(requestID, keyData, errorCode, errorMessage));
+    });
+}
+
+
</ins><span class="cx"> IPC::Connection* DatabaseProcessIDBConnection::messageSenderConnection()
</span><span class="cx"> {
</span><span class="cx">     return m_connection-&gt;connection();
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBDatabaseProcessIDBConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -34,6 +34,10 @@
</span><span class="cx"> #include &quot;UniqueIDBDatabaseIdentifier.h&quot;
</span><span class="cx"> #include &lt;wtf/text/WTFString.h&gt;
</span><span class="cx"> 
</span><ins>+namespace WebCore {
+struct IDBKeyData;
+}
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> class DatabaseToWebProcessConnection;
</span><span class="lines">@@ -71,6 +75,7 @@
</span><span class="cx">     void changeDatabaseVersion(uint64_t requestID, int64_t transactionID, uint64_t newVersion);
</span><span class="cx">     void createObjectStore(uint64_t requestID, int64_t transactionID, WebCore::IDBObjectStoreMetadata);
</span><span class="cx">     void deleteObjectStore(uint64_t requestID, int64_t transactionID, int64_t objectStoreID);
</span><ins>+    void putRecord(uint64_t requestID, int64_t transactionID, int64_t objectStoreID, const WebCore::IDBKeyData&amp;, const IPC::DataReference&amp; value, int64_t putMode, const Vector&lt;int64_t&gt;&amp; indexIDs, const Vector&lt;Vector&lt;WebCore::IDBKeyData&gt;&gt;&amp; indexKeys);
</ins><span class="cx"> 
</span><span class="cx">     Ref&lt;DatabaseToWebProcessConnection&gt; m_connection;
</span><span class="cx">     uint64_t m_serverConnectionIdentifier;
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBDatabaseProcessIDBConnectionmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -35,6 +35,7 @@
</span><span class="cx">     ChangeDatabaseVersion(uint64_t requestID, int64_t transactionID, uint64_t newVersion)
</span><span class="cx">     CreateObjectStore(uint64_t requestID, int64_t transactionID, WebCore::IDBObjectStoreMetadata objectStoreMetadata)
</span><span class="cx">     DeleteObjectStore(uint64_t requestID, int64_t transactionID, int64_t objectStoreID)
</span><ins>+    PutRecord(uint64_t requestID, int64_t transactionID, int64_t objectStoreID, WebCore::IDBKeyData key, IPC::DataReference value, int64_t putMode, Vector&lt;int64_t&gt; indexIDs, Vector&lt;Vector&lt;WebCore::IDBKeyData&gt;&gt; indexKeys)
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(INDEXED_DATABASE) &amp;&amp; ENABLE(DATABASE_PROCESS)
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBIDBSerializationcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -30,13 +30,14 @@
</span><span class="cx"> #include &quot;ArgumentEncoder.h&quot;
</span><span class="cx"> #include &quot;KeyedDecoder.h&quot;
</span><span class="cx"> #include &quot;KeyedEncoder.h&quot;
</span><ins>+#include &lt;WebCore/IDBKey.h&gt;
</ins><span class="cx"> #include &lt;WebCore/IDBKeyPath.h&gt;
</span><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><del>-RefPtr&lt;SharedBuffer&gt; serializeIDBKeyPath(const WebCore::IDBKeyPath&amp; keyPath)
</del><ins>+RefPtr&lt;SharedBuffer&gt; serializeIDBKeyPath(const IDBKeyPath&amp; keyPath)
</ins><span class="cx"> {
</span><span class="cx">     KeyedEncoder encoder;
</span><span class="cx">     keyPath.encode(encoder);
</span><span class="lines">@@ -53,6 +54,13 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+RefPtr&lt;WebCore::SharedBuffer&gt; serializeIDBKey(const IDBKey&amp; key)
+{
+    KeyedEncoder encoder;
+    key.encode(encoder);
+    return encoder.finishEncoding();
+}
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(INDEXED_DATABASE)
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBIDBSerializationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &lt;wtf/Vector.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><ins>+class IDBKey;
</ins><span class="cx"> class IDBKeyPath;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -40,6 +41,9 @@
</span><span class="cx"> RefPtr&lt;WebCore::SharedBuffer&gt; serializeIDBKeyPath(const WebCore::IDBKeyPath&amp;);
</span><span class="cx"> std::unique_ptr&lt;WebCore::IDBKeyPath&gt; deserializeIDBKeyPath(const uint8_t* buffer, size_t bufferSize);
</span><span class="cx"> 
</span><ins>+RefPtr&lt;WebCore::SharedBuffer&gt; serializeIDBKey(const WebCore::IDBKey&amp;);
+PassRefPtr&lt;WebCore::IDBKey&gt; deserializeIDBKey(const uint8_t* buffer, size_t bufferSize);
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(INDEXED_DATABASE)
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -30,13 +30,17 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;AsyncRequest.h&quot;
</span><span class="cx"> #include &quot;AsyncTask.h&quot;
</span><ins>+#include &quot;DataReference.h&quot;
</ins><span class="cx"> #include &quot;DatabaseProcess.h&quot;
</span><span class="cx"> #include &quot;DatabaseProcessIDBConnection.h&quot;
</span><span class="cx"> #include &quot;UniqueIDBDatabaseBackingStoreSQLite.h&quot;
</span><span class="cx"> #include &quot;WebCrossThreadCopier.h&quot;
</span><span class="cx"> #include &lt;WebCore/FileSystem.h&gt;
</span><ins>+#include &lt;WebCore/IDBDatabaseBackend.h&gt;
</ins><span class="cx"> #include &lt;WebCore/IDBDatabaseMetadata.h&gt;
</span><ins>+#include &lt;WebCore/IDBKeyData.h&gt;
</ins><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><ins>+#include &lt;wtf/text/WTFString.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace WebCore;
</span><span class="cx"> 
</span><span class="lines">@@ -222,7 +226,7 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UniqueIDBDatabase::openTransaction(const IDBTransactionIdentifier&amp; identifier, const Vector&lt;int64_t&gt;&amp; objectStoreIDs, WebCore::IndexedDB::TransactionMode mode, std::function&lt;void(bool)&gt; successCallback)
</del><ins>+void UniqueIDBDatabase::openTransaction(const IDBTransactionIdentifier&amp; identifier, const Vector&lt;int64_t&gt;&amp; objectStoreIDs, IndexedDB::TransactionMode mode, std::function&lt;void(bool)&gt; successCallback)
</ins><span class="cx"> {
</span><span class="cx">     postTransactionOperation(identifier, createAsyncTask(*this, &amp;UniqueIDBDatabase::openBackingStoreTransaction, identifier, objectStoreIDs, mode), successCallback);
</span><span class="cx"> }
</span><span class="lines">@@ -334,7 +338,7 @@
</span><span class="cx">     request-&gt;completeRequest(success);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UniqueIDBDatabase::createObjectStore(const IDBTransactionIdentifier&amp; identifier, const WebCore::IDBObjectStoreMetadata&amp; metadata, std::function&lt;void(bool)&gt; successCallback)
</del><ins>+void UniqueIDBDatabase::createObjectStore(const IDBTransactionIdentifier&amp; identifier, const IDBObjectStoreMetadata&amp; metadata, std::function&lt;void(bool)&gt; successCallback)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span><span class="cx"> 
</span><span class="lines">@@ -389,8 +393,31 @@
</span><span class="cx">     postDatabaseTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::deleteObjectStoreInBackingStore, requestID, identifier, objectStoreID));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UniqueIDBDatabase::openBackingStoreTransaction(const IDBTransactionIdentifier&amp; identifier, const Vector&lt;int64_t&gt;&amp; objectStoreIDs, WebCore::IndexedDB::TransactionMode mode)
</del><ins>+void UniqueIDBDatabase::putRecord(const IDBTransactionIdentifier&amp; identifier, int64_t objectStoreID, const IDBKeyData&amp; keyData, const IPC::DataReference&amp; value, int64_t putMode, const Vector&lt;int64_t&gt;&amp; indexIDs, const Vector&lt;Vector&lt;IDBKeyData&gt;&gt;&amp; indexKeys, std::function&lt;void(const IDBKeyData&amp;, uint32_t, const String&amp;)&gt; callback)
</ins><span class="cx"> {
</span><ins>+    ASSERT(isMainThread());
+
+    if (!m_acceptingNewRequests) {
+        callback(IDBKeyData(), INVALID_STATE_ERR, &quot;Unable to put record into database because it has shut down&quot;);
+        return;
+    }
+
+    ASSERT(m_metadata-&gt;objectStores.contains(objectStoreID));
+
+    RefPtr&lt;AsyncRequest&gt; request = AsyncRequestImpl&lt;const IDBKeyData&amp;, uint32_t, const String&amp;&gt;::create([this, callback](const IDBKeyData&amp; keyData, uint32_t errorCode, const String&amp; errorMessage) {
+        callback(keyData, errorCode, errorMessage);
+    }, [this, callback]() {
+        callback(IDBKeyData(), INVALID_STATE_ERR, &quot;Unable to put record into database&quot;);
+    });
+
+    uint64_t requestID = request-&gt;requestID();
+    m_pendingDatabaseTasks.add(requestID, request.release());
+
+    postDatabaseTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::putRecordInBackingStore, requestID, identifier, m_metadata-&gt;objectStores.get(objectStoreID), keyData, value.vector(), putMode, indexIDs, indexKeys));
+}
+
+void UniqueIDBDatabase::openBackingStoreTransaction(const IDBTransactionIdentifier&amp; identifier, const Vector&lt;int64_t&gt;&amp; objectStoreIDs, IndexedDB::TransactionMode mode)
+{
</ins><span class="cx">     ASSERT(!isMainThread());
</span><span class="cx">     ASSERT(m_backingStore);
</span><span class="cx"> 
</span><span class="lines">@@ -469,6 +496,62 @@
</span><span class="cx">     postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didDeleteObjectStore, requestID, success));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UniqueIDBDatabase::putRecordInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&amp; transaction, const IDBObjectStoreMetadata&amp; objectStoreMetadata, const IDBKeyData&amp; keyData, const Vector&lt;uint8_t&gt;&amp; value, int64_t putMode, const Vector&lt;int64_t&gt;&amp; indexIDs, const Vector&lt;Vector&lt;IDBKeyData&gt;&gt;&amp; indexKeys)
+{
+    ASSERT(!isMainThread());
+    ASSERT(m_backingStore);
+
+    bool keyWasGenerated = false;
+    RefPtr&lt;IDBKey&gt; key;
+
+    if (putMode != IDBDatabaseBackend::CursorUpdate &amp;&amp; objectStoreMetadata.autoIncrement &amp;&amp; keyData.isNull) {
+        key = m_backingStore-&gt;generateKey(transaction, objectStoreMetadata.id);
+        keyWasGenerated = true;
+    } else
+        key = keyData.maybeCreateIDBKey();
+
+    ASSERT(key);
+    ASSERT(key-&gt;isValid());
+
+    if (putMode == IDBDatabaseBackend::AddOnly) {
+        bool keyExists;
+        if (!m_backingStore-&gt;keyExistsInObjectStore(transaction, objectStoreMetadata.id, *key, keyExists)) {
+            postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Internal backing store error checking for key existence&quot;)));
+            return;
+        }
+        if (keyExists) {
+            postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::ConstraintError, ASCIILiteral(&quot;Key already exists in the object store&quot;)));
+            return;
+        }
+    }
+
+    // FIXME: The LevelDB port performs &quot;makeIndexWriters&quot; here. Necessary?
+
+    if (!m_backingStore-&gt;putRecord(transaction, objectStoreMetadata.id, *key, value.data(), value.size())) {
+        postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Internal backing store error putting a record&quot;)));
+        return;
+    }
+
+    // FIXME: The LevelDB port updates index keys here. Necessary?
+
+    if (putMode != IDBDatabaseBackend::CursorUpdate &amp;&amp; objectStoreMetadata.autoIncrement &amp;&amp; key-&gt;type() == IDBKey::NumberType) {
+        if (!m_backingStore-&gt;updateKeyGenerator(transaction, objectStoreMetadata.id, *key, keyWasGenerated)) {
+            postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Internal backing store error updating key generator&quot;)));
+            return;
+        }
+    }
+
+    postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(key.get()), 0, String(StringImpl::empty())));
+}
+
+void UniqueIDBDatabase::didPutRecordInBackingStore(uint64_t requestID, const IDBKeyData&amp; keyData, uint32_t errorCode, const String&amp; errorMessage)
+{
+    RefPtr&lt;AsyncRequest&gt; request = m_pendingDatabaseTasks.take(requestID);
+    ASSERT(request);
+
+    request-&gt;completeRequest(keyData, errorCode, errorMessage);
+}
+
</ins><span class="cx"> String UniqueIDBDatabase::absoluteDatabaseDirectory() const
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabaseh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -40,6 +40,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> struct IDBDatabaseMetadata;
</span><ins>+struct IDBKeyData;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -76,6 +77,7 @@
</span><span class="cx">     void changeDatabaseVersion(const IDBTransactionIdentifier&amp;, uint64_t newVersion, std::function&lt;void(bool)&gt; successCallback);
</span><span class="cx">     void createObjectStore(const IDBTransactionIdentifier&amp;, const WebCore::IDBObjectStoreMetadata&amp;, std::function&lt;void(bool)&gt; successCallback);
</span><span class="cx">     void deleteObjectStore(const IDBTransactionIdentifier&amp;, int64_t objectStoreID, std::function&lt;void(bool)&gt; successCallback);
</span><ins>+    void putRecord(const IDBTransactionIdentifier&amp;, int64_t objectStoreID, const WebCore::IDBKeyData&amp;, const IPC::DataReference&amp; value, int64_t putMode, const Vector&lt;int64_t&gt;&amp; indexIDs, const Vector&lt;Vector&lt;WebCore::IDBKeyData&gt;&gt;&amp; indexKeys, std::function&lt;void(const WebCore::IDBKeyData&amp;, uint32_t, const String&amp;)&gt; callback);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     UniqueIDBDatabase(const UniqueIDBDatabaseIdentifier&amp;);
</span><span class="lines">@@ -117,7 +119,9 @@
</span><span class="cx">     void changeDatabaseVersionInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&amp;, uint64_t newVersion);
</span><span class="cx">     void createObjectStoreInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&amp;, const WebCore::IDBObjectStoreMetadata&amp;);
</span><span class="cx">     void deleteObjectStoreInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&amp;, int64_t objectStoreID);
</span><ins>+    void putRecordInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&amp;, const WebCore::IDBObjectStoreMetadata&amp;, const WebCore::IDBKeyData&amp;, const Vector&lt;uint8_t&gt;&amp; value, int64_t putMode, const Vector&lt;int64_t&gt;&amp; indexIDs, const Vector&lt;Vector&lt;WebCore::IDBKeyData&gt;&gt;&amp; indexKeys);
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx">     void shutdownBackingStore();
</span><span class="cx"> 
</span><span class="cx">     // Callbacks from the database workqueue thread, to be performed on the main thread only
</span><span class="lines">@@ -127,6 +131,7 @@
</span><span class="cx">     void didChangeDatabaseVersion(uint64_t requestID, bool success);
</span><span class="cx">     void didCreateObjectStore(uint64_t requestID, bool success);
</span><span class="cx">     void didDeleteObjectStore(uint64_t requestID, bool success);
</span><ins>+    void didPutRecordInBackingStore(uint64_t requestID, const WebCore::IDBKeyData&amp;, uint32_t errorCode, const String&amp; errorMessage);
</ins><span class="cx">     void didShutdownBackingStore();
</span><span class="cx">     void didCompleteBoolRequest(uint64_t requestID, bool success);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabaseBackingStoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -32,6 +32,8 @@
</span><span class="cx"> #include &lt;wtf/RefCounted.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><ins>+class IDBKey;
+
</ins><span class="cx"> struct IDBDatabaseMetadata;
</span><span class="cx"> struct IDBObjectStoreMetadata;
</span><span class="cx"> }
</span><span class="lines">@@ -55,6 +57,13 @@
</span><span class="cx">     virtual bool changeDatabaseVersion(const IDBTransactionIdentifier&amp;, uint64_t newVersion) = 0;
</span><span class="cx">     virtual bool createObjectStore(const IDBTransactionIdentifier&amp;, const WebCore::IDBObjectStoreMetadata&amp;) = 0;
</span><span class="cx">     virtual bool deleteObjectStore(const IDBTransactionIdentifier&amp;, int64_t objectStoreID) = 0;
</span><ins>+
+    virtual PassRefPtr&lt;WebCore::IDBKey&gt; generateKey(const IDBTransactionIdentifier&amp;, int64_t objectStoreID) = 0;
+    virtual bool keyExistsInObjectStore(const IDBTransactionIdentifier&amp;, int64_t objectStoreID, const WebCore::IDBKey&amp;, bool&amp; keyExists) = 0;
+    virtual bool putRecord(const IDBTransactionIdentifier&amp;, int64_t objectStoreID, const WebCore::IDBKey&amp;, const uint8_t* valueBuffer, size_t valueSize) = 0;
+    virtual bool updateKeyGenerator(const IDBTransactionIdentifier&amp;, int64_t objectStoreId, const WebCore::IDBKey&amp;, bool checkCurrent) = 0;
+
+
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace WebKit
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBsqliteUniqueIDBDatabaseBackingStoreSQLitecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> #include &quot;SQLiteIDBTransaction.h&quot;
</span><span class="cx"> #include &lt;WebCore/FileSystem.h&gt;
</span><span class="cx"> #include &lt;WebCore/IDBDatabaseMetadata.h&gt;
</span><ins>+#include &lt;WebCore/IDBKeyData.h&gt;
</ins><span class="cx"> #include &lt;WebCore/SQLiteDatabase.h&gt;
</span><span class="cx"> #include &lt;WebCore/SQLiteStatement.h&gt;
</span><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="lines">@@ -89,6 +90,12 @@
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (!m_sqliteDB-&gt;executeCommand(&quot;CREATE TABLE Records (objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key BLOB NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, value BLOB NOT NULL ON CONFLICT FAIL);&quot;)) {
+        LOG_ERROR(&quot;Could not create Records table in database (%i) - %s&quot;, m_sqliteDB-&gt;lastError(), m_sqliteDB-&gt;lastErrorMsg());
+        m_sqliteDB = nullptr;
+        return nullptr;
+    }
+
</ins><span class="cx">     {
</span><span class="cx">         SQLiteStatement sql(*m_sqliteDB, ASCIILiteral(&quot;INSERT INTO IDBDatabaseInfo VALUES ('MetadataVersion', ?);&quot;));
</span><span class="cx">         if (sql.prepare() != SQLResultOk
</span><span class="lines">@@ -415,7 +422,61 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+PassRefPtr&lt;IDBKey&gt; UniqueIDBDatabaseBackingStoreSQLite::generateKey(const IDBTransactionIdentifier&amp;, int64_t objectStoreID)
+{
+    // FIXME (&lt;rdar://problem/15877909&gt;): Implement
+    return nullptr;
+}
</ins><span class="cx"> 
</span><ins>+bool UniqueIDBDatabaseBackingStoreSQLite::keyExistsInObjectStore(const IDBTransactionIdentifier&amp;, int64_t objectStoreID, const IDBKey&amp;, bool&amp; keyExists)
+{
+    // FIXME: When Get support is implemented, we need to implement this also (&lt;rdar://problem/15779644&gt;)
+    return false;
+}
+
+bool UniqueIDBDatabaseBackingStoreSQLite::putRecord(const IDBTransactionIdentifier&amp; identifier, int64_t objectStoreID, const IDBKey&amp; key, const uint8_t* valueBuffer, size_t valueSize)
+{
+    ASSERT(!isMainThread());
+    ASSERT(m_sqliteDB);
+    ASSERT(m_sqliteDB-&gt;isOpen());
+
+    SQLiteIDBTransaction* transaction = m_transactions.get(identifier);
+    if (!transaction || !transaction-&gt;inProgress()) {
+        LOG_ERROR(&quot;Attempt to put a record into database without an established, in-progress transaction&quot;);
+        return false;
+    }
+    if (transaction-&gt;mode() == IndexedDB::TransactionMode::ReadOnly) {
+        LOG_ERROR(&quot;Attempt to put a record into database during read-only transaction&quot;);
+        return false;
+    }
+
+    RefPtr&lt;SharedBuffer&gt; keyBuffer = serializeIDBKey(key);
+    if (!keyBuffer) {
+        LOG_ERROR(&quot;Unable to serialize IDBKey to be stored in the database&quot;);
+        return false;
+    }
+    {
+        SQLiteStatement sql(*m_sqliteDB, ASCIILiteral(&quot;INSERT INTO Records VALUES (?, ?, ?);&quot;));
+        if (sql.prepare() != SQLResultOk
+            || sql.bindInt64(1, objectStoreID) != SQLResultOk
+            || sql.bindBlob(2, keyBuffer-&gt;data(), keyBuffer-&gt;size()) != SQLResultOk
+            || sql.bindBlob(3, valueBuffer, valueSize) != SQLResultOk
+            || sql.step() != SQLResultDone) {
+            LOG_ERROR(&quot;Could not put record for object store %lli in Records table (%i) - %s&quot;, objectStoreID, m_sqliteDB-&gt;lastError(), m_sqliteDB-&gt;lastErrorMsg());
+            return false;
+        }
+    }
+
+    return true;
+}
+
+bool UniqueIDBDatabaseBackingStoreSQLite::updateKeyGenerator(const IDBTransactionIdentifier&amp;, int64_t objectStoreId, const IDBKey&amp;, bool checkCurrent)
+{
+    // FIXME (&lt;rdar://problem/15877909&gt;): Implement
+    return false;
+}
+
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(INDEXED_DATABASE) &amp;&amp; ENABLE(DATABASE_PROCESS)
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBsqliteUniqueIDBDatabaseBackingStoreSQLiteh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -64,6 +64,11 @@
</span><span class="cx">     virtual bool createObjectStore(const IDBTransactionIdentifier&amp;, const WebCore::IDBObjectStoreMetadata&amp;) override;
</span><span class="cx">     virtual bool deleteObjectStore(const IDBTransactionIdentifier&amp;, int64_t objectStoreID) override;
</span><span class="cx"> 
</span><ins>+    virtual PassRefPtr&lt;WebCore::IDBKey&gt; generateKey(const IDBTransactionIdentifier&amp;, int64_t objectStoreID) override;
+    virtual bool keyExistsInObjectStore(const IDBTransactionIdentifier&amp;, int64_t objectStoreID, const WebCore::IDBKey&amp;, bool&amp; keyExists) override;
+    virtual bool putRecord(const IDBTransactionIdentifier&amp;, int64_t objectStoreID, const WebCore::IDBKey&amp;, const uint8_t* valueBuffer, size_t valueSize) override;
+    virtual bool updateKeyGenerator(const IDBTransactionIdentifier&amp;, int64_t objectStoreId, const WebCore::IDBKey&amp;, bool checkCurrent) override;
+
</ins><span class="cx"> private:
</span><span class="cx">     UniqueIDBDatabaseBackingStoreSQLite(const UniqueIDBDatabaseIdentifier&amp;, const String&amp; databaseDirectory);
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2Scriptswebkit2messagespy"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Scripts/webkit2/messages.py (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Scripts/webkit2/messages.py        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/Scripts/webkit2/messages.py        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -177,6 +177,7 @@
</span><span class="cx">         'WebCore::FileChooserSettings',
</span><span class="cx">         'WebCore::GrammarDetail',
</span><span class="cx">         'WebCore::IDBDatabaseMetadata',
</span><ins>+        'WebCore::IDBKeyData',
</ins><span class="cx">         'WebCore::IDBObjectStoreMetadata',
</span><span class="cx">         'WebCore::IdentityTransformOperation',
</span><span class="cx">         'WebCore::KeypressCommand',
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedAsyncTaskh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/AsyncTask.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/AsyncTask.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/Shared/AsyncTask.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -116,6 +116,50 @@
</span><span class="cx">         WebCore::CrossThreadCopier&lt;P3&gt;::copy(parameter3));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+template&lt;typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4&gt;
+std::unique_ptr&lt;AsyncTask&gt; createAsyncTask(
+    T&amp; callee,
+    void (T::*method)(MP1, MP2, MP3, MP4),
+    const P1&amp; parameter1,
+    const P2&amp; parameter2,
+    const P3&amp; parameter3,
+    const P4&amp; parameter4)
+{
+    return std::make_unique&lt;AsyncTaskImpl&lt;T, MP1, MP2, MP3, MP4&gt;&gt;(
+        &amp;callee,
+        method,
+        WebCore::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
+        WebCore::CrossThreadCopier&lt;P2&gt;::copy(parameter2),
+        WebCore::CrossThreadCopier&lt;P3&gt;::copy(parameter3),
+        WebCore::CrossThreadCopier&lt;P4&gt;::copy(parameter4));
+}
+
+template&lt;typename T, typename P1, typename MP1, typename P2, typename MP2, typename P3, typename MP3, typename P4, typename MP4, typename P5, typename MP5, typename P6, typename MP6, typename P7, typename MP7, typename P8, typename MP8&gt;
+std::unique_ptr&lt;AsyncTask&gt; createAsyncTask(
+    T&amp; callee,
+    void (T::*method)(MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8),
+    const P1&amp; parameter1,
+    const P2&amp; parameter2,
+    const P3&amp; parameter3,
+    const P4&amp; parameter4,
+    const P5&amp; parameter5,
+    const P6&amp; parameter6,
+    const P7&amp; parameter7,
+    const P8&amp; parameter8)
+{
+    return std::make_unique&lt;AsyncTaskImpl&lt;T, MP1, MP2, MP3, MP4, MP5, MP6, MP7, MP8&gt;&gt;(
+        &amp;callee,
+        method,
+        WebCore::CrossThreadCopier&lt;P1&gt;::copy(parameter1),
+        WebCore::CrossThreadCopier&lt;P2&gt;::copy(parameter2),
+        WebCore::CrossThreadCopier&lt;P3&gt;::copy(parameter3),
+        WebCore::CrossThreadCopier&lt;P4&gt;::copy(parameter4),
+        WebCore::CrossThreadCopier&lt;P5&gt;::copy(parameter5),
+        WebCore::CrossThreadCopier&lt;P6&gt;::copy(parameter6),
+        WebCore::CrossThreadCopier&lt;P7&gt;::copy(parameter7),
+        WebCore::CrossThreadCopier&lt;P8&gt;::copy(parameter8));
+}
+
</ins><span class="cx"> } // namespace WebKit
</span><span class="cx"> 
</span><span class="cx"> #endif // AsyncTask_h
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCoreArgumentCoderscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -42,6 +42,7 @@
</span><span class="cx"> #include &lt;WebCore/GraphicsContext.h&gt;
</span><span class="cx"> #include &lt;WebCore/GraphicsLayer.h&gt;
</span><span class="cx"> #include &lt;WebCore/IDBDatabaseMetadata.h&gt;
</span><ins>+#include &lt;WebCore/IDBKeyData.h&gt;
</ins><span class="cx"> #include &lt;WebCore/IDBKeyPath.h&gt;
</span><span class="cx"> #include &lt;WebCore/Image.h&gt;
</span><span class="cx"> #include &lt;WebCore/Length.h&gt;
</span><span class="lines">@@ -1622,6 +1623,68 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void ArgumentCoder&lt;IDBKeyData&gt;::encode(ArgumentEncoder&amp; encoder, const IDBKeyData&amp; keyData)
+{
+    encoder &lt;&lt; keyData.isNull;
+    if (keyData.isNull)
+        return;
+
+    encoder.encodeEnum(keyData.type);
+
+    switch (keyData.type) {
+    case IDBKey::InvalidType:
+        break;
+    case IDBKey::ArrayType:
+        encoder &lt;&lt; keyData.arrayValue;
+        break;
+    case IDBKey::StringType:
+        encoder &lt;&lt; keyData.stringValue;
+        break;
+    case IDBKey::DateType:
+    case IDBKey::NumberType:
+        encoder &lt;&lt; keyData.numberValue;
+        break;
+    case IDBKey::MinType:
+        ASSERT_NOT_REACHED();
+        break;
+    }
+}
+
+bool ArgumentCoder&lt;IDBKeyData&gt;::decode(ArgumentDecoder&amp; decoder, IDBKeyData&amp; keyData)
+{
+    if (!decoder.decode(keyData.isNull))
+        return false;
+
+    if (keyData.isNull)
+        return true;
+
+    if (!decoder.decodeEnum(keyData.type))
+        return false;
+
+    switch (keyData.type) {
+    case IDBKey::InvalidType:
+        break;
+    case IDBKey::ArrayType:
+        if (!decoder.decode(keyData.arrayValue))
+            return false;
+        break;
+    case IDBKey::StringType:
+        if (!decoder.decode(keyData.stringValue))
+            return false;
+        break;
+    case IDBKey::DateType:
+    case IDBKey::NumberType:
+        if (!decoder.decode(keyData.numberValue))
+            return false;
+        break;
+    case IDBKey::MinType:
+        ASSERT_NOT_REACHED();
+        return false;
+    }
+
+    return true;
+}
+
</ins><span class="cx"> void ArgumentCoder&lt;IDBKeyPath&gt;::encode(ArgumentEncoder&amp; encoder, const IDBKeyPath&amp; keyPath)
</span><span class="cx"> {
</span><span class="cx">     encoder.encodeEnum(keyPath.type());
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCoreArgumentCodersh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/Shared/WebCoreArgumentCoders.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -66,6 +66,7 @@
</span><span class="cx"> struct FileChooserSettings;
</span><span class="cx"> struct IDBDatabaseMetadata;
</span><span class="cx"> struct IDBIndexMetadata;
</span><ins>+struct IDBKeyData;
</ins><span class="cx"> struct IDBObjectStoreMetadata;
</span><span class="cx"> struct Length;
</span><span class="cx"> struct GrammarDetail;
</span><span class="lines">@@ -364,6 +365,11 @@
</span><span class="cx">     static bool decode(ArgumentDecoder&amp;, WebCore::IDBIndexMetadata&amp;);
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template&lt;&gt; struct ArgumentCoder&lt;WebCore::IDBKeyData&gt; {
+    static void encode(ArgumentEncoder&amp;, const WebCore::IDBKeyData&amp;);
+    static bool decode(ArgumentDecoder&amp;, WebCore::IDBKeyData&amp;);
+};
+
</ins><span class="cx"> template&lt;&gt; struct ArgumentCoder&lt;WebCore::IDBKeyPath&gt; {
</span><span class="cx">     static void encode(ArgumentEncoder&amp;, const WebCore::IDBKeyPath&amp;);
</span><span class="cx">     static bool decode(ArgumentDecoder&amp;, WebCore::IDBKeyPath&amp;);
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCrossThreadCopiercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCrossThreadCopier.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCrossThreadCopier.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/Shared/WebCrossThreadCopier.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IDBTransactionIdentifier.h&quot;
</span><span class="cx"> #include &quot;UniqueIDBDatabaseIdentifier.h&quot;
</span><ins>+#include &lt;WebCore/IDBKeyData.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> using namespace WebKit;
</span><span class="cx"> 
</span><span class="lines">@@ -51,6 +52,31 @@
</span><span class="cx">     return result;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+Vector&lt;uint8_t&gt; CrossThreadCopierBase&lt;false, false, Vector&lt;uint8_t&gt;&gt;::copy(const Vector&lt;uint8_t&gt;&amp; vector)
+{
+    Vector&lt;uint8_t&gt; result;
+    result.appendVector(vector);
+    return result;
+}
+
+Vector&lt;Vector&lt;IDBKeyData&gt;&gt; CrossThreadCopierBase&lt;false, false, Vector&lt;Vector&lt;IDBKeyData&gt;&gt;&gt;::copy(const Vector&lt;Vector&lt;IDBKeyData&gt;&gt;&amp; vector)
+{
+    Vector&lt;Vector&lt;IDBKeyData&gt;&gt; result;
+
+    for (auto keys : vector) {
+        result.append(Vector&lt;IDBKeyData&gt;());
+        for (auto key : keys)
+            result.last().append(WebCore::CrossThreadCopier&lt;IDBKeyData&gt;::copy(key));
+    }
+
+    return result;
+}
+
+ASCIILiteral CrossThreadCopierBase&lt;false, false, ASCIILiteral&gt;::copy(const ASCIILiteral&amp; literal)
+{
+    return literal;
+}
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(INDEXED_DATABASE)
</span></span></pre></div>
<a id="trunkSourceWebKit2SharedWebCrossThreadCopierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Shared/WebCrossThreadCopier.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Shared/WebCrossThreadCopier.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/Shared/WebCrossThreadCopier.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -36,6 +36,10 @@
</span><span class="cx"> class UniqueIDBDatabaseIdentifier;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+namespace WTF {
+class ASCIILiteral;
+}
+
</ins><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="cx"> template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, WebKit::UniqueIDBDatabaseIdentifier&gt; {
</span><span class="lines">@@ -50,6 +54,18 @@
</span><span class="cx">     static Vector&lt;int64_t&gt; copy(const Vector&lt;int64_t&gt;&amp;);
</span><span class="cx"> };
</span><span class="cx"> 
</span><ins>+template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, Vector&lt;uint8_t&gt;&gt; {
+    static Vector&lt;uint8_t&gt; copy(const Vector&lt;uint8_t&gt;&amp;);
+};
+
+template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, Vector&lt;Vector&lt;IDBKeyData&gt;&gt;&gt; {
+    static Vector&lt;Vector&lt;IDBKeyData&gt;&gt; copy(const Vector&lt;Vector&lt;IDBKeyData&gt;&gt;&amp;);
+};
+
+template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, WTF::ASCIILiteral&gt; {
+    static WTF::ASCIILiteral copy(const WTF::ASCIILiteral&amp;);
+};
+
</ins><span class="cx"> } // namespace WebCore
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(INDEXED_DATABASE)
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessDatabasesIndexedDBWebIDBServerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -30,6 +30,7 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE) &amp;&amp; ENABLE(DATABASE_PROCESS)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;AsyncRequest.h&quot;
</span><ins>+#include &quot;DataReference.h&quot;
</ins><span class="cx"> #include &quot;DatabaseProcessIDBConnectionMessages.h&quot;
</span><span class="cx"> #include &quot;DatabaseToWebProcessConnectionMessages.h&quot;
</span><span class="cx"> #include &quot;Logging.h&quot;
</span><span class="lines">@@ -300,10 +301,47 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebIDBServerConnection::put(IDBTransactionBackend&amp;, const PutOperation&amp;, std::function&lt;void(PassRefPtr&lt;IDBKey&gt;, PassRefPtr&lt;IDBDatabaseError&gt;)&gt; completionCallback)
</del><ins>+void WebIDBServerConnection::put(IDBTransactionBackend&amp; transaction, const PutOperation&amp; operation, std::function&lt;void(PassRefPtr&lt;IDBKey&gt;, PassRefPtr&lt;IDBDatabaseError&gt;)&gt; completionCallback)
</ins><span class="cx"> {
</span><ins>+    RefPtr&lt;AsyncRequest&gt; serverRequest = AsyncRequestImpl&lt;PassRefPtr&lt;IDBKey&gt;, PassRefPtr&lt;IDBDatabaseError&gt;&gt;::create(completionCallback);
+
+    serverRequest-&gt;setAbortHandler([completionCallback]() {
+        completionCallback(nullptr, IDBDatabaseError::create(IDBDatabaseException::UnknownError, &quot;Unknown error occured putting record&quot;));
+    });
+
+    uint64_t requestID = serverRequest-&gt;requestID();
+    ASSERT(!m_serverRequests.contains(requestID));
+    m_serverRequests.add(requestID, serverRequest.release());
+
+    LOG(IDB, &quot;WebProcess put request ID %llu&quot;, requestID);
+
+    ASSERT(operation.key());
+    ASSERT(operation.value());
+
+    IPC::DataReference value(reinterpret_cast&lt;const uint8_t*&gt;(operation.value()-&gt;data()), operation.value()-&gt;size());
+
+    Vector&lt;Vector&lt;IDBKeyData&gt;&gt; indexKeys;
+    for (auto keys : operation.indexKeys()) {
+        indexKeys.append(Vector&lt;IDBKeyData&gt;());
+        for (auto key : keys)
+            indexKeys.last().append(IDBKeyData(key.get()));
+    }
+
+    send(Messages::DatabaseProcessIDBConnection::PutRecord(requestID, transaction.id(), operation.objectStore().id, IDBKeyData(operation.key()), value, operation.putMode(), operation.indexIDs(), indexKeys));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebIDBServerConnection::didPutRecord(uint64_t requestID, const WebCore::IDBKeyData&amp; resultKey, uint32_t errorCode, const String&amp; errorMessage)
+{
+    LOG(IDB, &quot;WebProcess didPutRecord request ID %llu (error - %s)&quot;, requestID, errorMessage.utf8().data());
+
+    RefPtr&lt;AsyncRequest&gt; serverRequest = m_serverRequests.take(requestID);
+
+    if (!serverRequest)
+        return;
+
+    serverRequest-&gt;completeRequest(resultKey.isNull ? nullptr : resultKey.maybeCreateIDBKey(), errorCode ? IDBDatabaseError::create(errorCode, errorMessage) : nullptr);
+}
+
</ins><span class="cx"> void WebIDBServerConnection::openCursor(IDBTransactionBackend&amp;, const OpenCursorOperation&amp;, std::function&lt;void(PassRefPtr&lt;IDBDatabaseError&gt;)&gt; completionCallback)
</span><span class="cx"> {
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessDatabasesIndexedDBWebIDBServerConnectionh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.h (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.h        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.h        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -33,6 +33,10 @@
</span><span class="cx"> #include &lt;WebCore/IDBDatabaseMetadata.h&gt;
</span><span class="cx"> #include &lt;WebCore/IDBServerConnection.h&gt;
</span><span class="cx"> 
</span><ins>+namespace WebCore {
+struct IDBKeyData;
+}
+
</ins><span class="cx"> namespace WebKit {
</span><span class="cx"> 
</span><span class="cx"> class AsyncRequest;
</span><span class="lines">@@ -102,6 +106,7 @@
</span><span class="cx">     void didChangeDatabaseVersion(uint64_t requestID, bool success);
</span><span class="cx">     void didCreateObjectStore(uint64_t requestID, bool success);
</span><span class="cx">     void didDeleteObjectStore(uint64_t requestID, bool success);
</span><ins>+    void didPutRecord(uint64_t requestID, const WebCore::IDBKeyData&amp;, uint32_t errorCode, const String&amp; errorMessage);
</ins><span class="cx"> 
</span><span class="cx">     uint64_t m_serverConnectionIdentifier;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessDatabasesIndexedDBWebIDBServerConnectionmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in (162565 => 162566)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in        2014-01-22 23:47:24 UTC (rev 162565)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in        2014-01-22 23:48:27 UTC (rev 162566)
</span><span class="lines">@@ -34,6 +34,7 @@
</span><span class="cx">     DidChangeDatabaseVersion(uint64_t requestID, bool success)
</span><span class="cx">     DidCreateObjectStore(uint64_t requestID, bool success)
</span><span class="cx">     DidDeleteObjectStore(uint64_t requestID, bool success)
</span><ins>+    DidPutRecord(uint64_t requestID, WebCore::IDBKeyData resultKey, uint32_t errorCode, String errorMessage)
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(INDEXED_DATABASE) &amp;&amp; ENABLE(DATABASE_PROCESS)
</span></span></pre>
</div>
</div>

</body>
</html>