<!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>[163482] trunk</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/163482">163482</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2014-02-05 15:59:52 -0800 (Wed, 05 Feb 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>IDB: storage/indexeddb/mozilla/autoincrement-indexes.html fails
https://bugs.webkit.org/show_bug.cgi?id=128257

Reviewed by Sam Weinig.

Source/WebCore:

Tests: storage/indexeddb/mozilla/autoincrement-indexes.html

Add some IDBKeyData utility methods for WK2 to use:
* Modules/indexeddb/IDBKeyData.cpp:
(WebCore::IDBKeyData::setArrayValue):
(WebCore::IDBKeyData::setStringValue):
(WebCore::IDBKeyData::setDateValue):
(WebCore::IDBKeyData::setNumberValue):
* Modules/indexeddb/IDBKeyData.h:

* WebCore.exp.in:

Source/WebKit2:

* DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp:
(WebKit::UniqueIDBDatabase::putRecordInBackingStore): Write the correct key to the index if it was auto generated.
(WebKit::UniqueIDBDatabase::getRecordFromBackingStore): If this is an auto increment object store with
  a non-empty key path, save the key path to the get result.

* DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h:
* DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp:
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::createAndPopulateInitialMetadata): The IndexRecord schema shouldn’t
  have key uniqueness.
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::putRecord): Take IDBKeyData instead of IDBKey.
(WebKit::UniqueIDBDatabaseBackingStoreSQLite::getIndexRecord): Fill in the primary key from the fetch.
* DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h:

LayoutTests:

