<!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>[162047] 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/162047">162047</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2014-01-14 22:31:16 -0800 (Tue, 14 Jan 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>IDB: create object store support
&lt;rdar://problem/15779639&gt; and https://bugs.webkit.org/show_bug.cgi?id=127011

Reviewed by Anders Carlsson.

Source/WebCore:

Split the 3 objects declared in IDBDatabaseMetadata into their own header files:
* Modules/indexeddb/IDBDatabaseMetadata.h:
* Modules/indexeddb/IDBIndexMetadata.h:
(WebCore::IDBIndexMetadata::IDBIndexMetadata):
* Modules/indexeddb/IDBObjectStoreMetadata.h:
(WebCore::IDBObjectStoreMetadata::IDBObjectStoreMetadata):

Add cross thread copying for IDBDatabaseMetadata:
* platform/CrossThreadCopier.cpp:
(WebCore::IDBIndexMetadata&gt;::copy):
(WebCore::IDBObjectStoreMetadata&gt;::copy):
* platform/CrossThreadCopier.h:

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

Source/WebKit2:

Add messaging/callback infrastructure for creating object stores:
* DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp:
(WebKit::DatabaseProcessIDBConnection::createObjectStore):
* DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h:
* DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in:

* WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp:
(WebKit::WebIDBServerConnection::createObjectStore):
(WebKit::WebIDBServerConnection::didCreateObjectStore):
* WebProcess/Databases/IndexedDB/WebIDBServerConnection.h:
* WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in:

* DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp:
(WebKit::UniqueIDBDatabase::didChangeDatabaseVersion):
(WebKit::UniqueIDBDatabase::didCreateObjectStore):
(WebKit::UniqueIDBDatabase::didCompleteBoolRequest):
(WebKit::UniqueIDBDatabase::createObjectStore):
(WebKit::UniqueIDBDatabase::createObjectStoreInBackingStore):
* DatabaseProcess/IndexedDB/UniqueIDBDatabase.h:

* DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h:

Add serialization helpers to save/restore an IDBKeyPath to/from disk:
* DatabaseProcess/IndexedDB/IDBSerialization.cpp:
(WebKit::serializeIDBKeyPath):
(WebKit::deserializeIDBKeyPath):
* DatabaseProcess/IndexedDB/IDBSerialization.h:

Add object store metadata to the schema, and save/restore the metadata:
* DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp:
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::createAndPopulateInitialMetadata):
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::extractExistingMetadata):
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::createObjectStore):
* DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h:

* Scripts/webkit2/messages.py:
(struct_or_class):
* WebKit2.xcodeproj/project.pbxproj:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBDatabaseMetadatah">trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseMetadata.h</a></li>
<li><a href="#trunkSourceWebCoreWebCoreexpin">trunk/Source/WebCore/WebCore.exp.in</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="#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="#trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj">trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj</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="#trunkSourceWebCoreModulesindexeddbIDBIndexMetadatah">trunk/Source/WebCore/Modules/indexeddb/IDBIndexMetadata.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBObjectStoreMetadatah">trunk/Source/WebCore/Modules/indexeddb/IDBObjectStoreMetadata.h</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>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebCore/ChangeLog        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -1,3 +1,26 @@
</span><ins>+2014-01-14  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IDB: create object store support
+        &lt;rdar://problem/15779639&gt; and https://bugs.webkit.org/show_bug.cgi?id=127011
+
+        Reviewed by Anders Carlsson.
+
+        Split the 3 objects declared in IDBDatabaseMetadata into their own header files:
+        * Modules/indexeddb/IDBDatabaseMetadata.h:
+        * Modules/indexeddb/IDBIndexMetadata.h:
+        (WebCore::IDBIndexMetadata::IDBIndexMetadata):
+        * Modules/indexeddb/IDBObjectStoreMetadata.h:
+        (WebCore::IDBObjectStoreMetadata::IDBObjectStoreMetadata):
+
+        Add cross thread copying for IDBDatabaseMetadata:
+        * platform/CrossThreadCopier.cpp:
+        (WebCore::IDBIndexMetadata&gt;::copy):
+        (WebCore::IDBObjectStoreMetadata&gt;::copy):
+        * platform/CrossThreadCopier.h:
+
+        * WebCore.exp.in:
+        * WebCore.xcodeproj/project.pbxproj:
+
</ins><span class="cx"> 2014-01-14  Joseph Pecoraro  &lt;pecoraro@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [iOS] Crash in NavigatorBase::vendor loading apple.com
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBDatabaseMetadatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseMetadata.h (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseMetadata.h        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseMetadata.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -29,59 +29,12 @@
</span><span class="cx"> #ifndef IDBDatabaseMetadata_h
</span><span class="cx"> #define IDBDatabaseMetadata_h
</span><span class="cx"> 
</span><del>-#include &quot;IDBKeyPath.h&quot;
-#include &lt;stdint.h&gt;
-#include &lt;wtf/HashMap.h&gt;
-#include &lt;wtf/text/StringHash.h&gt;
-#include &lt;wtf/text/WTFString.h&gt;
</del><ins>+#include &quot;IDBObjectStoreMetadata.h&quot;
</ins><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><del>-struct IDBIndexMetadata {
-    IDBIndexMetadata() { }
-    IDBIndexMetadata(const String&amp; name, int64_t id, const IDBKeyPath&amp; keyPath, bool unique, bool multiEntry)
-        : name(name)
-        , id(id)
-        , keyPath(keyPath)
-        , unique(unique)
-        , multiEntry(multiEntry) { }
-    String name;
-    int64_t id;
-    IDBKeyPath keyPath;
-    bool unique;
-    bool multiEntry;
-
-    IDBIndexMetadata isolatedCopy() const;
-
-    static const int64_t InvalidId = -1;
-};
-
-struct IDBObjectStoreMetadata {
-    IDBObjectStoreMetadata() { }
-    IDBObjectStoreMetadata(const String&amp; name, int64_t id, const IDBKeyPath&amp; keyPath, bool autoIncrement, int64_t maxIndexId)
-        : name(name)
-        , id(id)
-        , keyPath(keyPath)
-        , autoIncrement(autoIncrement)
-        , maxIndexId(maxIndexId)
-    {
-    }
-    String name;
-    int64_t id;
-    IDBKeyPath keyPath;
-    bool autoIncrement;
-    int64_t maxIndexId;
-
-    static const int64_t InvalidId = -1;
-
-    typedef HashMap&lt;int64_t, IDBIndexMetadata&gt; IndexMap;
-    IndexMap indexes;
-
-    IDBObjectStoreMetadata isolatedCopy() const;
-};
-
</del><span class="cx"> struct IDBDatabaseMetadata {
</span><span class="cx"> 
</span><span class="cx">     // FIXME: These are only here to support the LevelDB backend which incorrectly handles versioning.
</span><span class="lines">@@ -100,8 +53,6 @@
</span><span class="cx">         DefaultIntVersion = 0
</span><span class="cx">     };
</span><span class="cx"> 
</span><del>-    typedef HashMap&lt;int64_t, IDBObjectStoreMetadata&gt; ObjectStoreMap;
-
</del><span class="cx">     IDBDatabaseMetadata()
</span><span class="cx">         : id(0)
</span><span class="cx">         , version(0)
</span><span class="lines">@@ -122,13 +73,13 @@
</span><span class="cx">     uint64_t version;
</span><span class="cx">     int64_t maxObjectStoreId;
</span><span class="cx"> 
</span><ins>+    typedef HashMap&lt;int64_t, IDBObjectStoreMetadata&gt; ObjectStoreMap;
</ins><span class="cx">     ObjectStoreMap objectStores;
</span><span class="cx"> 
</span><span class="cx">     IDBDatabaseMetadata isolatedCopy() const;
</span><span class="cx"> };
</span><span class="cx"> 
</span><del>-}
</del><ins>+} // namespace WebCore
</ins><span class="cx"> 
</span><span class="cx"> #endif // ENABLE(INDEXED_DATABASE)
</span><del>-
</del><span class="cx"> #endif // IDBDatabaseMetadata_h
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBIndexMetadatahfromrev162045trunkSourceWebCoreModulesindexeddbIDBDatabaseMetadatah"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/Modules/indexeddb/IDBIndexMetadata.h (from rev 162045, trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseMetadata.h) (0 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBIndexMetadata.h                                (rev 0)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBIndexMetadata.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -0,0 +1,68 @@
</span><ins>+/*
+ * Copyright (C) 2012 Google 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.
+ * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE AND ITS CONTRIBUTORS &quot;AS IS&quot; 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 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 IDBIndexMetadata_h
+#define IDBIndexMetadata_h
+
+#include &quot;IDBKeyPath.h&quot;
+#include &lt;wtf/HashMap.h&gt;
+#include &lt;wtf/text/WTFString.h&gt;
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+struct IDBIndexMetadata {
+    IDBIndexMetadata()
+    {
+    }
+
+    IDBIndexMetadata(const String&amp; name, int64_t id, const IDBKeyPath&amp; keyPath, bool unique, bool multiEntry)
+        : name(name)
+        , id(id)
+        , keyPath(keyPath)
+        , unique(unique)
+        , multiEntry(multiEntry)
+    {
+    }
+
+    String name;
+    int64_t id;
+    IDBKeyPath keyPath;
+    bool unique;
+    bool multiEntry;
+
+    IDBIndexMetadata isolatedCopy() const;
+
+    static const int64_t InvalidId = -1;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
+#endif // IDBIndexMetadata_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBObjectStoreMetadatahfromrev162045trunkSourceWebCoreModulesindexeddbIDBDatabaseMetadatah"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebCore/Modules/indexeddb/IDBObjectStoreMetadata.h (from rev 162045, trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseMetadata.h) (0 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBObjectStoreMetadata.h                                (rev 0)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBObjectStoreMetadata.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -0,0 +1,69 @@
</span><ins>+/*
+ * Copyright (C) 2012 Google 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.
+ * 3.  Neither the name of Apple Computer, Inc. (&quot;Apple&quot;) nor the names of
+ *     its contributors may be used to endorse or promote products derived
+ *     from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY GOOGLE AND ITS CONTRIBUTORS &quot;AS IS&quot; 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 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 IDBObjectStoreMetadata_h
+#define IDBObjectStoreMetadata_h
+
+#include &quot;IDBIndexMetadata.h&quot;
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+struct IDBObjectStoreMetadata {
+    IDBObjectStoreMetadata()
+    {
+    }
+
+    IDBObjectStoreMetadata(const String&amp; name, int64_t id, const IDBKeyPath&amp; keyPath, bool autoIncrement, int64_t maxIndexId)
+        : name(name)
+        , id(id)
+        , keyPath(keyPath)
+        , autoIncrement(autoIncrement)
+        , maxIndexId(maxIndexId)
+    {
+    }
+
+    String name;
+    int64_t id;
+    IDBKeyPath keyPath;
+    bool autoIncrement;
+    int64_t maxIndexId;
+
+    static const int64_t InvalidId = -1;
+
+    typedef HashMap&lt;int64_t, IDBIndexMetadata&gt; IndexMap;
+    IndexMap indexes;
+
+    IDBObjectStoreMetadata isolatedCopy() const;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
+#endif // IDBObjectStoreMetadata_h
</ins></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebCore/WebCore.exp.in        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -82,6 +82,8 @@
</span><span class="cx"> __ZN7WebCore10Pasteboard14writePlainTextERKN3WTF6StringENS0_18SmartReplaceOptionE
</span><span class="cx"> __ZN7WebCore10RenderView10compositorEv
</span><span class="cx"> __ZN7WebCore10RenderView7hitTestERKNS_14HitTestRequestERNS_13HitTestResultE
</span><ins>+__ZN7WebCore15SQLiteStatement13getColumnBlobEiRi
+__ZN7WebCore15SQLiteStatement14getColumnInt64Ei
</ins><span class="cx"> __ZN7WebCore10ScrollView16setParentVisibleEb
</span><span class="cx"> __ZN7WebCore10ScrollView17setUseFixedLayoutEb
</span><span class="cx"> __ZN7WebCore10ScrollView18setFixedLayoutSizeERKNS_7IntSizeE
</span><span class="lines">@@ -595,6 +597,8 @@
</span><span class="cx"> __ZN7WebCore15SQLiteStatement4stepEv
</span><span class="cx"> __ZN7WebCore15SQLiteStatement5resetEv
</span><span class="cx"> __ZN7WebCore15SQLiteStatement7bindIntEii
</span><ins>+__ZN7WebCore15SQLiteStatement8bindBlobEiPKvi
+__ZN7WebCore15SQLiteStatement9bindInt64Eix
</ins><span class="cx"> __ZN7WebCore15SQLiteStatement7prepareEv
</span><span class="cx"> __ZN7WebCore15SQLiteStatement8bindBlobEiRKN3WTF6StringE
</span><span class="cx"> __ZN7WebCore15SQLiteStatement8bindTextEiRKN3WTF6StringE
</span><span class="lines">@@ -3071,5 +3075,6 @@
</span><span class="cx"> __ZN7WebCore18IDBDatabaseBackend14openConnectionEN3WTF10PassRefPtrINS_12IDBCallbacksEEENS2_INS_20IDBDatabaseCallbacksEEExy
</span><span class="cx"> __ZN7WebCore18IDBDatabaseBackend6createERKN3WTF6StringES4_PNS_26IDBFactoryBackendInterfaceERNS_19IDBServerConnectionE
</span><span class="cx"> __ZN7WebCore18IDBDatabaseBackendD1Ev
</span><ins>+__ZN7WebCore21CrossThreadCopierBaseILb0ELb0ENS_22IDBObjectStoreMetadataEE4copyERKS1_
</ins><span class="cx"> __ZN7WebCore21CrossThreadCopierBaseILb0ELb0ENS_9IndexedDB15TransactionModeEE4copyERKS2_
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCorexcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -1879,6 +1879,8 @@
</span><span class="cx">                 51ABAE1B103C18FF008C5260 /* SocketStreamError.h in Headers */ = {isa = PBXBuildFile; fileRef = 51ABAE1A103C18FF008C5260 /* SocketStreamError.h */; };
</span><span class="cx">                 51ABAE1E103C1913008C5260 /* SocketStreamHandle.h in Headers */ = {isa = PBXBuildFile; fileRef = 51ABAE1C103C1913008C5260 /* SocketStreamHandle.h */; };
</span><span class="cx">                 51ABAE1F103C1913008C5260 /* SocketStreamHandleCFNet.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51ABAE1D103C1913008C5260 /* SocketStreamHandleCFNet.cpp */; };
</span><ins>+                51ABB5B8186D0ED1008391A1 /* IDBIndexMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 51ABB5B6186D0ED1008391A1 /* IDBIndexMetadata.h */; settings = {ATTRIBUTES = (Private, ); }; };
+                51ABB5B9186D0ED1008391A1 /* IDBObjectStoreMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 51ABB5B7186D0ED1008391A1 /* IDBObjectStoreMetadata.h */; settings = {ATTRIBUTES = (Private, ); }; };
</ins><span class="cx">                 51ABF64D16392E2800132A7A /* LoaderStrategy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51ABF64C16392E2800132A7A /* LoaderStrategy.cpp */; };
</span><span class="cx">                 51AF503616F100F60095B2E8 /* ResourceLoaderTypes.h in Headers */ = {isa = PBXBuildFile; fileRef = 51AF503516F100F60095B2E8 /* ResourceLoaderTypes.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="cx">                 51B07A441823248B00AA8D1A /* IDBPendingDeleteCall.h in Headers */ = {isa = PBXBuildFile; fileRef = 51B07A431823248B00AA8D1A /* IDBPendingDeleteCall.h */; settings = {ATTRIBUTES = (Private, ); }; };
</span><span class="lines">@@ -8831,6 +8833,8 @@
</span><span class="cx">                 51ABAE1A103C18FF008C5260 /* SocketStreamError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocketStreamError.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51ABAE1C103C1913008C5260 /* SocketStreamHandle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SocketStreamHandle.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51ABAE1D103C1913008C5260 /* SocketStreamHandleCFNet.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SocketStreamHandleCFNet.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                51ABB5B6186D0ED1008391A1 /* IDBIndexMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBIndexMetadata.h; sourceTree = &quot;&lt;group&gt;&quot;; };
+                51ABB5B7186D0ED1008391A1 /* IDBObjectStoreMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBObjectStoreMetadata.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 51ABF64C16392E2800132A7A /* LoaderStrategy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LoaderStrategy.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51AF503516F100F60095B2E8 /* ResourceLoaderTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ResourceLoaderTypes.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51B07A431823248B00AA8D1A /* IDBPendingDeleteCall.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBPendingDeleteCall.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -17687,6 +17691,7 @@
</span><span class="cx">                                 51D7198E181106E00016DC51 /* IDBIndex.cpp */,
</span><span class="cx">                                 51D7198F181106E00016DC51 /* IDBIndex.h */,
</span><span class="cx">                                 51D71990181106E00016DC51 /* IDBIndex.idl */,
</span><ins>+                                51ABB5B6186D0ED1008391A1 /* IDBIndexMetadata.h */,
</ins><span class="cx">                                 51D71991181106E00016DC51 /* IDBKey.cpp */,
</span><span class="cx">                                 51D71992181106E00016DC51 /* IDBKey.h */,
</span><span class="cx">                                 51D71993181106E00016DC51 /* IDBKeyPath.cpp */,
</span><span class="lines">@@ -17697,6 +17702,7 @@
</span><span class="cx">                                 51D71999181106E00016DC51 /* IDBObjectStore.cpp */,
</span><span class="cx">                                 51D7199A181106E00016DC51 /* IDBObjectStore.h */,
</span><span class="cx">                                 51D7199B181106E00016DC51 /* IDBObjectStore.idl */,
</span><ins>+                                51ABB5B7186D0ED1008391A1 /* IDBObjectStoreMetadata.h */,
</ins><span class="cx">                                 51D7199C181106E00016DC51 /* IDBOpenDBRequest.cpp */,
</span><span class="cx">                                 51D7199D181106E00016DC51 /* IDBOpenDBRequest.h */,
</span><span class="cx">                                 51D7199E181106E00016DC51 /* IDBOpenDBRequest.idl */,
</span><span class="lines">@@ -23687,6 +23693,7 @@
</span><span class="cx">                                 FC9A0F75164094CF003D6B8D /* DOMWindowCSS.h in Headers */,
</span><span class="cx">                                 51FA2D78152132B300C1BA0B /* DOMWindowExtension.h in Headers */,
</span><span class="cx">                                 97B38E27151C4271004622E9 /* DOMWindowNotifications.h in Headers */,
</span><ins>+                                51ABB5B9186D0ED1008391A1 /* IDBObjectStoreMetadata.h in Headers */,
</ins><span class="cx">                                 97D2AD0414B823A60093DF32 /* DOMWindowProperty.h in Headers */,
</span><span class="cx">                                 0779BF0E18453168000B6AE7 /* HTMLMediaElementMediaStream.h in Headers */,
</span><span class="cx">                                 89F60B11157F686E0075E157 /* DOMWindowQuota.h in Headers */,
</span><span class="lines">@@ -24257,6 +24264,7 @@
</span><span class="cx">                                 14CF78A609F58CD800EB3665 /* JSCSSValue.h in Headers */,
</span><span class="cx">                                 A8D05FAC0A23B30F005E7203 /* JSCSSValueList.h in Headers */,
</span><span class="cx">                                 E4778B80115A581A00B5D372 /* JSCustomEvent.h in Headers */,
</span><ins>+                                51ABB5B8186D0ED1008391A1 /* IDBIndexMetadata.h in Headers */,
</ins><span class="cx">                                 E10B937C0B73C00A003ED890 /* JSCustomXPathNSResolver.h in Headers */,
</span><span class="cx">                                 073BE34117D17E01002BD431 /* JSNavigatorMediaStream.h in Headers */,
</span><span class="cx">                                 1AE82F900CAAFA9D002237AE /* JSDatabase.h in Headers */,
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformCrossThreadCopiercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/CrossThreadCopier.cpp (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/CrossThreadCopier.cpp        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebCore/platform/CrossThreadCopier.cpp        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -93,6 +93,16 @@
</span><span class="cx">     return metadata.isolatedCopy();
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+CrossThreadCopierBase&lt;false, false, IDBIndexMetadata&gt;::Type CrossThreadCopierBase&lt;false, false, IDBIndexMetadata&gt;::copy(const IDBIndexMetadata&amp; metadata)
+{
+    return metadata.isolatedCopy();
+}
+
+CrossThreadCopierBase&lt;false, false, IDBObjectStoreMetadata&gt;::Type CrossThreadCopierBase&lt;false, false, IDBObjectStoreMetadata&gt;::copy(const IDBObjectStoreMetadata&amp; metadata)
+{
+    return metadata.isolatedCopy();
+}
+
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx"> // Test CrossThreadCopier using COMPILE_ASSERT.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformCrossThreadCopierh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/CrossThreadCopier.h (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/CrossThreadCopier.h        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebCore/platform/CrossThreadCopier.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -166,6 +166,18 @@
</span><span class="cx">         typedef IDBDatabaseMetadata Type;
</span><span class="cx">         static Type copy(const IDBDatabaseMetadata&amp;);
</span><span class="cx">     };
</span><ins>+
+    struct IDBIndexMetadata;
+    template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, IDBIndexMetadata&gt; {
+        typedef IDBIndexMetadata Type;
+        static Type copy(const IDBIndexMetadata&amp;);
+    };
+
+    struct IDBObjectStoreMetadata;
+    template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, IDBObjectStoreMetadata&gt; {
+        typedef IDBObjectStoreMetadata Type;
+        static Type copy(const IDBObjectStoreMetadata&amp;);
+    };
</ins><span class="cx"> #endif
</span><span class="cx"> 
</span><span class="cx">     template&lt;typename T&gt;
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/ChangeLog        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -1,3 +1,49 @@
</span><ins>+2014-01-14  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IDB: create object store support
+        &lt;rdar://problem/15779639&gt; and https://bugs.webkit.org/show_bug.cgi?id=127011
+
+        Reviewed by Anders Carlsson.
+
+        Add messaging/callback infrastructure for creating object stores:
+        * DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp:
+        (WebKit::DatabaseProcessIDBConnection::createObjectStore):
+        * DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h:
+        * DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in:
+
+        * WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp:
+        (WebKit::WebIDBServerConnection::createObjectStore):
+        (WebKit::WebIDBServerConnection::didCreateObjectStore):
+        * WebProcess/Databases/IndexedDB/WebIDBServerConnection.h:
+        * WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in:
+
+        * DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp:
+        (WebKit::UniqueIDBDatabase::didChangeDatabaseVersion):
+        (WebKit::UniqueIDBDatabase::didCreateObjectStore):
+        (WebKit::UniqueIDBDatabase::didCompleteBoolRequest):
+        (WebKit::UniqueIDBDatabase::createObjectStore):
+        (WebKit::UniqueIDBDatabase::createObjectStoreInBackingStore):
+        * DatabaseProcess/IndexedDB/UniqueIDBDatabase.h:
+
+        * DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h:
+
+        Add serialization helpers to save/restore an IDBKeyPath to/from disk:
+        * DatabaseProcess/IndexedDB/IDBSerialization.cpp:
+        (WebKit::serializeIDBKeyPath):
+        (WebKit::deserializeIDBKeyPath):
+        * DatabaseProcess/IndexedDB/IDBSerialization.h:
+
+        Add object store metadata to the schema, and save/restore the metadata:
+        * DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp:
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::createAndPopulateInitialMetadata):
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::extractExistingMetadata):
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::createObjectStore):
+        * DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h:
+
+        * Scripts/webkit2/messages.py:
+        (struct_or_class):
+        * WebKit2.xcodeproj/project.pbxproj:
+
</ins><span class="cx"> 2014-01-14  Jae Hyun Park  &lt;jae.park@company100.net&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Unreviewed build fix after r162034
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBDatabaseProcessIDBConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.cpp        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -155,6 +155,17 @@
</span><span class="cx">     });
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void DatabaseProcessIDBConnection::createObjectStore(uint64_t requestID, int64_t transactionID, WebCore::IDBObjectStoreMetadata metadata)
+{
+    ASSERT(m_uniqueIDBDatabase);
+
+    LOG(IDB, &quot;DatabaseProcess createObjectStore request ID %llu, object store name '%s'&quot;, requestID, metadata.name.utf8().data());
+    RefPtr&lt;DatabaseProcessIDBConnection&gt; connection(this);
+    m_uniqueIDBDatabase-&gt;createObjectStore(IDBTransactionIdentifier(*this, transactionID), metadata, [connection, requestID](bool success) {
+        connection-&gt;send(Messages::WebIDBServerConnection::DidCreateObjectStore(requestID, success));
+    });
+}
+
</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 (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -69,8 +69,8 @@
</span><span class="cx">     void resetTransaction(uint64_t requestID, int64_t transactionID);
</span><span class="cx">     void rollbackTransaction(uint64_t requestID, int64_t transactionID);
</span><span class="cx">     void changeDatabaseVersion(uint64_t requestID, int64_t transactionID, uint64_t newVersion);
</span><ins>+    void createObjectStore(uint64_t requestID, int64_t transactionID, WebCore::IDBObjectStoreMetadata);
</ins><span class="cx"> 
</span><del>-
</del><span class="cx">     Ref&lt;DatabaseToWebProcessConnection&gt; m_connection;
</span><span class="cx">     uint64_t m_serverConnectionIdentifier;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBDatabaseProcessIDBConnectionmessagesin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/DatabaseProcessIDBConnection.messages.in        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx">     RollbackTransaction(uint64_t requestID, int64_t transactionID)
</span><span class="cx">     
</span><span class="cx">     ChangeDatabaseVersion(uint64_t requestID, int64_t transactionID, uint64_t newVersion)
</span><ins>+    CreateObjectStore(uint64_t requestID, int64_t transactionID, WebCore::IDBObjectStoreMetadata objectStoreMetadata)
</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="trunkSourceWebKit2DatabaseProcessIndexedDBIDBSerializationcppfromrev162045trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabaseBackingStoreh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.cpp (from rev 162045, trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h) (0 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.cpp                                (rev 0)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.cpp        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -0,0 +1,53 @@
</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;IDBSerialization.h&quot;
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include &quot;ArgumentEncoder.h&quot;
+#include &lt;WebCore/IDBKeyPath.h&gt;
+
+using namespace WebCore;
+
+namespace WebKit {
+
+std::unique_ptr&lt;Vector&lt;uint8_t&gt;&gt; serializeIDBKeyPath(const WebCore::IDBKeyPath&amp;)
+{
+    // FIXME: Once we have a serialization solution appropriate for persistent storage to disk, use that here.
+
+    return nullptr;
+}
+
+std::unique_ptr&lt;WebCore::IDBKeyPath&gt; deserializeIDBKeyPath(const uint8_t*, size_t)
+{
+    // FIXME: Once we have a serialization solution appropriate for persistent storage to disk, use that here.
+
+    return nullptr;
+}
+
+} // namespace WebKit
+
+#endif // ENABLE(INDEXED_DATABASE)
</ins></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBIDBSerializationhfromrev162045trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabaseBackingStoreh"></a>
<div class="copfile"><h4>Copied: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.h (from rev 162045, trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h) (0 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.h                                (rev 0)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/IDBSerialization.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -0,0 +1,45 @@
</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 IDBSerialization_h
+#define IDBSerialization_h
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include &lt;wtf/Vector.h&gt;
+
+namespace WebCore {
+class IDBKeyPath;
+}
+
+namespace WebKit {
+
+std::unique_ptr&lt;Vector&lt;uint8_t&gt;&gt; serializeIDBKeyPath(const WebCore::IDBKeyPath&amp;);
+std::unique_ptr&lt;WebCore::IDBKeyPath&gt; deserializeIDBKeyPath(const uint8_t* buffer, size_t bufferSize);
+
+} // namespace WebKit
+
+#endif // ENABLE(INDEXED_DATABASE)
+#endif // IDBSerialization_h
</ins></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -313,12 +313,50 @@
</span><span class="cx"> 
</span><span class="cx"> void UniqueIDBDatabase::didChangeDatabaseVersion(uint64_t requestID, bool success)
</span><span class="cx"> {
</span><ins>+    didCompleteBoolRequest(requestID, success);
+}
+
+void UniqueIDBDatabase::didCreateObjectStore(uint64_t requestID, bool success)
+{
+    didCompleteBoolRequest(requestID, success);
+}
+
+void UniqueIDBDatabase::didCompleteBoolRequest(uint64_t requestID, bool success)
+{
</ins><span class="cx">     RefPtr&lt;AsyncRequest&gt; request = m_pendingDatabaseTasks.take(requestID);
</span><span class="cx">     ASSERT(request);
</span><span class="cx"> 
</span><span class="cx">     request-&gt;completeRequest(success);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UniqueIDBDatabase::createObjectStore(const IDBTransactionIdentifier&amp; identifier, const WebCore::IDBObjectStoreMetadata&amp; metadata, std::function&lt;void(bool)&gt; successCallback)
+{
+    ASSERT(isMainThread());
+
+    if (!m_acceptingNewRequests) {
+        successCallback(false);
+        return;
+    }
+
+    ASSERT(!m_metadata-&gt;objectStores.contains(metadata.id));
+    m_metadata-&gt;objectStores.set(metadata.id, metadata);
+    int64_t addedObjectStoreID = metadata.id;
+
+    RefPtr&lt;AsyncRequest&gt; request = AsyncRequestImpl&lt;bool&gt;::create([this, addedObjectStoreID, successCallback](bool success) {
+        if (!success)
+            m_metadata-&gt;objectStores.remove(addedObjectStoreID);
+        successCallback(success);
+    }, [this, addedObjectStoreID, successCallback]() {
+        m_metadata-&gt;objectStores.remove(addedObjectStoreID);
+        successCallback(false);
+    });
+
+    uint64_t requestID = request-&gt;requestID();
+    m_pendingDatabaseTasks.add(requestID, request.release());
+
+    postDatabaseTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::createObjectStoreInBackingStore, requestID, identifier, metadata));
+}
+
</ins><span class="cx"> void UniqueIDBDatabase::openBackingStoreTransaction(const IDBTransactionIdentifier&amp; identifier, const Vector&lt;int64_t&gt;&amp; objectStoreIDs, WebCore::IndexedDB::TransactionMode mode)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!isMainThread());
</span><span class="lines">@@ -379,6 +417,16 @@
</span><span class="cx">     postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didChangeDatabaseVersion, requestID, success));
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void UniqueIDBDatabase::createObjectStoreInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&amp; identifier, const IDBObjectStoreMetadata&amp; metadata)
+{
+    ASSERT(!isMainThread());
+    ASSERT(m_backingStore);
+
+    bool success = m_backingStore-&gt;createObjectStore(identifier, metadata);
+
+    postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didCreateObjectStore, requestID, success));
+}
+
</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 (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.h        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -74,6 +74,7 @@
</span><span class="cx">     void rollbackTransaction(const IDBTransactionIdentifier&amp;, std::function&lt;void(bool)&gt; successCallback);
</span><span class="cx"> 
</span><span class="cx">     void changeDatabaseVersion(const IDBTransactionIdentifier&amp;, uint64_t newVersion, std::function&lt;void(bool)&gt; successCallback);
</span><ins>+    void createObjectStore(const IDBTransactionIdentifier&amp;, const WebCore::IDBObjectStoreMetadata&amp;, std::function&lt;void(bool)&gt; successCallback);
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     UniqueIDBDatabase(const UniqueIDBDatabaseIdentifier&amp;);
</span><span class="lines">@@ -113,6 +114,7 @@
</span><span class="cx">     void rollbackBackingStoreTransaction(const IDBTransactionIdentifier&amp;);
</span><span class="cx"> 
</span><span class="cx">     void changeDatabaseVersionInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&amp;, uint64_t newVersion);
</span><ins>+    void createObjectStoreInBackingStore(uint64_t requestID, const IDBTransactionIdentifier&amp;, const WebCore::IDBObjectStoreMetadata&amp;);
</ins><span class="cx"> 
</span><span class="cx">     void shutdownBackingStore();
</span><span class="cx"> 
</span><span class="lines">@@ -121,7 +123,9 @@
</span><span class="cx">     void didOpenBackingStoreAndReadMetadata(const WebCore::IDBDatabaseMetadata&amp;, bool success);
</span><span class="cx">     void didCompleteTransactionOperation(const IDBTransactionIdentifier&amp;, bool success);
</span><span class="cx">     void didChangeDatabaseVersion(uint64_t requestID, bool success);
</span><ins>+    void didCreateObjectStore(uint64_t requestID, bool success);
</ins><span class="cx">     void didShutdownBackingStore();
</span><ins>+    void didCompleteBoolRequest(uint64_t requestID, bool success);
</ins><span class="cx"> 
</span><span class="cx">     bool m_acceptingNewRequests;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabaseBackingStoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -33,6 +33,7 @@
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> struct IDBDatabaseMetadata;
</span><ins>+struct IDBObjectStoreMetadata;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> namespace WebKit {
</span><span class="lines">@@ -52,6 +53,7 @@
</span><span class="cx">     virtual bool rollbackTransaction(const IDBTransactionIdentifier&amp;) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual bool changeDatabaseVersion(const IDBTransactionIdentifier&amp;, uint64_t newVersion) = 0;
</span><ins>+    virtual bool createObjectStore(const IDBTransactionIdentifier&amp;, const WebCore::IDBObjectStoreMetadata&amp;) = 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 (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -28,6 +28,8 @@
</span><span class="cx"> 
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE) &amp;&amp; ENABLE(DATABASE_PROCESS)
</span><span class="cx"> 
</span><ins>+#include &quot;ArgumentDecoder.h&quot;
+#include &quot;IDBSerialization.h&quot;
</ins><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><span class="lines">@@ -75,6 +77,18 @@
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (!m_sqliteDB-&gt;executeCommand(&quot;CREATE TABLE ObjectStoreInfo (id INTEGER PRIMARY KEY NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, name TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, keyPath BLOB NOT NULL ON CONFLICT FAIL, autoInc INTEGER NOT NULL ON CONFLICT FAIL, maxIndexID INTEGER NOT NULL ON CONFLICT FAIL);&quot;)) {
+        LOG_ERROR(&quot;Could not create ObjectStoreInfo table in database (%i) - %s&quot;, m_sqliteDB-&gt;lastError(), m_sqliteDB-&gt;lastErrorMsg());
+        m_sqliteDB = nullptr;
+        return nullptr;
+    }
+
+    if (!m_sqliteDB-&gt;executeCommand(&quot;CREATE TABLE IndexInfo (id INTEGER PRIMARY KEY NOT NULL ON CONFLICT FAIL, name TEXT NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, keyPath BLOB NOT NULL ON CONFLICT FAIL, isUnique INTEGER NOT NULL ON CONFLICT FAIL, multiEntry INTEGER NOT NULL ON CONFLICT FAIL);&quot;)) {
+        LOG_ERROR(&quot;Could not create IndexInfo 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">@@ -108,10 +122,17 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><ins>+    if (!m_sqliteDB-&gt;executeCommand(ASCIILiteral(&quot;INSERT INTO IDBDatabaseInfo VALUES ('MaxObjectStoreID', 1);&quot;))) {
+        LOG_ERROR(&quot;Could not insert default version into IDBDatabaseInfo table (%i) - %s&quot;, m_sqliteDB-&gt;lastError(), m_sqliteDB-&gt;lastErrorMsg());
+        m_sqliteDB = nullptr;
+        return nullptr;
+    }
+
</ins><span class="cx">     // This initial metadata matches the default values we just put into the metadata database.
</span><span class="cx">     auto metadata = std::make_unique&lt;IDBDatabaseMetadata&gt;();
</span><span class="cx">     metadata-&gt;name = m_identifier.databaseName();
</span><span class="cx">     metadata-&gt;version = 0;
</span><ins>+    metadata-&gt;maxObjectStoreId = 1;
</ins><span class="cx"> 
</span><span class="cx">     return metadata;
</span><span class="cx"> }
</span><span class="lines">@@ -154,7 +175,42 @@
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // FIXME: Once we save ObjectStores and indexes we need to extract their metadata, also.
</del><ins>+    {
+        SQLiteStatement sql(*m_sqliteDB, ASCIILiteral(&quot;SELECT id, name, keyPath, autoInc, maxIndexID FROM ObjectStoreInfo;&quot;));
+        if (sql.prepare() != SQLResultOk)
+            return nullptr;
+
+        int result = sql.step();
+        while (result == SQLResultRow) {
+            IDBObjectStoreMetadata metadata;
+            metadata.id = sql.getColumnInt64(0);
+            metadata.name = sql.getColumnText(1);
+
+            int keyPathSize;
+            const uint8_t* keyPathBuffer = static_cast&lt;const uint8_t*&gt;(sql.getColumnBlob(2, keyPathSize));
+
+            std::unique_ptr&lt;IDBKeyPath&gt; keyPath = deserializeIDBKeyPath(keyPathBuffer, keyPathSize);
+
+            if (!keyPath) {
+                LOG_ERROR(&quot;Unable to extract key path metadata from database&quot;);
+                return nullptr;
+            }
+
+            metadata.keyPath = *keyPath;
+            metadata.autoIncrement = sql.getColumnInt(3);
+            metadata.maxIndexId = sql.getColumnInt64(4);
+
+            result = sql.step();
+        }
+
+        if (result != SQLResultDone) {
+            LOG_ERROR(&quot;Error fetching object store metadata from database on disk&quot;);
+            return nullptr;
+        }
+    }
+
+    // FIXME: Once we save indexes we need to extract their metadata, also.
+
</ins><span class="cx">     return metadata;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -290,6 +346,43 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+bool UniqueIDBDatabaseBackingStoreSQLite::createObjectStore(const IDBTransactionIdentifier&amp; identifier, const IDBObjectStoreMetadata&amp; metadata)
+{
+    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 change database version with an establish, in-progress transaction&quot;);
+        return false;
+    }
+    if (transaction-&gt;mode() != IndexedDB::TransactionMode::VersionChange) {
+        LOG_ERROR(&quot;Attempt to change database version during a non version-change transaction&quot;);
+        return false;
+    }
+
+    std::unique_ptr&lt;Vector&lt;uint8_t&gt;&gt; keyPathBlob = serializeIDBKeyPath(metadata.keyPath);
+    if (!keyPathBlob) {
+        LOG_ERROR(&quot;Unable to serialize IDBKeyPath to save in database&quot;);
+        return false;
+    }
+
+    SQLiteStatement sql(*m_sqliteDB, ASCIILiteral(&quot;INSERT INTO ObjectStoreInfo VALUES (?, ?, ?, ?, ?);&quot;));
+    if (sql.prepare() != SQLResultOk
+        || sql.bindInt64(1, metadata.id) != SQLResultOk
+        || sql.bindText(2, metadata.name) != SQLResultOk
+        || sql.bindBlob(3, keyPathBlob-&gt;data(), keyPathBlob-&gt;size()) != SQLResultOk
+        || sql.bindInt(4, metadata.autoIncrement) != SQLResultOk
+        || sql.bindInt64(5, metadata.maxIndexId) != SQLResultOk
+        || sql.step() != SQLResultDone) {
+        LOG_ERROR(&quot;Could not add object store '%s' to in ObjectStoreInfo table (%i) - %s&quot;, metadata.name.utf8().data(), m_sqliteDB-&gt;lastError(), m_sqliteDB-&gt;lastErrorMsg());
+        return false;
+    }
+
+    return true;
+}
+
</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 (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -61,6 +61,7 @@
</span><span class="cx">     virtual bool rollbackTransaction(const IDBTransactionIdentifier&amp;) OVERRIDE;
</span><span class="cx"> 
</span><span class="cx">     virtual bool changeDatabaseVersion(const IDBTransactionIdentifier&amp;, uint64_t newVersion) OVERRIDE;
</span><ins>+    virtual bool createObjectStore(const IDBTransactionIdentifier&amp;, const WebCore::IDBObjectStoreMetadata&amp;) OVERRIDE;
</ins><span class="cx"> 
</span><span class="cx"> private:
</span><span class="cx">     UniqueIDBDatabaseBackingStoreSQLite(const UniqueIDBDatabaseIdentifier&amp;, const String&amp; databaseDirectory);
</span></span></pre></div>
<a id="trunkSourceWebKit2Scriptswebkit2messagespy"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/Scripts/webkit2/messages.py (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/Scripts/webkit2/messages.py        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/Scripts/webkit2/messages.py        2014-01-15 06:31:16 UTC (rev 162047)
</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::IDBObjectStoreMetadata',
</ins><span class="cx">         'WebCore::IdentityTransformOperation',
</span><span class="cx">         'WebCore::KeypressCommand',
</span><span class="cx">         'WebCore::Length',
</span></span></pre></div>
<a id="trunkSourceWebKit2WebKit2xcodeprojprojectpbxproj"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -683,6 +683,8 @@
</span><span class="cx">                 51829DA61637C70C000953D6 /* NetworkResourceLoadScheduler.h in Headers */ = {isa = PBXBuildFile; fileRef = 51829DA41637C70C000953D6 /* NetworkResourceLoadScheduler.h */; };
</span><span class="cx">                 51834592134532E90092B696 /* WebIconDatabaseClient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51834590134532E80092B696 /* WebIconDatabaseClient.cpp */; };
</span><span class="cx">                 51834593134532E90092B696 /* WebIconDatabaseClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 51834591134532E80092B696 /* WebIconDatabaseClient.h */; };
</span><ins>+                518353DA1885BF8C00D9FE44 /* IDBSerialization.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 518353D81885BF8C00D9FE44 /* IDBSerialization.cpp */; };
+                518353DB1885BF8C00D9FE44 /* IDBSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 518353D91885BF8C00D9FE44 /* IDBSerialization.h */; };
</ins><span class="cx">                 5183DDEC1630BDFC008BE5C7 /* NetworkProcessConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5105B0D4162F7A7A00E27709 /* NetworkProcessConnection.cpp */; };
</span><span class="cx">                 51871B5B127CB89D00F76232 /* WebContextMenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51871B59127CB89D00F76232 /* WebContextMenu.cpp */; };
</span><span class="cx">                 51871B5C127CB89D00F76232 /* WebContextMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 51871B5A127CB89D00F76232 /* WebContextMenu.h */; };
</span><span class="lines">@@ -2333,6 +2335,8 @@
</span><span class="cx">                 51829DA41637C70C000953D6 /* NetworkResourceLoadScheduler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkResourceLoadScheduler.h; path = NetworkProcess/NetworkResourceLoadScheduler.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51834590134532E80092B696 /* WebIconDatabaseClient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebIconDatabaseClient.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51834591134532E80092B696 /* WebIconDatabaseClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebIconDatabaseClient.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><ins>+                518353D81885BF8C00D9FE44 /* IDBSerialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBSerialization.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
+                518353D91885BF8C00D9FE44 /* IDBSerialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBSerialization.h; sourceTree = &quot;&lt;group&gt;&quot;; };
</ins><span class="cx">                 5183B3931379F85C00E8754E /* Shim.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Shim.xcconfig; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 5184BC4A132E907A006B9E28 /* WebIconDatabase.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebIconDatabase.messages.in; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="cx">                 51871B59127CB89D00F76232 /* WebContextMenu.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebContextMenu.cpp; sourceTree = &quot;&lt;group&gt;&quot;; };
</span><span class="lines">@@ -4510,6 +4514,8 @@
</span><span class="cx">                                 51D0D42E183B34130097041D /* DatabaseProcessIDBConnection.cpp */,
</span><span class="cx">                                 51D0D42F183B34130097041D /* DatabaseProcessIDBConnection.h */,
</span><span class="cx">                                 51D0D430183B34130097041D /* DatabaseProcessIDBConnection.messages.in */,
</span><ins>+                                518353D81885BF8C00D9FE44 /* IDBSerialization.cpp */,
+                                518353D91885BF8C00D9FE44 /* IDBSerialization.h */,
</ins><span class="cx">                                 51D54A72185BAC42000CAED2 /* IDBTransactionIdentifier.h */,
</span><span class="cx">                                 515E772D184015800007203F /* UniqueIDBDatabase.cpp */,
</span><span class="cx">                                 515E772E184015800007203F /* UniqueIDBDatabase.h */,
</span><span class="lines">@@ -6408,6 +6414,7 @@
</span><span class="cx">                                 31D5929F166E060000E6BF02 /* WebPlugInClient.h in Headers */,
</span><span class="cx">                                 1AC8702D130B49A2002C1257 /* WebPluginSiteDataManager.h in Headers */,
</span><span class="cx">                                 BCB9F8B01124E07700A137E0 /* WebPolicyClient.h in Headers */,
</span><ins>+                                518353DB1885BF8C00D9FE44 /* IDBSerialization.h in Headers */,
</ins><span class="cx">                                 BC5744F012638FB3006F0F12 /* WebPopupItem.h in Headers */,
</span><span class="cx">                                 51D54A73185BAC42000CAED2 /* IDBTransactionIdentifier.h in Headers */,
</span><span class="cx">                                 D3B9484711FF4B6500032B39 /* WebPopupMenu.h in Headers */,
</span><span class="lines">@@ -7512,6 +7519,7 @@
</span><span class="cx">                                 51DD9F2816367DA2001578E9 /* NetworkConnectionToWebProcessMessageReceiver.cpp in Sources */,
</span><span class="cx">                                 51795568162876CF00FA43B6 /* NetworkProcess.cpp in Sources */,
</span><span class="cx">                                 5183DDEC1630BDFC008BE5C7 /* NetworkProcessConnection.cpp in Sources */,
</span><ins>+                                518353DA1885BF8C00D9FE44 /* IDBSerialization.cpp in Sources */,
</ins><span class="cx">                                 517CF0E3163A486C00C2950E /* NetworkProcessConnectionMessageReceiver.cpp in Sources */,
</span><span class="cx">                                 51795570162877CF00FA43B6 /* NetworkProcessCreationParameters.cpp in Sources */,
</span><span class="cx">                                 51795567162876CB00FA43B6 /* NetworkProcessMac.mm in Sources */,
</span></span></pre></div>
<a id="trunkSourceWebKit2WebProcessDatabasesIndexedDBWebIDBServerConnectioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.cpp        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -258,10 +258,36 @@
</span><span class="cx"> {
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void WebIDBServerConnection::createObjectStore(IDBTransactionBackend&amp;, const CreateObjectStoreOperation&amp;, std::function&lt;void(PassRefPtr&lt;IDBDatabaseError&gt;)&gt; completionCallback)
</del><ins>+void WebIDBServerConnection::createObjectStore(IDBTransactionBackend&amp; transaction, const CreateObjectStoreOperation&amp; operation, std::function&lt;void(PassRefPtr&lt;IDBDatabaseError&gt;)&gt; completionCallback)
</ins><span class="cx"> {
</span><ins>+    RefPtr&lt;AsyncRequest&gt; serverRequest = AsyncRequestImpl&lt;PassRefPtr&lt;IDBDatabaseError&gt;&gt;::create(completionCallback);
+
+    String objectStoreName = operation.objectStoreMetadata().name;
+    serverRequest-&gt;setAbortHandler([objectStoreName, completionCallback]() {
+        completionCallback(IDBDatabaseError::create(IDBDatabaseException::UnknownError, String::format(&quot;Unknown error occured creating object store '%s'&quot;, objectStoreName.utf8().data())));
+    });
+
+    uint64_t requestID = serverRequest-&gt;requestID();
+    ASSERT(!m_serverRequests.contains(requestID));
+    m_serverRequests.add(requestID, serverRequest.release());
+
+    LOG(IDB, &quot;WebProcess createObjectStore '%s' in transaction ID %llu (request ID %llu)&quot;, operation.objectStoreMetadata().name.utf8().data(), transaction.id(), requestID);
+
+    send(Messages::DatabaseProcessIDBConnection::CreateObjectStore(requestID, transaction.id(), operation.objectStoreMetadata()));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void WebIDBServerConnection::didCreateObjectStore(uint64_t requestID, bool success)
+{
+    LOG(IDB, &quot;WebProcess didCreateObjectStore request ID %llu&quot;, requestID);
+
+    RefPtr&lt;AsyncRequest&gt; serverRequest = m_serverRequests.take(requestID);
+
+    if (!serverRequest)
+        return;
+
+    serverRequest-&gt;completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, &quot;Unknown error occured creating object store&quot;));
+}
+
</ins><span class="cx"> void WebIDBServerConnection::createIndex(IDBTransactionBackend&amp;, const CreateIndexOperation&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 (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.h        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.h        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -100,6 +100,7 @@
</span><span class="cx">     void didResetTransaction(uint64_t requestID, bool success);
</span><span class="cx">     void didRollbackTransaction(uint64_t requestID, bool success);
</span><span class="cx">     void didChangeDatabaseVersion(uint64_t requestID, bool success);
</span><ins>+    void didCreateObjectStore(uint64_t requestID, bool success);
</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 (162046 => 162047)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in        2014-01-15 06:21:52 UTC (rev 162046)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBServerConnection.messages.in        2014-01-15 06:31:16 UTC (rev 162047)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx">     DidRollbackTransaction(uint64_t requestID, bool success)
</span><span class="cx"> 
</span><span class="cx">     DidChangeDatabaseVersion(uint64_t requestID, bool success)
</span><ins>+    DidCreateObjectStore(uint64_t requestID, bool success)
</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>