<!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>[200489] trunk/Source/WebCore</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/200489">200489</a></dd>
<dt>Author</dt> <dd>beidson@apple.com</dd>
<dt>Date</dt> <dd>2016-05-05 16:11:13 -0700 (Thu, 05 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Modern IDB (Workers): Move TransactionOperation management from IDBConnectionToServer to IDBConnectionProxy.
https://bugs.webkit.org/show_bug.cgi?id=157392

Reviewed by Alex Christensen.

No new tests (No current change in behavior, will be tested as bug 149953 makes progress).

Set up TransactionOperations on the IDBConnectionProxy instead of the IDBConnectionToServer:
* Modules/indexeddb/IDBTransaction.cpp:
(WebCore::IDBTransaction::createObjectStoreOnServer):
(WebCore::IDBTransaction::createIndexOnServer):
(WebCore::IDBTransaction::openCursorOnServer):
(WebCore::IDBTransaction::iterateCursorOnServer):
(WebCore::IDBTransaction::getRecordOnServer):
(WebCore::IDBTransaction::getCountOnServer):
(WebCore::IDBTransaction::deleteRecordOnServer):
(WebCore::IDBTransaction::clearObjectStoreOnServer):
(WebCore::IDBTransaction::putOrAddOnServer):
(WebCore::IDBTransaction::deleteObjectStoreOnServer):
(WebCore::IDBTransaction::deleteIndexOnServer):

IDBConnectionProxy is now the owner of dispatched TransactionOperations:
* Modules/indexeddb/client/IDBConnectionProxy.cpp:
(WebCore::IDBClient::IDBConnectionProxy::createObjectStore):
(WebCore::IDBClient::IDBConnectionProxy::deleteObjectStore):
(WebCore::IDBClient::IDBConnectionProxy::clearObjectStore):
(WebCore::IDBClient::IDBConnectionProxy::createIndex):
(WebCore::IDBClient::IDBConnectionProxy::deleteIndex):
(WebCore::IDBClient::IDBConnectionProxy::putOrAdd):
(WebCore::IDBClient::IDBConnectionProxy::getRecord):
(WebCore::IDBClient::IDBConnectionProxy::getCount):
(WebCore::IDBClient::IDBConnectionProxy::deleteRecord):
(WebCore::IDBClient::IDBConnectionProxy::openCursor):
(WebCore::IDBClient::IDBConnectionProxy::iterateCursor):
(WebCore::IDBClient::IDBConnectionProxy::saveOperation):
(WebCore::IDBClient::IDBConnectionProxy::completeOperation):
* Modules/indexeddb/client/IDBConnectionProxy.h:

Proxy this in-and-out calls to the ConnectionProxy:
* Modules/indexeddb/client/IDBConnectionToServer.cpp:
(WebCore::IDBClient::IDBConnectionToServer::createObjectStore):
(WebCore::IDBClient::IDBConnectionToServer::didCreateObjectStore):
(WebCore::IDBClient::IDBConnectionToServer::deleteObjectStore):
(WebCore::IDBClient::IDBConnectionToServer::didDeleteObjectStore):
(WebCore::IDBClient::IDBConnectionToServer::clearObjectStore):
(WebCore::IDBClient::IDBConnectionToServer::didClearObjectStore):
(WebCore::IDBClient::IDBConnectionToServer::createIndex):
(WebCore::IDBClient::IDBConnectionToServer::didCreateIndex):
(WebCore::IDBClient::IDBConnectionToServer::deleteIndex):
(WebCore::IDBClient::IDBConnectionToServer::didDeleteIndex):
(WebCore::IDBClient::IDBConnectionToServer::putOrAdd):
(WebCore::IDBClient::IDBConnectionToServer::didPutOrAdd):
(WebCore::IDBClient::IDBConnectionToServer::getRecord):
(WebCore::IDBClient::IDBConnectionToServer::didGetRecord):
(WebCore::IDBClient::IDBConnectionToServer::getCount):
(WebCore::IDBClient::IDBConnectionToServer::didGetCount):
(WebCore::IDBClient::IDBConnectionToServer::deleteRecord):
(WebCore::IDBClient::IDBConnectionToServer::didDeleteRecord):
(WebCore::IDBClient::IDBConnectionToServer::openCursor):
(WebCore::IDBClient::IDBConnectionToServer::didOpenCursor):
(WebCore::IDBClient::IDBConnectionToServer::iterateCursor):
(WebCore::IDBClient::IDBConnectionToServer::didIterateCursor):
(WebCore::IDBClient::IDBConnectionToServer::saveOperation): Deleted.
(WebCore::IDBClient::IDBConnectionToServer::completeOperation): Deleted.
* Modules/indexeddb/client/IDBConnectionToServer.h:

- Give TransactionOperation a ThreadIdentifier member
- Privatize most public methods from TransactionOperation
- Make IDBRequestData a friend so it can get at the private methods
* Modules/indexeddb/client/TransactionOperation.h:
(WebCore::IDBClient::TransactionOperation::~TransactionOperation):
(WebCore::IDBClient::TransactionOperation::perform):
(WebCore::IDBClient::TransactionOperation::completed):
(WebCore::IDBClient::TransactionOperation::originThreadID):
(WebCore::IDBClient::TransactionOperation::transactionIdentifier):
(WebCore::IDBClient::TransactionOperation::objectStoreIdentifier):
(WebCore::IDBClient::TransactionOperation::indexIdentifier):
(WebCore::IDBClient::TransactionOperation::cursorIdentifier):
(WebCore::IDBClient::TransactionOperation::transaction):
(WebCore::IDBClient::TransactionOperation::indexRecordType):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbIDBTransactioncpp">trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBConnectionProxycpp">trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBConnectionProxyh">trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServercpp">trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServerh">trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h</a></li>
<li><a href="#trunkSourceWebCoreModulesindexeddbclientTransactionOperationh">trunk/Source/WebCore/Modules/indexeddb/client/TransactionOperation.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (200488 => 200489)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/ChangeLog        2016-05-05 23:11:13 UTC (rev 200489)
</span><span class="lines">@@ -1,3 +1,86 @@
</span><ins>+2016-05-05  Brady Eidson  &lt;beidson@apple.com&gt;
+
+        Modern IDB (Workers): Move TransactionOperation management from IDBConnectionToServer to IDBConnectionProxy.
+        https://bugs.webkit.org/show_bug.cgi?id=157392
+
+        Reviewed by Alex Christensen.
+
+        No new tests (No current change in behavior, will be tested as bug 149953 makes progress).
+
+        Set up TransactionOperations on the IDBConnectionProxy instead of the IDBConnectionToServer:
+        * Modules/indexeddb/IDBTransaction.cpp:
+        (WebCore::IDBTransaction::createObjectStoreOnServer):
+        (WebCore::IDBTransaction::createIndexOnServer):
+        (WebCore::IDBTransaction::openCursorOnServer):
+        (WebCore::IDBTransaction::iterateCursorOnServer):
+        (WebCore::IDBTransaction::getRecordOnServer):
+        (WebCore::IDBTransaction::getCountOnServer):
+        (WebCore::IDBTransaction::deleteRecordOnServer):
+        (WebCore::IDBTransaction::clearObjectStoreOnServer):
+        (WebCore::IDBTransaction::putOrAddOnServer):
+        (WebCore::IDBTransaction::deleteObjectStoreOnServer):
+        (WebCore::IDBTransaction::deleteIndexOnServer):
+        
+        IDBConnectionProxy is now the owner of dispatched TransactionOperations:
+        * Modules/indexeddb/client/IDBConnectionProxy.cpp:
+        (WebCore::IDBClient::IDBConnectionProxy::createObjectStore):
+        (WebCore::IDBClient::IDBConnectionProxy::deleteObjectStore):
+        (WebCore::IDBClient::IDBConnectionProxy::clearObjectStore):
+        (WebCore::IDBClient::IDBConnectionProxy::createIndex):
+        (WebCore::IDBClient::IDBConnectionProxy::deleteIndex):
+        (WebCore::IDBClient::IDBConnectionProxy::putOrAdd):
+        (WebCore::IDBClient::IDBConnectionProxy::getRecord):
+        (WebCore::IDBClient::IDBConnectionProxy::getCount):
+        (WebCore::IDBClient::IDBConnectionProxy::deleteRecord):
+        (WebCore::IDBClient::IDBConnectionProxy::openCursor):
+        (WebCore::IDBClient::IDBConnectionProxy::iterateCursor):
+        (WebCore::IDBClient::IDBConnectionProxy::saveOperation):
+        (WebCore::IDBClient::IDBConnectionProxy::completeOperation):
+        * Modules/indexeddb/client/IDBConnectionProxy.h:
+        
+        Proxy this in-and-out calls to the ConnectionProxy:
+        * Modules/indexeddb/client/IDBConnectionToServer.cpp:
+        (WebCore::IDBClient::IDBConnectionToServer::createObjectStore):
+        (WebCore::IDBClient::IDBConnectionToServer::didCreateObjectStore):
+        (WebCore::IDBClient::IDBConnectionToServer::deleteObjectStore):
+        (WebCore::IDBClient::IDBConnectionToServer::didDeleteObjectStore):
+        (WebCore::IDBClient::IDBConnectionToServer::clearObjectStore):
+        (WebCore::IDBClient::IDBConnectionToServer::didClearObjectStore):
+        (WebCore::IDBClient::IDBConnectionToServer::createIndex):
+        (WebCore::IDBClient::IDBConnectionToServer::didCreateIndex):
+        (WebCore::IDBClient::IDBConnectionToServer::deleteIndex):
+        (WebCore::IDBClient::IDBConnectionToServer::didDeleteIndex):
+        (WebCore::IDBClient::IDBConnectionToServer::putOrAdd):
+        (WebCore::IDBClient::IDBConnectionToServer::didPutOrAdd):
+        (WebCore::IDBClient::IDBConnectionToServer::getRecord):
+        (WebCore::IDBClient::IDBConnectionToServer::didGetRecord):
+        (WebCore::IDBClient::IDBConnectionToServer::getCount):
+        (WebCore::IDBClient::IDBConnectionToServer::didGetCount):
+        (WebCore::IDBClient::IDBConnectionToServer::deleteRecord):
+        (WebCore::IDBClient::IDBConnectionToServer::didDeleteRecord):
+        (WebCore::IDBClient::IDBConnectionToServer::openCursor):
+        (WebCore::IDBClient::IDBConnectionToServer::didOpenCursor):
+        (WebCore::IDBClient::IDBConnectionToServer::iterateCursor):
+        (WebCore::IDBClient::IDBConnectionToServer::didIterateCursor):
+        (WebCore::IDBClient::IDBConnectionToServer::saveOperation): Deleted.
+        (WebCore::IDBClient::IDBConnectionToServer::completeOperation): Deleted.
+        * Modules/indexeddb/client/IDBConnectionToServer.h:
+
+        - Give TransactionOperation a ThreadIdentifier member
+        - Privatize most public methods from TransactionOperation
+        - Make IDBRequestData a friend so it can get at the private methods
+        * Modules/indexeddb/client/TransactionOperation.h:
+        (WebCore::IDBClient::TransactionOperation::~TransactionOperation):
+        (WebCore::IDBClient::TransactionOperation::perform):
+        (WebCore::IDBClient::TransactionOperation::completed):
+        (WebCore::IDBClient::TransactionOperation::originThreadID):
+        (WebCore::IDBClient::TransactionOperation::transactionIdentifier):
+        (WebCore::IDBClient::TransactionOperation::objectStoreIdentifier):
+        (WebCore::IDBClient::TransactionOperation::indexIdentifier):
+        (WebCore::IDBClient::TransactionOperation::cursorIdentifier):
+        (WebCore::IDBClient::TransactionOperation::transaction):
+        (WebCore::IDBClient::TransactionOperation::indexRecordType):
+
</ins><span class="cx"> 2016-05-05  Zalan Bujtas  &lt;zalan@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Do not attempt to compute min/max width.
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbIDBTransactioncpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp (200488 => 200489)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp        2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp        2016-05-05 23:11:13 UTC (rev 200489)
</span><span class="lines">@@ -588,7 +588,7 @@
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx">     ASSERT(isVersionChange());
</span><span class="cx"> 
</span><del>-    m_database-&gt;serverConnection().createObjectStore(operation, info);
</del><ins>+    m_database-&gt;connectionProxy().createObjectStore(operation, info);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didCreateObjectStoreOnServer(const IDBResultData&amp; resultData)
</span><span class="lines">@@ -619,7 +619,7 @@
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx">     ASSERT(isVersionChange());
</span><span class="cx"> 
</span><del>-    m_database-&gt;serverConnection().createIndex(operation, info);
</del><ins>+    m_database-&gt;connectionProxy().createIndex(operation, info);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didCreateIndexOnServer(const IDBResultData&amp; resultData)
</span><span class="lines">@@ -678,7 +678,7 @@
</span><span class="cx">     LOG(IndexedDB, &quot;IDBTransaction::openCursorOnServer&quot;);
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx"> 
</span><del>-    m_database-&gt;serverConnection().openCursor(operation, info);
</del><ins>+    m_database-&gt;connectionProxy().openCursor(operation, info);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didOpenCursorOnServer(IDBRequest&amp; request, const IDBResultData&amp; resultData)
</span><span class="lines">@@ -707,7 +707,7 @@
</span><span class="cx">     LOG(IndexedDB, &quot;IDBTransaction::iterateCursorOnServer&quot;);
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx"> 
</span><del>-    serverConnection().iterateCursor(operation, key, count);
</del><ins>+    m_database-&gt;connectionProxy().iterateCursor(operation, key, count);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didIterateCursorOnServer(IDBRequest&amp; request, const IDBResultData&amp; resultData)
</span><span class="lines">@@ -771,7 +771,7 @@
</span><span class="cx">     LOG(IndexedDB, &quot;IDBTransaction::getRecordOnServer&quot;);
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx"> 
</span><del>-    serverConnection().getRecord(operation, keyRange);
</del><ins>+    m_database-&gt;connectionProxy().getRecord(operation, keyRange);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didGetRecordOnServer(IDBRequest&amp; request, const IDBResultData&amp; resultData)
</span><span class="lines">@@ -838,7 +838,7 @@
</span><span class="cx">     LOG(IndexedDB, &quot;IDBTransaction::getCountOnServer&quot;);
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx"> 
</span><del>-    serverConnection().getCount(operation, keyRange);
</del><ins>+    m_database-&gt;connectionProxy().getCount(operation, keyRange);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didGetCountOnServer(IDBRequest&amp; request, const IDBResultData&amp; resultData)
</span><span class="lines">@@ -869,7 +869,7 @@
</span><span class="cx">     LOG(IndexedDB, &quot;IDBTransaction::deleteRecordOnServer&quot;);
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx"> 
</span><del>-    serverConnection().deleteRecord(operation, keyRange);
</del><ins>+    m_database-&gt;connectionProxy().deleteRecord(operation, keyRange);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didDeleteRecordOnServer(IDBRequest&amp; request, const IDBResultData&amp; resultData)
</span><span class="lines">@@ -902,7 +902,7 @@
</span><span class="cx">     LOG(IndexedDB, &quot;IDBTransaction::clearObjectStoreOnServer&quot;);
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx"> 
</span><del>-    serverConnection().clearObjectStore(operation, objectStoreIdentifier);
</del><ins>+    m_database-&gt;connectionProxy().clearObjectStore(operation, objectStoreIdentifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didClearObjectStoreOnServer(IDBRequest&amp; request, const IDBResultData&amp; resultData)
</span><span class="lines">@@ -939,7 +939,7 @@
</span><span class="cx">     ASSERT(value);
</span><span class="cx"> 
</span><span class="cx">     if (!value-&gt;hasBlobURLs()) {
</span><del>-        serverConnection().putOrAdd(operation, key.get(), *value, overwriteMode);
</del><ins>+        m_database-&gt;connectionProxy().putOrAdd(operation, key.get(), *value, overwriteMode);
</ins><span class="cx">         return;
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -947,7 +947,7 @@
</span><span class="cx">     RefPtr&lt;IDBClient::TransactionOperation&gt; operationRef(&amp;operation);
</span><span class="cx">     value-&gt;writeBlobsToDiskForIndexedDB([protector, this, operationRef, key, value, overwriteMode](const IDBValue&amp; idbValue) {
</span><span class="cx">         if (idbValue.data().data()) {
</span><del>-            serverConnection().putOrAdd(*operationRef, key.get(), idbValue, overwriteMode);
</del><ins>+            m_database-&gt;connectionProxy().putOrAdd(*operationRef, key.get(), idbValue, overwriteMode);
</ins><span class="cx">             return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -991,7 +991,7 @@
</span><span class="cx">     ASSERT(isVersionChange());
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx"> 
</span><del>-    serverConnection().deleteObjectStore(operation, objectStoreName);
</del><ins>+    m_database-&gt;connectionProxy().deleteObjectStore(operation, objectStoreName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didDeleteObjectStoreOnServer(const IDBResultData&amp; resultData)
</span><span class="lines">@@ -1017,7 +1017,7 @@
</span><span class="cx">     ASSERT(isVersionChange());
</span><span class="cx">     ASSERT(currentThread() == m_database-&gt;originThreadID());
</span><span class="cx"> 
</span><del>-    serverConnection().deleteIndex(operation, objectStoreIdentifier, indexName);
</del><ins>+    m_database-&gt;connectionProxy().deleteIndex(operation, objectStoreIdentifier, indexName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBTransaction::didDeleteIndexOnServer(const IDBResultData&amp; resultData)
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionProxycpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp (200488 => 200489)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp        2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp        2016-05-05 23:11:13 UTC (rev 200489)
</span><span class="lines">@@ -32,6 +32,7 @@
</span><span class="cx"> #include &quot;IDBOpenDBRequest.h&quot;
</span><span class="cx"> #include &quot;IDBRequestData.h&quot;
</span><span class="cx"> #include &quot;IDBResultData.h&quot;
</span><ins>+#include &quot;SecurityOrigin.h&quot;
</ins><span class="cx"> #include &lt;wtf/MainThread.h&gt;
</span><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="lines">@@ -133,6 +134,139 @@
</span><span class="cx">     request-&gt;requestCompleted(resultData);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+void IDBConnectionProxy::createObjectStore(TransactionOperation&amp; operation, const IDBObjectStoreInfo&amp; info)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.createObjectStore(requestData, info);
+}
+
+void IDBConnectionProxy::deleteObjectStore(TransactionOperation&amp; operation, const String&amp; objectStoreName)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.deleteObjectStore(requestData, objectStoreName);
+}
+
+void IDBConnectionProxy::clearObjectStore(TransactionOperation&amp; operation, uint64_t objectStoreIdentifier)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.clearObjectStore(requestData, objectStoreIdentifier);
+}
+
+void IDBConnectionProxy::createIndex(TransactionOperation&amp; operation, const IDBIndexInfo&amp; info)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.createIndex(requestData, info);
+}
+
+void IDBConnectionProxy::deleteIndex(TransactionOperation&amp; operation, uint64_t objectStoreIdentifier, const String&amp; indexName)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.deleteIndex(requestData, objectStoreIdentifier, indexName);
+}
+
+void IDBConnectionProxy::putOrAdd(TransactionOperation&amp; operation, IDBKey* key, const IDBValue&amp; value, const IndexedDB::ObjectStoreOverwriteMode mode)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.putOrAdd(requestData, key, value, mode);
+}
+
+void IDBConnectionProxy::getRecord(TransactionOperation&amp; operation, const IDBKeyRangeData&amp; keyRange)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.getRecord(requestData, keyRange);
+}
+
+void IDBConnectionProxy::getCount(TransactionOperation&amp; operation, const IDBKeyRangeData&amp; keyRange)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.getCount(requestData, keyRange);
+}
+
+void IDBConnectionProxy::deleteRecord(TransactionOperation&amp; operation, const IDBKeyRangeData&amp; keyRange)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.deleteRecord(requestData, keyRange);
+}
+
+void IDBConnectionProxy::openCursor(TransactionOperation&amp; operation, const IDBCursorInfo&amp; info)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.openCursor(requestData, info);
+}
+
+void IDBConnectionProxy::iterateCursor(TransactionOperation&amp; operation, const IDBKeyData&amp; key, unsigned long count)
+{
+    IDBRequestData requestData(operation);
+    saveOperation(operation);
+
+    // FIXME: Handle worker thread marshalling.
+
+    m_connectionToServer.iterateCursor(requestData, key, count);
+}
+
+void IDBConnectionProxy::saveOperation(TransactionOperation&amp; operation)
+{
+    Locker&lt;Lock&gt; locker(m_transactionOperationLock);
+
+    ASSERT(!m_activeOperations.contains(operation.identifier()));
+    m_activeOperations.set(operation.identifier(), &amp;operation);
+}
+
+void IDBConnectionProxy::completeOperation(const IDBResultData&amp; resultData)
+{
+    RefPtr&lt;TransactionOperation&gt; operation;
+    {
+        Locker&lt;Lock&gt; locker(m_transactionOperationLock);
+        operation = m_activeOperations.take(resultData.requestIdentifier());
+    }
+
+    ASSERT(operation);
+
+    // FIXME: Handle getting operation-&gt;completed() onto the correct thread via the IDBTransaction.
+    
+    operation-&gt;completed(resultData);
+}
+
</ins><span class="cx"> void IDBConnectionProxy::fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier&amp; requestIdentifier, uint64_t requestedVersion)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(isMainThread());
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionProxyh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h (200488 => 200489)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h        2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h        2016-05-05 23:11:13 UTC (rev 200489)
</span><span class="lines">@@ -29,6 +29,7 @@
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IDBConnectionToServer.h&quot;
</span><span class="cx"> #include &quot;IDBResourceIdentifier.h&quot;
</span><ins>+#include &quot;TransactionOperation.h&quot;
</ins><span class="cx"> #include &lt;functional&gt;
</span><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/RefPtr.h&gt;
</span><span class="lines">@@ -60,6 +61,18 @@
</span><span class="cx">     RefPtr&lt;IDBOpenDBRequest&gt; deleteDatabase(ScriptExecutionContext&amp;, const IDBDatabaseIdentifier&amp;);
</span><span class="cx">     void didDeleteDatabase(const IDBResultData&amp;);
</span><span class="cx"> 
</span><ins>+    void createObjectStore(TransactionOperation&amp;, const IDBObjectStoreInfo&amp;);
+    void deleteObjectStore(TransactionOperation&amp;, const String&amp; objectStoreName);
+    void clearObjectStore(TransactionOperation&amp;, uint64_t objectStoreIdentifier);
+    void createIndex(TransactionOperation&amp;, const IDBIndexInfo&amp;);
+    void deleteIndex(TransactionOperation&amp;, uint64_t objectStoreIdentifier, const String&amp; indexName);
+    void putOrAdd(TransactionOperation&amp;, IDBKey*, const IDBValue&amp;, const IndexedDB::ObjectStoreOverwriteMode);
+    void getRecord(TransactionOperation&amp;, const IDBKeyRangeData&amp;);
+    void getCount(TransactionOperation&amp;, const IDBKeyRangeData&amp;);
+    void deleteRecord(TransactionOperation&amp;, const IDBKeyRangeData&amp;);
+    void openCursor(TransactionOperation&amp;, const IDBCursorInfo&amp;);
+    void iterateCursor(TransactionOperation&amp;, const IDBKeyData&amp;, unsigned long count);
+    
</ins><span class="cx">     void fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier&amp; requestIdentifier, uint64_t requestedVersion);
</span><span class="cx">     void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier&amp; requestIdentifier);
</span><span class="cx"> 
</span><span class="lines">@@ -76,6 +89,8 @@
</span><span class="cx">     void didFinishHandlingVersionChangeTransaction(IDBTransaction&amp;);
</span><span class="cx">     void databaseConnectionClosed(IDBDatabase&amp;);
</span><span class="cx"> 
</span><ins>+    void completeOperation(const IDBResultData&amp;);
+
</ins><span class="cx">     uint64_t serverConnectionIdentifier() const { return m_serverConnectionIdentifier; }
</span><span class="cx"> 
</span><span class="cx">     // FIXME: Temporarily required during bringup of IDB-in-Workers.
</span><span class="lines">@@ -95,6 +110,8 @@
</span><span class="cx">     void completeOpenDBRequest(const IDBResultData&amp;);
</span><span class="cx">     bool hasRecordOfTransaction(const IDBTransaction&amp;) const;
</span><span class="cx"> 
</span><ins>+    void saveOperation(TransactionOperation&amp;);
+
</ins><span class="cx">     IDBConnectionToServer&amp; m_connectionToServer;
</span><span class="cx">     uint64_t m_serverConnectionIdentifier;
</span><span class="cx"> 
</span><span class="lines">@@ -108,6 +125,9 @@
</span><span class="cx">     HashMap&lt;IDBResourceIdentifier, RefPtr&lt;IDBTransaction&gt;&gt; m_committingTransactions;
</span><span class="cx">     HashMap&lt;IDBResourceIdentifier, RefPtr&lt;IDBTransaction&gt;&gt; m_abortingTransactions;
</span><span class="cx">     Lock m_transactionMapLock;
</span><ins>+
+    HashMap&lt;IDBResourceIdentifier, RefPtr&lt;TransactionOperation&gt;&gt; m_activeOperations;
+    Lock m_transactionOperationLock;
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> } // namespace IDBClient
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServercpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp (200488 => 200489)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp        2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp        2016-05-05 23:11:13 UTC (rev 200489)
</span><span class="lines">@@ -87,169 +87,161 @@
</span><span class="cx">     m_proxy-&gt;didOpenDatabase(resultData);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::createObjectStore(TransactionOperation&amp; operation, const IDBObjectStoreInfo&amp; info)
</del><ins>+void IDBConnectionToServer::createObjectStore(const IDBRequestData&amp; requestData, const IDBObjectStoreInfo&amp; info)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::createObjectStore&quot;);
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><del>-    saveOperation(operation);
-
-    m_delegate-&gt;createObjectStore(IDBRequestData(operation), info);
</del><ins>+    m_delegate-&gt;createObjectStore(requestData, info);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didCreateObjectStore(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didCreateObjectStore&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::deleteObjectStore(TransactionOperation&amp; operation, const String&amp; objectStoreName)
</del><ins>+void IDBConnectionToServer::deleteObjectStore(const IDBRequestData&amp; requestData, const String&amp; objectStoreName)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::deleteObjectStore&quot;);
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><del>-    saveOperation(operation);
-
-    m_delegate-&gt;deleteObjectStore(IDBRequestData(operation), objectStoreName);
</del><ins>+    m_delegate-&gt;deleteObjectStore(requestData, objectStoreName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didDeleteObjectStore(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didDeleteObjectStore&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::clearObjectStore(TransactionOperation&amp; operation, uint64_t objectStoreIdentifier)
</del><ins>+void IDBConnectionToServer::clearObjectStore(const IDBRequestData&amp; requestData, uint64_t objectStoreIdentifier)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::clearObjectStore&quot;);
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><del>-    saveOperation(operation);
-
-    m_delegate-&gt;clearObjectStore(IDBRequestData(operation), objectStoreIdentifier);
</del><ins>+    m_delegate-&gt;clearObjectStore(requestData, objectStoreIdentifier);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didClearObjectStore(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didClearObjectStore&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::createIndex(TransactionOperation&amp; operation, const IDBIndexInfo&amp; info)
</del><ins>+void IDBConnectionToServer::createIndex(const IDBRequestData&amp; requestData, const IDBIndexInfo&amp; info)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::createIndex&quot;);
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><del>-    saveOperation(operation);
-
-    m_delegate-&gt;createIndex(IDBRequestData(operation), info);
</del><ins>+    m_delegate-&gt;createIndex(requestData, info);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didCreateIndex(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didCreateIndex&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::deleteIndex(TransactionOperation&amp; operation, uint64_t objectStoreIdentifier, const String&amp; indexName)
</del><ins>+void IDBConnectionToServer::deleteIndex(const IDBRequestData&amp; requestData, uint64_t objectStoreIdentifier, const String&amp; indexName)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::deleteIndex&quot;);
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><del>-    saveOperation(operation);
-
-    m_delegate-&gt;deleteIndex(IDBRequestData(operation), objectStoreIdentifier, indexName);
</del><ins>+    m_delegate-&gt;deleteIndex(requestData, objectStoreIdentifier, indexName);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didDeleteIndex(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didDeleteIndex&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::putOrAdd(TransactionOperation&amp; operation, IDBKey* key, const IDBValue&amp; value, const IndexedDB::ObjectStoreOverwriteMode overwriteMode)
</del><ins>+void IDBConnectionToServer::putOrAdd(const IDBRequestData&amp; requestData, IDBKey* key, const IDBValue&amp; value, const IndexedDB::ObjectStoreOverwriteMode overwriteMode)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::putOrAdd&quot;);
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><del>-    saveOperation(operation);
-    m_delegate-&gt;putOrAdd(IDBRequestData(operation), key, value, overwriteMode);
</del><ins>+    m_delegate-&gt;putOrAdd(requestData, key, value, overwriteMode);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didPutOrAdd(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didPutOrAdd&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::getRecord(TransactionOperation&amp; operation, const IDBKeyRangeData&amp; keyRangeData)
</del><ins>+void IDBConnectionToServer::getRecord(const IDBRequestData&amp; requestData, const IDBKeyRangeData&amp; keyRangeData)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::getRecord&quot;);
</span><del>-
</del><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     ASSERT(!keyRangeData.isNull);
</span><span class="cx"> 
</span><del>-    saveOperation(operation);
-    m_delegate-&gt;getRecord(IDBRequestData(operation), keyRangeData);
</del><ins>+    m_delegate-&gt;getRecord(requestData, keyRangeData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didGetRecord(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didGetRecord&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::getCount(TransactionOperation&amp; operation, const IDBKeyRangeData&amp; keyRangeData)
</del><ins>+void IDBConnectionToServer::getCount(const IDBRequestData&amp; requestData, const IDBKeyRangeData&amp; keyRangeData)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::getCount&quot;);
</span><del>-
</del><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     ASSERT(!keyRangeData.isNull);
</span><span class="cx"> 
</span><del>-    saveOperation(operation);
-    m_delegate-&gt;getCount(IDBRequestData(operation), keyRangeData);
</del><ins>+    m_delegate-&gt;getCount(requestData, keyRangeData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didGetCount(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didGetCount&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::deleteRecord(TransactionOperation&amp; operation, const IDBKeyRangeData&amp; keyRangeData)
</del><ins>+void IDBConnectionToServer::deleteRecord(const IDBRequestData&amp; requestData, const IDBKeyRangeData&amp; keyRangeData)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::deleteRecord&quot;);
</span><del>-
</del><ins>+    ASSERT(isMainThread());
</ins><span class="cx">     ASSERT(!keyRangeData.isNull);
</span><span class="cx"> 
</span><del>-    saveOperation(operation);
-    m_delegate-&gt;deleteRecord(IDBRequestData(operation), keyRangeData);
</del><ins>+    m_delegate-&gt;deleteRecord(requestData, keyRangeData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didDeleteRecord(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didDeleteRecord&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::openCursor(TransactionOperation&amp; operation, const IDBCursorInfo&amp; info)
</del><ins>+void IDBConnectionToServer::openCursor(const IDBRequestData&amp; requestData, const IDBCursorInfo&amp; info)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::openCursor&quot;);
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><del>-    saveOperation(operation);
-    m_delegate-&gt;openCursor(IDBRequestData(operation), info);
</del><ins>+    m_delegate-&gt;openCursor(requestData, info);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didOpenCursor(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didOpenCursor&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::iterateCursor(TransactionOperation&amp; operation, const IDBKeyData&amp; key, unsigned long count)
</del><ins>+void IDBConnectionToServer::iterateCursor(const IDBRequestData&amp; requestData, const IDBKeyData&amp; key, unsigned long count)
</ins><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::iterateCursor&quot;);
</span><ins>+    ASSERT(isMainThread());
</ins><span class="cx"> 
</span><del>-    saveOperation(operation);
-    m_delegate-&gt;iterateCursor(IDBRequestData(operation), key, count);
</del><ins>+    m_delegate-&gt;iterateCursor(requestData, key, count);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::didIterateCursor(const IDBResultData&amp; resultData)
</span><span class="cx"> {
</span><span class="cx">     LOG(IndexedDB, &quot;IDBConnectionToServer::didIterateCursor&quot;);
</span><del>-    completeOperation(resultData);
</del><ins>+    m_proxy-&gt;completeOperation(resultData);
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> void IDBConnectionToServer::establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo&amp; info)
</span><span class="lines">@@ -347,20 +339,6 @@
</span><span class="cx">     m_delegate-&gt;abortOpenAndUpgradeNeeded(databaseConnectionIdentifier, transactionIdentifier);
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-void IDBConnectionToServer::saveOperation(TransactionOperation&amp; operation)
-{
-    ASSERT(!m_activeOperations.contains(operation.identifier()));
-    m_activeOperations.set(operation.identifier(), &amp;operation);
-}
-
-void IDBConnectionToServer::completeOperation(const IDBResultData&amp; resultData)
-{
-    auto operation = m_activeOperations.take(resultData.requestIdentifier());
-    ASSERT(operation);
-
-    operation-&gt;completed(resultData);
-}
-
</del><span class="cx"> void IDBConnectionToServer::getAllDatabaseNames(const SecurityOrigin&amp; mainFrameOrigin, const SecurityOrigin&amp; openingOrigin, std::function&lt;void (const Vector&lt;String&gt;&amp;)&gt; callback)
</span><span class="cx"> {
</span><span class="cx">     static uint64_t callbackID = 0;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientIDBConnectionToServerh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h (200488 => 200489)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h        2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h        2016-05-05 23:11:13 UTC (rev 200489)
</span><span class="lines">@@ -30,7 +30,6 @@
</span><span class="cx"> #include &quot;IDBConnectionProxy.h&quot;
</span><span class="cx"> #include &quot;IDBConnectionToServerDelegate.h&quot;
</span><span class="cx"> #include &quot;IDBResourceIdentifier.h&quot;
</span><del>-#include &quot;TransactionOperation.h&quot;
</del><span class="cx"> #include &lt;wtf/HashMap.h&gt;
</span><span class="cx"> #include &lt;wtf/HashSet.h&gt;
</span><span class="cx"> #include &lt;wtf/Ref.h&gt;
</span><span class="lines">@@ -44,11 +43,10 @@
</span><span class="cx"> class IDBObjectStoreInfo;
</span><span class="cx"> class IDBResultData;
</span><span class="cx"> class IDBValue;
</span><ins>+class SecurityOrigin;
</ins><span class="cx"> 
</span><span class="cx"> namespace IDBClient {
</span><span class="cx"> 
</span><del>-class TransactionOperation;
-
</del><span class="cx"> class IDBConnectionToServer : public ThreadSafeRefCounted&lt;IDBConnectionToServer&gt; {
</span><span class="cx"> public:
</span><span class="cx">     WEBCORE_EXPORT static Ref&lt;IDBConnectionToServer&gt; create(IDBConnectionToServerDelegate&amp;);
</span><span class="lines">@@ -63,37 +61,37 @@
</span><span class="cx">     void openDatabase(const IDBRequestData&amp;);
</span><span class="cx">     WEBCORE_EXPORT void didOpenDatabase(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void createObjectStore(TransactionOperation&amp;, const IDBObjectStoreInfo&amp;);
</del><ins>+    void createObjectStore(const IDBRequestData&amp;, const IDBObjectStoreInfo&amp;);
</ins><span class="cx">     WEBCORE_EXPORT void didCreateObjectStore(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void deleteObjectStore(TransactionOperation&amp;, const String&amp; objectStoreName);
</del><ins>+    void deleteObjectStore(const IDBRequestData&amp;, const String&amp; objectStoreName);
</ins><span class="cx">     WEBCORE_EXPORT void didDeleteObjectStore(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void clearObjectStore(TransactionOperation&amp;, uint64_t objectStoreIdentifier);
</del><ins>+    void clearObjectStore(const IDBRequestData&amp;, uint64_t objectStoreIdentifier);
</ins><span class="cx">     WEBCORE_EXPORT void didClearObjectStore(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void createIndex(TransactionOperation&amp;, const IDBIndexInfo&amp;);
</del><ins>+    void createIndex(const IDBRequestData&amp;, const IDBIndexInfo&amp;);
</ins><span class="cx">     WEBCORE_EXPORT void didCreateIndex(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void deleteIndex(TransactionOperation&amp;, uint64_t objectStoreIdentifier, const String&amp; indexName);
</del><ins>+    void deleteIndex(const IDBRequestData&amp;, uint64_t objectStoreIdentifier, const String&amp; indexName);
</ins><span class="cx">     WEBCORE_EXPORT void didDeleteIndex(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void putOrAdd(TransactionOperation&amp;, IDBKey*, const IDBValue&amp;, const IndexedDB::ObjectStoreOverwriteMode);
</del><ins>+    void putOrAdd(const IDBRequestData&amp;, IDBKey*, const IDBValue&amp;, const IndexedDB::ObjectStoreOverwriteMode);
</ins><span class="cx">     WEBCORE_EXPORT void didPutOrAdd(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void getRecord(TransactionOperation&amp;, const IDBKeyRangeData&amp;);
</del><ins>+    void getRecord(const IDBRequestData&amp;, const IDBKeyRangeData&amp;);
</ins><span class="cx">     WEBCORE_EXPORT void didGetRecord(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void getCount(TransactionOperation&amp;, const IDBKeyRangeData&amp;);
</del><ins>+    void getCount(const IDBRequestData&amp;, const IDBKeyRangeData&amp;);
</ins><span class="cx">     WEBCORE_EXPORT void didGetCount(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void deleteRecord(TransactionOperation&amp;, const IDBKeyRangeData&amp;);
</del><ins>+    void deleteRecord(const IDBRequestData&amp;, const IDBKeyRangeData&amp;);
</ins><span class="cx">     WEBCORE_EXPORT void didDeleteRecord(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void openCursor(TransactionOperation&amp;, const IDBCursorInfo&amp;);
</del><ins>+    void openCursor(const IDBRequestData&amp;, const IDBCursorInfo&amp;);
</ins><span class="cx">     WEBCORE_EXPORT void didOpenCursor(const IDBResultData&amp;);
</span><span class="cx"> 
</span><del>-    void iterateCursor(TransactionOperation&amp;, const IDBKeyData&amp;, unsigned long count);
</del><ins>+    void iterateCursor(const IDBRequestData&amp;, const IDBKeyData&amp;, unsigned long count);
</ins><span class="cx">     WEBCORE_EXPORT void didIterateCursor(const IDBResultData&amp;);
</span><span class="cx"> 
</span><span class="cx">     void commitTransaction(const IDBResourceIdentifier&amp; transactionIdentifier);
</span><span class="lines">@@ -124,13 +122,8 @@
</span><span class="cx"> private:
</span><span class="cx">     IDBConnectionToServer(IDBConnectionToServerDelegate&amp;);
</span><span class="cx"> 
</span><del>-    void saveOperation(TransactionOperation&amp;);
-    void completeOperation(const IDBResultData&amp;);
-
</del><span class="cx">     Ref&lt;IDBConnectionToServerDelegate&gt; m_delegate;
</span><span class="cx"> 
</span><del>-    HashMap&lt;IDBResourceIdentifier, RefPtr&lt;TransactionOperation&gt;&gt; m_activeOperations;
-
</del><span class="cx">     HashMap&lt;uint64_t, std::function&lt;void (const Vector&lt;String&gt;&amp;)&gt;&gt; m_getAllDatabaseNamesCallbacks;
</span><span class="cx"> 
</span><span class="cx">     std::unique_ptr&lt;IDBConnectionProxy&gt; m_proxy;
</span></span></pre></div>
<a id="trunkSourceWebCoreModulesindexeddbclientTransactionOperationh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/Modules/indexeddb/client/TransactionOperation.h (200488 => 200489)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/Modules/indexeddb/client/TransactionOperation.h        2016-05-05 23:05:37 UTC (rev 200488)
+++ trunk/Source/WebCore/Modules/indexeddb/client/TransactionOperation.h        2016-05-05 23:11:13 UTC (rev 200489)
</span><span class="lines">@@ -29,8 +29,10 @@
</span><span class="cx"> #if ENABLE(INDEXED_DATABASE)
</span><span class="cx"> 
</span><span class="cx"> #include &quot;IDBRequest.h&quot;
</span><ins>+#include &quot;IDBRequestData.h&quot;
</ins><span class="cx"> #include &quot;IDBResourceIdentifier.h&quot;
</span><span class="cx"> #include &quot;IDBTransaction.h&quot;
</span><ins>+#include &lt;wtf/Threading.h&gt;
</ins><span class="cx"> 
</span><span class="cx"> namespace WebCore {
</span><span class="cx"> 
</span><span class="lines">@@ -43,9 +45,16 @@
</span><span class="cx"> namespace IDBClient {
</span><span class="cx"> 
</span><span class="cx"> class TransactionOperation : public ThreadSafeRefCounted&lt;TransactionOperation&gt; {
</span><ins>+    friend IDBRequestData::IDBRequestData(TransactionOperation&amp;);
</ins><span class="cx"> public:
</span><ins>+    virtual ~TransactionOperation()
+    {
+        ASSERT(m_originThreadID == currentThread());
+    }
+
</ins><span class="cx">     void perform()
</span><span class="cx">     {
</span><ins>+        ASSERT(m_originThreadID == currentThread());
</ins><span class="cx">         ASSERT(m_performFunction);
</span><span class="cx">         m_performFunction();
</span><span class="cx">         m_performFunction = { };
</span><span class="lines">@@ -53,6 +62,7 @@
</span><span class="cx"> 
</span><span class="cx">     void completed(const IDBResultData&amp; data)
</span><span class="cx">     {
</span><ins>+        ASSERT(m_originThreadID == currentThread());
</ins><span class="cx">         ASSERT(m_completeFunction);
</span><span class="cx">         m_completeFunction(data);
</span><span class="cx">         m_transaction-&gt;operationDidComplete(*this);
</span><span class="lines">@@ -60,13 +70,9 @@
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="cx">     const IDBResourceIdentifier&amp; identifier() const { return m_identifier; }
</span><del>-    IDBResourceIdentifier transactionIdentifier() const { return m_transaction-&gt;info().identifier(); }
-    uint64_t objectStoreIdentifier() const { return m_objectStoreIdentifier; }
-    uint64_t indexIdentifier() const { return m_indexIdentifier; }
-    IDBResourceIdentifier* cursorIdentifier() const { return m_cursorIdentifier.get(); }
-    IDBTransaction&amp; transaction() { return m_transaction.get(); }
-    IndexedDB::IndexRecordType indexRecordType() const { return m_indexRecordType; }
</del><span class="cx"> 
</span><ins>+    ThreadIdentifier originThreadID() const { return m_originThreadID; }
+
</ins><span class="cx"> protected:
</span><span class="cx">     TransactionOperation(IDBTransaction&amp; transaction)
</span><span class="cx">         : m_transaction(transaction)
</span><span class="lines">@@ -84,6 +90,16 @@
</span><span class="cx">     IndexedDB::IndexRecordType m_indexRecordType;
</span><span class="cx">     std::function&lt;void ()&gt; m_performFunction;
</span><span class="cx">     std::function&lt;void (const IDBResultData&amp;)&gt; m_completeFunction;
</span><ins>+
+private:
+    IDBResourceIdentifier transactionIdentifier() const { return m_transaction-&gt;info().identifier(); }
+    uint64_t objectStoreIdentifier() const { return m_objectStoreIdentifier; }
+    uint64_t indexIdentifier() const { return m_indexIdentifier; }
+    IDBResourceIdentifier* cursorIdentifier() const { return m_cursorIdentifier.get(); }
+    IDBTransaction&amp; transaction() { return m_transaction.get(); }
+    IndexedDB::IndexRecordType indexRecordType() const { return m_indexRecordType; }
+
+    ThreadIdentifier m_originThreadID { currentThread() };
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> template &lt;typename... Arguments&gt;
</span></span></pre>
</div>
</div>

</body>
</html>