* platform/mac-wk2/TestExpectations: Enable the test.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkLayoutTestsChangeLog">trunk/LayoutTests/ChangeLog</a></li>
<li><a href="#trunkLayoutTestsplatformmacwk2TestExpectations">trunk/LayoutTests/platform/mac-wk2/TestExpectations</a></li>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<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>
<li><a href="#trunkSourceWebCoreWebCoreexpin">trunk/Source/WebCore/WebCore.exp.in</a></li>
<li><a href="#trunkSourceWebKit2ChangeLog">trunk/Source/WebKit2/ChangeLog</a></li>
<li><a href="#trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabasecpp">trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp</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>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkLayoutTestsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/ChangeLog (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/ChangeLog        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/LayoutTests/ChangeLog        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -1,3 +1,12 @@
</span><ins>+2014-02-05  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IDB: storage/indexeddb/mozilla/autoincrement-indexes.html fails
+        https://bugs.webkit.org/show_bug.cgi?id=128257
+
+        Reviewed by Sam Weinig.
+
+        * platform/mac-wk2/TestExpectations: Enable the test.
+
</ins><span class="cx"> 2014-02-05  Brian Burg  &lt;bburg@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Web Inspector: add probe manager and model objects to the frontend
</span></span></pre></div>
<a id="trunkLayoutTestsplatformmacwk2TestExpectations"></a>
<div class="modfile"><h4>Modified: trunk/LayoutTests/platform/mac-wk2/TestExpectations (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/LayoutTests/platform/mac-wk2/TestExpectations        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/LayoutTests/platform/mac-wk2/TestExpectations        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -470,7 +470,9 @@
</span><span class="cx"> # All IndexedDB tests are skipped in WK1.
</span><span class="cx"> # Reenable individual tests here that are known to pass, with the eventual goal of re-enabling the entire directory.
</span><span class="cx"> storage/indexeddb/mozilla/add-twice-failure.html [ Pass ]
</span><ins>+storage/indexeddb/mozilla/autoincrement-indexes.html [ Pass ]
</ins><span class="cx"> 
</span><ins>+
</ins><span class="cx"> ### END OF (5) Features that are not supported in WebKit1, so skipped in mac/TestExpectations then re-enabled here
</span><span class="cx"> ########################################
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/Source/WebCore/ChangeLog        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -1,3 +1,22 @@
</span><ins>+2014-02-05  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IDB: storage/indexeddb/mozilla/autoincrement-indexes.html fails
+        https://bugs.webkit.org/show_bug.cgi?id=128257
+
+        Reviewed by Sam Weinig.
+
+        Tests: storage/indexeddb/mozilla/autoincrement-indexes.html
+
+        Add some IDBKeyData utility methods for WK2 to use:
+        * Modules/indexeddb/IDBKeyData.cpp:
+        (WebCore::IDBKeyData::setArrayValue):
+        (WebCore::IDBKeyData::setStringValue):
+        (WebCore::IDBKeyData::setDateValue):
+        (WebCore::IDBKeyData::setNumberValue):
+        * Modules/indexeddb/IDBKeyData.h:
+
+        * WebCore.exp.in:
+
</ins><span class="cx"> 2014-02-05  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Turn on ENABLE(8BIT_TEXTRUN) for everyone.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBKeyDatacpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.cpp        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -281,6 +281,38 @@
</span><span class="cx"> }
</span><span class="cx"> #endif
</span><span class="cx"> 
</span><ins>+void IDBKeyData::setArrayValue(const Vector&lt;IDBKeyData&gt;&amp; value)
+{
+    *this = IDBKeyData();
+    arrayValue = value;
+    type = IDBKey::ArrayType;
+    isNull = false;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void IDBKeyData::setStringValue(const String&amp; value)
+{
+    *this = IDBKeyData();
+    stringValue = value;
+    type = IDBKey::StringType;
+    isNull = false;
+}
+
+void IDBKeyData::setDateValue(double value)
+{
+    *this = IDBKeyData();
+    numberValue = value;
+    type = IDBKey::DateType;
+    isNull = false;
+}
+
+void IDBKeyData::setNumberValue(double value)
+{
+    *this = IDBKeyData();
+    numberValue = value;
+    type = IDBKey::NumberType;
+    isNull = false;
+}
+
+}
+
</ins><span class="cx"> #endif // ENABLE(INDEXED_DATABASE)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBKeyDatah"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.h (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.h        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBKeyData.h        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -58,6 +58,11 @@
</span><span class="cx">     //   - Returns zero if this IDBKeyData is equal to other.
</span><span class="cx">     int compare(const IDBKeyData&amp; other) const;
</span><span class="cx"> 
</span><ins>+    void setArrayValue(const Vector&lt;IDBKeyData&gt;&amp;);
+    void setStringValue(const String&amp;);
+    void setDateValue(double);
+    void setNumberValue(double);
+
</ins><span class="cx"> #ifndef NDEBUG
</span><span class="cx">     String loggingString() const;
</span><span class="cx"> #endif
</span></span></pre></div>
<a id="trunkSourceWebCoreWebCoreexpin"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/WebCore.exp.in (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/WebCore.exp.in        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/Source/WebCore/WebCore.exp.in        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -3100,6 +3100,7 @@
</span><span class="cx"> __ZNK7WebCore15IDBKeyRangeData15isExactlyOneKeyEv
</span><span class="cx"> __ZNK7WebCore15IDBKeyRangeData22maybeCreateIDBKeyRangeEv
</span><span class="cx"> __ZNK7WebCore6IDBKey7isValidEv
</span><ins>+__ZN7WebCore10IDBKeyData14setNumberValueEd
</ins><span class="cx"> __ZN7WebCore10IDBKeyData6decodeERNS_12KeyedDecoderERS0_
</span><span class="cx"> __ZN7WebCore10IDBKeyDataC1EPKNS_6IDBKeyE
</span><span class="cx"> __ZN7WebCore10IDBKeyPathC1ERKN3WTF6StringE
</span></span></pre></div>
<a id="trunkSourceWebKit2ChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/ChangeLog (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/ChangeLog        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/Source/WebKit2/ChangeLog        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -1,3 +1,23 @@
</span><ins>+2014-02-05  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        IDB: storage/indexeddb/mozilla/autoincrement-indexes.html fails
+        https://bugs.webkit.org/show_bug.cgi?id=128257
+
+        Reviewed by Sam Weinig.
+
+        * DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp:
+        (WebKit::UniqueIDBDatabase::putRecordInBackingStore): Write the correct key to the index if it was auto generated.
+        (WebKit::UniqueIDBDatabase::getRecordFromBackingStore): If this is an auto increment object store with
+          a non-empty key path, save the key path to the get result.
+
+        * DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h:
+        * DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp:
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::createAndPopulateInitialMetadata): The IndexRecord schema shouldn’t
+          have key uniqueness.
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::putRecord): Take IDBKeyData instead of IDBKey.
+        (WebKit::UniqueIDBDatabaseBackingStoreSQLite::getIndexRecord): Fill in the primary key from the fetch.
+        * DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h:
+
</ins><span class="cx"> 2014-02-05  Anders Carlsson  &lt;andersca@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Get rid of WebUIClient
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabasecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabase.cpp        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -813,31 +813,28 @@
</span><span class="cx">     postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didDeleteIndex, requestID, success));
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void UniqueIDBDatabase::putRecordInBackingStore(uint64_t requestID, const IDBIdentifier&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)
</del><ins>+void UniqueIDBDatabase::putRecordInBackingStore(uint64_t requestID, const IDBIdentifier&amp; transaction, const IDBObjectStoreMetadata&amp; objectStoreMetadata, const IDBKeyData&amp; inputKeyData, 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)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isMainThread());
</span><span class="cx">     ASSERT(m_backingStore);
</span><span class="cx"> 
</span><span class="cx">     bool keyWasGenerated = false;
</span><del>-    RefPtr&lt;IDBKey&gt; key;
</del><ins>+    IDBKeyData key;
</ins><span class="cx">     int64_t keyNumber = 0;
</span><span class="cx"> 
</span><del>-    if (putMode != IDBDatabaseBackend::CursorUpdate &amp;&amp; objectStoreMetadata.autoIncrement &amp;&amp; keyData.isNull) {
</del><ins>+    if (putMode != IDBDatabaseBackend::CursorUpdate &amp;&amp; objectStoreMetadata.autoIncrement &amp;&amp; inputKeyData.isNull) {
</ins><span class="cx">         if (!m_backingStore-&gt;generateKeyNumber(transaction, objectStoreMetadata.id, keyNumber)) {
</span><span class="cx">             postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Internal backing store error checking for key existence&quot;)));
</span><span class="cx">             return;
</span><span class="cx">         }
</span><del>-        key = IDBKey::createNumber(keyNumber);
</del><ins>+        key.setNumberValue(keyNumber);
</ins><span class="cx">         keyWasGenerated = true;
</span><span class="cx">     } else
</span><del>-        key = keyData.maybeCreateIDBKey();
</del><ins>+        key = inputKeyData;
</ins><span class="cx"> 
</span><del>-    ASSERT(key);
-    ASSERT(key-&gt;isValid());
-
</del><span class="cx">     if (putMode == IDBDatabaseBackend::AddOnly) {
</span><span class="cx">         bool keyExists;
</span><del>-        if (!m_backingStore-&gt;keyExistsInObjectStore(transaction, objectStoreMetadata.id, keyData, keyExists)) {
</del><ins>+        if (!m_backingStore-&gt;keyExistsInObjectStore(transaction, objectStoreMetadata.id, key, keyExists)) {
</ins><span class="cx">             postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Internal backing store error checking for key existence&quot;)));
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="lines">@@ -849,12 +846,12 @@
</span><span class="cx"> 
</span><span class="cx">     // The spec says that even if we're about to overwrite the record, perform the steps to delete it first.
</span><span class="cx">     // This is important because formally deleting it from from the object store also removes it from the appropriate indexes.
</span><del>-    if (!m_backingStore-&gt;deleteRecord(transaction, objectStoreMetadata.id, keyData)) {
</del><ins>+    if (!m_backingStore-&gt;deleteRecord(transaction, objectStoreMetadata.id, key)) {
</ins><span class="cx">         postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Replacing an existing key in backing store, unable to delete previous record.&quot;)));
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!m_backingStore-&gt;putRecord(transaction, objectStoreMetadata.id, *key, value.data(), value.size())) {
</del><ins>+    if (!m_backingStore-&gt;putRecord(transaction, objectStoreMetadata.id, key, value.data(), value.size())) {
</ins><span class="cx">         postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Internal backing store error putting a record&quot;)));
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="lines">@@ -862,21 +859,21 @@
</span><span class="cx">     ASSERT(indexIDs.size() == indexKeys.size());
</span><span class="cx">     for (size_t i = 0; i &lt; indexIDs.size(); ++i) {
</span><span class="cx">         for (size_t j = 0; j &lt; indexKeys[i].size(); ++j) {
</span><del>-            if (!m_backingStore-&gt;putIndexRecord(transaction, objectStoreMetadata.id, indexIDs[i], keyData, indexKeys[i][j])) {
</del><ins>+            if (!m_backingStore-&gt;putIndexRecord(transaction, objectStoreMetadata.id, indexIDs[i], key, indexKeys[i][j])) {
</ins><span class="cx">                 postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Internal backing store error writing index key&quot;)));
</span><span class="cx">                 return;
</span><span class="cx">             }
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (putMode != IDBDatabaseBackend::CursorUpdate &amp;&amp; objectStoreMetadata.autoIncrement &amp;&amp; key-&gt;type() == IDBKey::NumberType) {
</del><ins>+    if (putMode != IDBDatabaseBackend::CursorUpdate &amp;&amp; objectStoreMetadata.autoIncrement &amp;&amp; key.type == IDBKey::NumberType) {
</ins><span class="cx">         if (!m_backingStore-&gt;updateKeyGeneratorNumber(transaction, objectStoreMetadata.id, keyNumber, keyWasGenerated)) {
</span><span class="cx">             postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Internal backing store error updating key generator&quot;)));
</span><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, IDBKeyData(key.get()), 0, String(StringImpl::empty())));
</del><ins>+    postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didPutRecordInBackingStore, requestID, key, 0, String(StringImpl::empty())));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UniqueIDBDatabase::didPutRecordInBackingStore(uint64_t requestID, const IDBKeyData&amp; keyData, uint32_t errorCode, const String&amp; errorMessage)
</span><span class="lines">@@ -924,13 +921,18 @@
</span><span class="cx"> 
</span><span class="cx">     // IDBIndex get record
</span><span class="cx"> 
</span><del>-    RefPtr&lt;SharedBuffer&gt; result;
</del><ins>+    IDBGetResult result;
</ins><span class="cx">     if (!m_backingStore-&gt;getIndexRecord(transaction, objectStoreMetadata.id, indexID, keyRangeData, result)) {
</span><span class="cx">         postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didGetRecordFromBackingStore, requestID, IDBGetResult(), IDBDatabaseException::UnknownError, ASCIILiteral(&quot;Failed to get index record from backing store&quot;)));
</span><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didGetRecordFromBackingStore, requestID, IDBGetResult(result.release()), 0, String(StringImpl::empty())));
</del><ins>+    // A get request that meets the following conditions needs to know the object store keypath
+    // to inject the result key into the result value object.
+    if (objectStoreMetadata.autoIncrement &amp;&amp; !objectStoreMetadata.keyPath.isNull())
+        result.keyPath = objectStoreMetadata.keyPath;
+
+    postMainThreadTask(createAsyncTask(*this, &amp;UniqueIDBDatabase::didGetRecordFromBackingStore, requestID, result, 0, String(StringImpl::empty())));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void UniqueIDBDatabase::didGetRecordFromBackingStore(uint64_t requestID, const IDBGetResult&amp; result, uint32_t errorCode, const String&amp; errorMessage)
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBUniqueIDBDatabaseBackingStoreh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/UniqueIDBDatabaseBackingStore.h        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -37,6 +37,7 @@
</span><span class="cx"> class SharedBuffer;
</span><span class="cx"> 
</span><span class="cx"> struct IDBDatabaseMetadata;
</span><ins>+struct IDBGetResult;
</ins><span class="cx"> struct IDBKeyData;
</span><span class="cx"> struct IDBObjectStoreMetadata;
</span><span class="cx"> }
</span><span class="lines">@@ -68,9 +69,9 @@
</span><span class="cx">     virtual bool updateKeyGeneratorNumber(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreId, int64_t keyNumber, bool checkCurrent) = 0;
</span><span class="cx"> 
</span><span class="cx">     virtual bool keyExistsInObjectStore(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyData&amp;, bool&amp; keyExists) = 0;
</span><del>-    virtual bool putRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKey&amp;, const uint8_t* valueBuffer, size_t valueSize) = 0;
</del><ins>+    virtual bool putRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyData&amp;, const uint8_t* valueBuffer, size_t valueSize) = 0;
</ins><span class="cx">     virtual bool putIndexRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyData&amp;, const WebCore::IDBKeyData&amp; indexKey) = 0;
</span><del>-    virtual bool getIndexRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyRangeData&amp;, RefPtr&lt;WebCore::SharedBuffer&gt;&amp; result) = 0;
</del><ins>+    virtual bool getIndexRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyRangeData&amp;, WebCore::IDBGetResult&amp;) = 0;
</ins><span class="cx">     virtual bool deleteRange(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyRangeData&amp;) = 0;
</span><span class="cx">     virtual bool deleteRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyData&amp;) = 0;
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBsqliteUniqueIDBDatabaseBackingStoreSQLitecpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.cpp        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -35,6 +35,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/IDBGetResult.h&gt;
</ins><span class="cx"> #include &lt;WebCore/IDBKeyData.h&gt;
</span><span class="cx"> #include &lt;WebCore/IDBKeyRange.h&gt;
</span><span class="cx"> #include &lt;WebCore/SQLiteDatabase.h&gt;
</span><span class="lines">@@ -103,8 +104,8 @@
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (!m_sqliteDB-&gt;executeCommand(&quot;CREATE TABLE IndexRecords (indexID INTEGER NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL UNIQUE ON CONFLICT REPLACE, value 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());
</del><ins>+    if (!m_sqliteDB-&gt;executeCommand(&quot;CREATE TABLE IndexRecords (indexID INTEGER NOT NULL ON CONFLICT FAIL, objectStoreID INTEGER NOT NULL ON CONFLICT FAIL, key TEXT COLLATE IDBKEY NOT NULL ON CONFLICT FAIL, value NOT NULL ON CONFLICT FAIL);&quot;)) {
+        LOG_ERROR(&quot;Could not create IndexRecords table in database (%i) - %s&quot;, m_sqliteDB-&gt;lastError(), m_sqliteDB-&gt;lastErrorMsg());
</ins><span class="cx">         m_sqliteDB = nullptr;
</span><span class="cx">         return nullptr;
</span><span class="cx">     }
</span><span class="lines">@@ -772,7 +773,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool UniqueIDBDatabaseBackingStoreSQLite::putRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const IDBKey&amp; key, const uint8_t* valueBuffer, size_t valueSize)
</del><ins>+bool UniqueIDBDatabaseBackingStoreSQLite::putRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const IDBKeyData&amp; keyData, const uint8_t* valueBuffer, size_t valueSize)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isMainThread());
</span><span class="cx">     ASSERT(m_sqliteDB);
</span><span class="lines">@@ -788,7 +789,7 @@
</span><span class="cx">         return false;
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    RefPtr&lt;SharedBuffer&gt; keyBuffer = serializeIDBKeyData(IDBKeyData(&amp;key));
</del><ins>+    RefPtr&lt;SharedBuffer&gt; keyBuffer = serializeIDBKeyData(keyData);
</ins><span class="cx">     if (!keyBuffer) {
</span><span class="cx">         LOG_ERROR(&quot;Unable to serialize IDBKey to be stored in the database&quot;);
</span><span class="cx">         return false;
</span><span class="lines">@@ -851,7 +852,7 @@
</span><span class="cx">     return true;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-bool UniqueIDBDatabaseBackingStoreSQLite::getIndexRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, int64_t indexID, const IDBKeyRangeData&amp; keyRangeData, RefPtr&lt;SharedBuffer&gt;&amp; result)
</del><ins>+bool UniqueIDBDatabaseBackingStoreSQLite::getIndexRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, int64_t indexID, const IDBKeyRangeData&amp; keyRangeData, IDBGetResult&amp; result)
</ins><span class="cx"> {
</span><span class="cx">     ASSERT(!isMainThread());
</span><span class="cx">     ASSERT(m_sqliteDB);
</span><span class="lines">@@ -873,7 +874,8 @@
</span><span class="cx">     // Even though we're only using this cursor locally, add it to our cursor set.
</span><span class="cx">     m_cursors.set(cursor-&gt;identifier(), cursor);
</span><span class="cx"> 
</span><del>-    result = SharedBuffer::create(cursor-&gt;currentValueBuffer().data(), cursor-&gt;currentValueBuffer().size());
</del><ins>+    result = IDBGetResult(SharedBuffer::create(cursor-&gt;currentValueBuffer().data(), cursor-&gt;currentValueBuffer().size()));
+    result.keyData = cursor-&gt;currentValueKey();
</ins><span class="cx"> 
</span><span class="cx">     // Closing the cursor will destroy the cursor object and remove it from our cursor set.
</span><span class="cx">     transaction-&gt;closeCursor(*cursor);
</span></span></pre></div>
<a id="trunkSourceWebKit2DatabaseProcessIndexedDBsqliteUniqueIDBDatabaseBackingStoreSQLiteh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h (163481 => 163482)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h        2014-02-05 23:47:28 UTC (rev 163481)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/sqlite/UniqueIDBDatabaseBackingStoreSQLite.h        2014-02-05 23:59:52 UTC (rev 163482)
</span><span class="lines">@@ -72,9 +72,9 @@
</span><span class="cx">     virtual bool updateKeyGeneratorNumber(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreId, int64_t keyNumber, bool checkCurrent) override;
</span><span class="cx"> 
</span><span class="cx">     virtual bool keyExistsInObjectStore(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyData&amp;, bool&amp; keyExists) override;
</span><del>-    virtual bool putRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKey&amp;, const uint8_t* valueBuffer, size_t valueSize) override;
</del><ins>+    virtual bool putRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyData&amp;, const uint8_t* valueBuffer, size_t valueSize) override;
</ins><span class="cx">     virtual bool putIndexRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyData&amp; keyValue, const WebCore::IDBKeyData&amp; indexKey) override;
</span><del>-    virtual bool getIndexRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyRangeData&amp;, RefPtr&lt;WebCore::SharedBuffer&gt;&amp; result) override;
</del><ins>+    virtual bool getIndexRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, int64_t indexID, const WebCore::IDBKeyRangeData&amp;, WebCore::IDBGetResult&amp;) override;
</ins><span class="cx">     virtual bool deleteRange(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyRangeData&amp;) override;
</span><span class="cx">     virtual bool deleteRecord(const IDBIdentifier&amp; transactionIdentifier, int64_t objectStoreID, const WebCore::IDBKeyData&amp;) override;
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>