[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

andreip at google.com andreip at google.com
Wed Dec 22 13:41:09 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit bccb32df92be957c87d859f501d61c8d2776d81e
Author: andreip at google.com <andreip at google.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Sep 23 14:34:22 2010 +0000

    2010-09-23  Andrei Popescu  <andreip at google.com>
    
            Reviewed by Jeremy Orlow.
    
            IDBObjectStore::get should run in a transaction.
            https://bugs.webkit.org/show_bug.cgi?id=44700
    
            * storage/indexeddb/objectstore-basics-expected.txt:
            * storage/indexeddb/objectstore-basics.html:
            * storage/indexeddb/objectstore-removeobjectstore-expected.txt:
            * storage/indexeddb/objectstore-removeobjectstore.html:
    2010-09-23  Andrei Popescu  <andreip at google.com>
    
            Reviewed by Jeremy Orlow.
    
            IDBObjectStore::get should run in a transaction.
            https://bugs.webkit.org/show_bug.cgi?id=44700
    
            Implements logic for running IDBObjectStore::get() in a transaction.
            Refactors the pending transaction monitor and the transaction coordinator
            to use pointers instead of transaction IDs.
    
            * bindings/v8/V8Proxy.cpp:
            (WebCore::V8Proxy::didLeaveScriptContext):
            * storage/IDBCursorBackendImpl.cpp:
            * storage/IDBDatabase.cpp:
            (WebCore::IDBDatabase::objectStore):
            * storage/IDBDatabaseBackendImpl.cpp:
            (WebCore::IDBDatabaseBackendImpl::objectStore):
            * storage/IDBDatabaseBackendImpl.h:
            (WebCore::IDBDatabaseBackendImpl::transactionCoordinator):
            * storage/IDBFactoryBackendImpl.cpp:
            * storage/IDBFactoryBackendImpl.h:
            * storage/IDBFactoryBackendInterface.h:
            * storage/IDBObjectStore.cpp:
            (WebCore::IDBObjectStore::IDBObjectStore):
            (WebCore::IDBObjectStore::get):
            * storage/IDBObjectStore.h:
            (WebCore::IDBObjectStore::create):
            * storage/IDBObjectStoreBackendImpl.cpp:
            (WebCore::IDBTask::IDBTask):
            (WebCore::IDBTask::performTask):
            (WebCore::createTask):
            (WebCore::IDBObjectStoreBackendImpl::get):
            (WebCore::IDBObjectStoreBackendImpl::getInternal):
            * storage/IDBObjectStoreBackendImpl.h:
            * storage/IDBObjectStoreBackendInterface.h:
            * storage/IDBPendingTransactionMonitor.cpp:
            (WebCore::IDBPendingTransactionMonitor::addPendingTransaction):
            (WebCore::IDBPendingTransactionMonitor::removePendingTransaction):
            (WebCore::IDBPendingTransactionMonitor::abortPendingTransactions):
            * storage/IDBPendingTransactionMonitor.h:
            * storage/IDBRequest.cpp:
            (WebCore::IDBRequest::IDBRequest):
            (WebCore::IDBRequest::~IDBRequest):
            (WebCore::IDBRequest::onSuccess):
            (WebCore::IDBRequest::timerFired):
            * storage/IDBRequest.h:
            (WebCore::IDBRequest::create):
            * storage/IDBTransaction.cpp:
            (WebCore::IDBTransaction::IDBTransaction):
            (WebCore::IDBTransaction::objectStore):
            * storage/IDBTransactionBackendImpl.cpp:
            (WebCore::IDBTransactionBackendImpl::create):
            (WebCore::IDBTransactionBackendImpl::IDBTransactionBackendImpl):
            (WebCore::IDBTransactionBackendImpl::objectStore):
            (WebCore::IDBTransactionBackendImpl::scheduleTask):
            (WebCore::IDBTransactionBackendImpl::abort):
            (WebCore::IDBTransactionBackendImpl::didCompleteTaskEvents):
            (WebCore::IDBTransactionBackendImpl::run):
            (WebCore::IDBTransactionBackendImpl::start):
            (WebCore::IDBTransactionBackendImpl::commit):
            (WebCore::IDBTransactionBackendImpl::timerFired):
            * storage/IDBTransactionBackendImpl.h:
            (WebCore::IDBTransactionBackendImpl::~IDBTransactionBackendImpl):
            (WebCore::IDBTransactionBackendImpl::isFinished):
            * storage/IDBTransactionBackendInterface.h:
            * storage/IDBTransactionCoordinator.cpp:
            (WebCore::IDBTransactionCoordinator::createTransaction):
            (WebCore::IDBTransactionCoordinator::didStartTransaction):
            (WebCore::IDBTransactionCoordinator::didFinishTransaction):
            (WebCore::IDBTransactionCoordinator::processStartedTransactions):
            * storage/IDBTransactionCoordinator.h:
    2010-09-23  Andrei Popescu  <andreip at google.com>
    
            Reviewed by Jeremy Orlow.
    
            IDBObjectStore::get should run in a transaction.
            https://bugs.webkit.org/show_bug.cgi?id=44700
    
            * public/WebIDBFactory.h:
            * public/WebIDBObjectStore.h:
            * public/WebIDBTransaction.h:
            (WebKit::WebIDBTransaction::didCompleteTaskEvents):
            (WebKit::WebIDBTransaction::getIDBTransactionBackendInterface):
            * src/IDBDatabaseProxy.h:
            * src/IDBFactoryBackendProxy.cpp:
            * src/IDBFactoryBackendProxy.h:
            * src/IDBObjectStoreProxy.cpp:
            (WebCore::IDBObjectStoreProxy::get):
            * src/IDBObjectStoreProxy.h:
            * src/IDBTransactionBackendProxy.cpp:
            (WebCore::IDBTransactionBackendProxy::scheduleTask):
            (WebCore::IDBTransactionBackendProxy::didCompleteTaskEvents):
            * src/IDBTransactionBackendProxy.h:
            (WebCore::IDBTransactionBackendProxy::getWebIDBTransaction):
            * src/WebIDBFactoryImpl.cpp:
            * src/WebIDBFactoryImpl.h:
            * src/WebIDBObjectStoreImpl.cpp:
            (WebKit::WebIDBObjectStoreImpl::get):
            * src/WebIDBObjectStoreImpl.h:
            * src/WebIDBTransactionImpl.cpp:
            (WebKit::WebIDBTransactionImpl::didCompleteTaskEvents):
            (WebKit::WebIDBTransactionImpl::getIDBTransactionBackendInterface):
            * src/WebIDBTransactionImpl.h:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@68138 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index 789227d..9d55588 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,15 @@
+2010-09-23  Andrei Popescu  <andreip at google.com>
+
+        Reviewed by Jeremy Orlow.
+
+        IDBObjectStore::get should run in a transaction.
+        https://bugs.webkit.org/show_bug.cgi?id=44700
+
+        * storage/indexeddb/objectstore-basics-expected.txt:
+        * storage/indexeddb/objectstore-basics.html:
+        * storage/indexeddb/objectstore-removeobjectstore-expected.txt:
+        * storage/indexeddb/objectstore-removeobjectstore.html:
+
 2010-09-23  Adam Barth  <abarth at webkit.org>
 
         Rubber-stamped by Eric Seidel.
diff --git a/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt b/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt
index 890c00f..821e966 100644
--- a/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt
+++ b/LayoutTests/storage/indexeddb/objectstore-basics-expected.txt
@@ -113,7 +113,8 @@ PASS 'readyState' in event.target is true
 PASS event.target.readyState is event.target.DONE
 
 PASS event.code is IDBDatabaseException.UNKNOWN_ERR
-store = event.source
+db.transaction()
+store = transaction.objectStore('storeName')
 store.get('key')
 PASS 'onsuccess' in result is true
 PASS 'onerror' in result is true
diff --git a/LayoutTests/storage/indexeddb/objectstore-basics.html b/LayoutTests/storage/indexeddb/objectstore-basics.html
index 731d421..66376b7 100644
--- a/LayoutTests/storage/indexeddb/objectstore-basics.html
+++ b/LayoutTests/storage/indexeddb/objectstore-basics.html
@@ -85,7 +85,10 @@ function addAgainFailure()
     verifyErrorEvent(event);
     // FIXME: This error code needs to be specced.
     shouldBe("event.code", "IDBDatabaseException.UNKNOWN_ERR");
-    var store = evalAndLog("store = event.source");
+
+    transaction = evalAndLog("db.transaction()");
+    transaction.onabort = unexpectedErrorCallback;
+    var store = evalAndLog("store = transaction.objectStore('storeName')");
 
     result = evalAndLog("store.get('key')");
     verifyResult(result);
diff --git a/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-expected.txt b/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-expected.txt
index 0a3d938..60fedec 100644
--- a/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-expected.txt
+++ b/LayoutTests/storage/indexeddb/objectstore-removeobjectstore-expected.txt
@@ -61,7 +61,9 @@ PASS 'abort' in event.target is true
 PASS 'readyState' in event.target is true
 PASS event.target.readyState is event.target.DONE
 
-event.source.get('key')
+db.transaction()
+store = transaction.objectStore('storeName')
+store.get('key')
 PASS 'onsuccess' in result is true
 PASS 'onerror' in result is true
 PASS 'abort' in result is true
@@ -139,7 +141,9 @@ PASS 'abort' in event.target is true
 PASS 'readyState' in event.target is true
 PASS event.target.readyState is event.target.DONE
 
-event.result.get('key')
+db.transaction()
+store = transaction.objectStore('storeName')
+store.get('key')
 PASS 'onsuccess' in result is true
 PASS 'onerror' in result is true
 PASS 'abort' in result is true
diff --git a/LayoutTests/storage/indexeddb/objectstore-removeobjectstore.html b/LayoutTests/storage/indexeddb/objectstore-removeobjectstore.html
index e842f5b..7878c7f 100644
--- a/LayoutTests/storage/indexeddb/objectstore-removeobjectstore.html
+++ b/LayoutTests/storage/indexeddb/objectstore-removeobjectstore.html
@@ -49,7 +49,11 @@ function getValue()
 {
     verifySuccessEvent(event);
 
-    result = evalAndLog("event.source.get('key')");
+    transaction = evalAndLog("db.transaction()");
+    transaction.onabort = unexpectedErrorCallback;
+    var store = evalAndLog("store = transaction.objectStore('storeName')");
+
+    result = evalAndLog("store.get('key')");
     verifyResult(result);
     result.onsuccess = addIndex;
     result.onerror = unexpectedErrorCallback;
@@ -62,15 +66,20 @@ function addIndex()
 
     result = evalAndLog("event.source.createIndex('indexName', '')");
     verifyResult(result);
-    result.onsuccess = removeObjectStore;
+    result.onsuccess = commitTransaction;
     result.onerror = unexpectedErrorCallback;
 }
 
-function removeObjectStore()
+function commitTransaction()
 {
     verifySuccessEvent(event);
     shouldBeTrue("event.source.indexNames.contains('indexName')");
+    // Let the transaction commit.
+    window.setTimeout('removeObjectStore()', 0);
+}
 
+function removeObjectStore()
+{
     result = evalAndLog("db.removeObjectStore('storeName')");
     verifyResult(result);
     result.onsuccess = createObjectStoreAgain;
@@ -91,7 +100,11 @@ function getValueAgain()
 {
     verifySuccessEvent(event);
 
-    result = evalAndLog("event.result.get('key')");
+    transaction = evalAndLog("db.transaction()");
+    transaction.onabort = unexpectedErrorCallback;
+    var store = evalAndLog("store = transaction.objectStore('storeName')");
+
+    result = evalAndLog("store.get('key')");
     verifyResult(result);
     result.onsuccess = unexpectedSuccessCallback;
     result.onerror = verifyError;
@@ -100,7 +113,6 @@ function getValueAgain()
 function verifyError()
 {
     verifyErrorEvent(event);
-    // FIXME: Should just be IDBDatabaseException.NOT_FOUND_ERR but that doesn't work yet.
     shouldBe("event.code", "2");
     shouldBeFalse("event.source.indexNames.contains('indexName')");
 
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index fbf938b..2db16af 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,76 @@
+2010-09-23  Andrei Popescu  <andreip at google.com>
+
+        Reviewed by Jeremy Orlow.
+
+        IDBObjectStore::get should run in a transaction.
+        https://bugs.webkit.org/show_bug.cgi?id=44700
+
+        Implements logic for running IDBObjectStore::get() in a transaction.
+        Refactors the pending transaction monitor and the transaction coordinator
+        to use pointers instead of transaction IDs.
+ 
+        * bindings/v8/V8Proxy.cpp:
+        (WebCore::V8Proxy::didLeaveScriptContext):
+        * storage/IDBCursorBackendImpl.cpp:
+        * storage/IDBDatabase.cpp:
+        (WebCore::IDBDatabase::objectStore):
+        * storage/IDBDatabaseBackendImpl.cpp:
+        (WebCore::IDBDatabaseBackendImpl::objectStore):
+        * storage/IDBDatabaseBackendImpl.h:
+        (WebCore::IDBDatabaseBackendImpl::transactionCoordinator):
+        * storage/IDBFactoryBackendImpl.cpp:
+        * storage/IDBFactoryBackendImpl.h:
+        * storage/IDBFactoryBackendInterface.h:
+        * storage/IDBObjectStore.cpp:
+        (WebCore::IDBObjectStore::IDBObjectStore):
+        (WebCore::IDBObjectStore::get):
+        * storage/IDBObjectStore.h:
+        (WebCore::IDBObjectStore::create):
+        * storage/IDBObjectStoreBackendImpl.cpp:
+        (WebCore::IDBTask::IDBTask):
+        (WebCore::IDBTask::performTask):
+        (WebCore::createTask):
+        (WebCore::IDBObjectStoreBackendImpl::get):
+        (WebCore::IDBObjectStoreBackendImpl::getInternal):
+        * storage/IDBObjectStoreBackendImpl.h:
+        * storage/IDBObjectStoreBackendInterface.h:
+        * storage/IDBPendingTransactionMonitor.cpp:
+        (WebCore::IDBPendingTransactionMonitor::addPendingTransaction):
+        (WebCore::IDBPendingTransactionMonitor::removePendingTransaction):
+        (WebCore::IDBPendingTransactionMonitor::abortPendingTransactions):
+        * storage/IDBPendingTransactionMonitor.h:
+        * storage/IDBRequest.cpp:
+        (WebCore::IDBRequest::IDBRequest):
+        (WebCore::IDBRequest::~IDBRequest):
+        (WebCore::IDBRequest::onSuccess):
+        (WebCore::IDBRequest::timerFired):
+        * storage/IDBRequest.h:
+        (WebCore::IDBRequest::create):
+        * storage/IDBTransaction.cpp:
+        (WebCore::IDBTransaction::IDBTransaction):
+        (WebCore::IDBTransaction::objectStore):
+        * storage/IDBTransactionBackendImpl.cpp:
+        (WebCore::IDBTransactionBackendImpl::create):
+        (WebCore::IDBTransactionBackendImpl::IDBTransactionBackendImpl):
+        (WebCore::IDBTransactionBackendImpl::objectStore):
+        (WebCore::IDBTransactionBackendImpl::scheduleTask):
+        (WebCore::IDBTransactionBackendImpl::abort):
+        (WebCore::IDBTransactionBackendImpl::didCompleteTaskEvents):
+        (WebCore::IDBTransactionBackendImpl::run):
+        (WebCore::IDBTransactionBackendImpl::start):
+        (WebCore::IDBTransactionBackendImpl::commit):
+        (WebCore::IDBTransactionBackendImpl::timerFired):
+        * storage/IDBTransactionBackendImpl.h:
+        (WebCore::IDBTransactionBackendImpl::~IDBTransactionBackendImpl):
+        (WebCore::IDBTransactionBackendImpl::isFinished):
+        * storage/IDBTransactionBackendInterface.h:
+        * storage/IDBTransactionCoordinator.cpp:
+        (WebCore::IDBTransactionCoordinator::createTransaction):
+        (WebCore::IDBTransactionCoordinator::didStartTransaction):
+        (WebCore::IDBTransactionCoordinator::didFinishTransaction):
+        (WebCore::IDBTransactionCoordinator::processStartedTransactions):
+        * storage/IDBTransactionCoordinator.h:
+
 2010-09-23  Patrick Gansterer  <paroga at webkit.org>
 
         Reviewed by Adam Roben.
diff --git a/WebCore/bindings/v8/V8Proxy.cpp b/WebCore/bindings/v8/V8Proxy.cpp
index 9499075..0a62079 100644
--- a/WebCore/bindings/v8/V8Proxy.cpp
+++ b/WebCore/bindings/v8/V8Proxy.cpp
@@ -653,11 +653,7 @@ void V8Proxy::didLeaveScriptContext()
     // If we've just left a script context and indexed database has been
     // instantiated, we must let its transaction coordinator know so it can terminate
     // any not-yet-started transactions.
-    if (IDBPendingTransactionMonitor::hasPendingTransactions()) {
-        ASSERT(page->group().hasIDBFactory());
-        page->group().idbFactory()->abortPendingTransactions(IDBPendingTransactionMonitor::pendingTransactions());
-        IDBPendingTransactionMonitor::clearPendingTransactions();
-    }
+    IDBPendingTransactionMonitor::abortPendingTransactions();
 #endif // ENABLE(INDEXED_DATABASE)
     // If we've just left a top level script context and local storage has been
     // instantiated, we must ensure that any storage locks have been freed.
diff --git a/WebCore/storage/IDBCursorBackendImpl.cpp b/WebCore/storage/IDBCursorBackendImpl.cpp
index 3a4dd67..13df5f0 100644
--- a/WebCore/storage/IDBCursorBackendImpl.cpp
+++ b/WebCore/storage/IDBCursorBackendImpl.cpp
@@ -36,6 +36,7 @@
 #include "IDBKeyRange.h"
 #include "IDBObjectStoreBackendImpl.h"
 #include "IDBRequest.h"
+#include "IDBTransactionBackendInterface.h"
 #include "SQLiteDatabase.h"
 #include "SQLiteStatement.h"
 #include "SerializedScriptValue.h"
diff --git a/WebCore/storage/IDBDatabase.cpp b/WebCore/storage/IDBDatabase.cpp
index 81950d6..0ea7ac2 100644
--- a/WebCore/storage/IDBDatabase.cpp
+++ b/WebCore/storage/IDBDatabase.cpp
@@ -55,11 +55,12 @@ PassRefPtr<IDBRequest> IDBDatabase::createObjectStore(ScriptExecutionContext* co
     return request;
 }
 
+// FIXME: remove this method.
 PassRefPtr<IDBObjectStore> IDBDatabase::objectStore(const String& name, unsigned short mode)
 {
     RefPtr<IDBObjectStoreBackendInterface> objectStore = m_backend->objectStore(name, mode);
     ASSERT(objectStore); // FIXME: If this is null, we should raise a NOT_FOUND_ERR.
-    return IDBObjectStore::create(objectStore.release());
+    return IDBObjectStore::create(objectStore.release(), 0);
 }
 
 PassRefPtr<IDBRequest> IDBDatabase::removeObjectStore(ScriptExecutionContext* context, const String& name)
diff --git a/WebCore/storage/IDBDatabaseBackendImpl.cpp b/WebCore/storage/IDBDatabaseBackendImpl.cpp
index 021f70a..b8fe9b5 100644
--- a/WebCore/storage/IDBDatabaseBackendImpl.cpp
+++ b/WebCore/storage/IDBDatabaseBackendImpl.cpp
@@ -148,11 +148,12 @@ void IDBDatabaseBackendImpl::createObjectStore(const String& name, const String&
     callbacks->onSuccess(objectStore.get());
 }
 
+// FIXME: Do not expose this method via IDL.
 PassRefPtr<IDBObjectStoreBackendInterface> IDBDatabaseBackendImpl::objectStore(const String& name, unsigned short mode)
 {
-    // FIXME: If no transaction is running, this should implicitly start one.
-    ASSERT_UNUSED(mode, !mode); // FIXME: Handle non-standard modes.
-    return m_objectStores.get(name);
+    ASSERT_UNUSED(mode, !mode); // FIXME: Remove the mode parameter. Transactions have modes, not object stores.
+    RefPtr<IDBObjectStoreBackendInterface> objectStore = m_objectStores.get(name);
+    return objectStore.release();
 }
 
 static void doDelete(SQLiteDatabase& db, const char* sql, int64_t id)
diff --git a/WebCore/storage/IDBDatabaseBackendImpl.h b/WebCore/storage/IDBDatabaseBackendImpl.h
index ab055f8..7e08ad6 100644
--- a/WebCore/storage/IDBDatabaseBackendImpl.h
+++ b/WebCore/storage/IDBDatabaseBackendImpl.h
@@ -62,6 +62,8 @@ public:
     virtual void setVersion(const String& version, PassRefPtr<IDBCallbacks>);
     virtual PassRefPtr<IDBTransactionBackendInterface> transaction(DOMStringList* storeNames, unsigned short mode, unsigned long timeout);
 
+    IDBTransactionCoordinator* transactionCoordinator() const { return m_transactionCoordinator.get(); }
+
 private:
     IDBDatabaseBackendImpl(const String& name, const String& description, PassOwnPtr<SQLiteDatabase> database, IDBTransactionCoordinator*);
 
diff --git a/WebCore/storage/IDBFactoryBackendImpl.cpp b/WebCore/storage/IDBFactoryBackendImpl.cpp
index 26473ae..6219c2d 100644
--- a/WebCore/storage/IDBFactoryBackendImpl.cpp
+++ b/WebCore/storage/IDBFactoryBackendImpl.cpp
@@ -140,12 +140,6 @@ void IDBFactoryBackendImpl::open(const String& name, const String& description,
     m_databaseBackendMap.set(name, databaseBackend.release());
 }
 
-void IDBFactoryBackendImpl::abortPendingTransactions(const Vector<int>& pendingIDs)
-{
-    for (size_t i = 0; i < pendingIDs.size(); ++i)
-        m_transactionCoordinator->abort(pendingIDs.at(i));
-}
-
 String IDBFactoryBackendImpl::databaseFileName(const String& name, SecurityOrigin* securityOrigin)
 {
     String databaseIdentifier = securityOrigin->databaseIdentifier();
diff --git a/WebCore/storage/IDBFactoryBackendImpl.h b/WebCore/storage/IDBFactoryBackendImpl.h
index cb133de..76e545e 100644
--- a/WebCore/storage/IDBFactoryBackendImpl.h
+++ b/WebCore/storage/IDBFactoryBackendImpl.h
@@ -50,7 +50,6 @@ public:
     virtual ~IDBFactoryBackendImpl();
 
     virtual void open(const String& name, const String& description, PassRefPtr<IDBCallbacks>, PassRefPtr<SecurityOrigin>, Frame*, const String& dataDir);
-    virtual void abortPendingTransactions(const Vector<int>& pendingIDs);
 
     static String databaseFileName(const String& name, SecurityOrigin*);
 
diff --git a/WebCore/storage/IDBFactoryBackendInterface.h b/WebCore/storage/IDBFactoryBackendInterface.h
index e591271..4914024 100644
--- a/WebCore/storage/IDBFactoryBackendInterface.h
+++ b/WebCore/storage/IDBFactoryBackendInterface.h
@@ -52,7 +52,6 @@ public:
     virtual ~IDBFactoryBackendInterface() { }
 
     virtual void open(const String& name, const String& description, PassRefPtr<IDBCallbacks>, PassRefPtr<SecurityOrigin>, Frame*, const String& dataDir) = 0;
-    virtual void abortPendingTransactions(const Vector<int>& ids) = 0;
 };
 
 } // namespace WebCore
diff --git a/WebCore/storage/IDBObjectStore.cpp b/WebCore/storage/IDBObjectStore.cpp
index b457cd1..768b93c 100644
--- a/WebCore/storage/IDBObjectStore.cpp
+++ b/WebCore/storage/IDBObjectStore.cpp
@@ -31,6 +31,7 @@
 #include "IDBIndex.h"
 #include "IDBKey.h"
 #include "IDBKeyRange.h"
+#include "IDBTransactionBackendInterface.h"
 #include "SerializedScriptValue.h"
 #include <wtf/UnusedParam.h>
 
@@ -38,8 +39,9 @@
 
 namespace WebCore {
 
-IDBObjectStore::IDBObjectStore(PassRefPtr<IDBObjectStoreBackendInterface> idbObjectStore)
+IDBObjectStore::IDBObjectStore(PassRefPtr<IDBObjectStoreBackendInterface> idbObjectStore, IDBTransactionBackendInterface* transaction)
     : m_objectStore(idbObjectStore)
+    , m_transaction(transaction)
 {
     // We pass a reference to this object before it can be adopted.
     relaxAdoptionRequirement();
@@ -62,9 +64,9 @@ PassRefPtr<DOMStringList> IDBObjectStore::indexNames() const
 
 PassRefPtr<IDBRequest> IDBObjectStore::get(ScriptExecutionContext* context, PassRefPtr<IDBKey> key)
 {
-    RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this));
-    m_objectStore->get(key, request);
-    return request;
+    RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get());
+    m_objectStore->get(key, request, m_transaction.get());
+    return request.release();
 }
 
 PassRefPtr<IDBRequest> IDBObjectStore::add(ScriptExecutionContext* context, PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key)
diff --git a/WebCore/storage/IDBObjectStore.h b/WebCore/storage/IDBObjectStore.h
index 035f5d8..df5b3f7 100644
--- a/WebCore/storage/IDBObjectStore.h
+++ b/WebCore/storage/IDBObjectStore.h
@@ -43,13 +43,14 @@ class DOMStringList;
 class IDBAny;
 class IDBIndexRequest;
 class IDBKey;
+class IDBTransactionBackendInterface;
 class SerializedScriptValue;
 
 class IDBObjectStore : public RefCounted<IDBObjectStore> {
 public:
-    static PassRefPtr<IDBObjectStore> create(PassRefPtr<IDBObjectStoreBackendInterface> idbObjectStore)
+    static PassRefPtr<IDBObjectStore> create(PassRefPtr<IDBObjectStoreBackendInterface> idbObjectStore, IDBTransactionBackendInterface* transaction)
     {
-        return adoptRef(new IDBObjectStore(idbObjectStore));
+        return adoptRef(new IDBObjectStore(idbObjectStore, transaction));
     }
     ~IDBObjectStore() { }
 
@@ -69,9 +70,11 @@ public:
     PassRefPtr<IDBRequest> openCursor(ScriptExecutionContext*, PassRefPtr<IDBKeyRange> = 0, unsigned short direction = IDBCursor::NEXT);
 
 private:
-    IDBObjectStore(PassRefPtr<IDBObjectStoreBackendInterface>);
+    IDBObjectStore(PassRefPtr<IDBObjectStoreBackendInterface>, IDBTransactionBackendInterface* transaction);
+    void removeTransactionFromPendingList();
 
     RefPtr<IDBObjectStoreBackendInterface> m_objectStore;
+    RefPtr<IDBTransactionBackendInterface> m_transaction;
 };
 
 } // namespace WebCore
diff --git a/WebCore/storage/IDBObjectStoreBackendImpl.cpp b/WebCore/storage/IDBObjectStoreBackendImpl.cpp
index e5f81ab..18d6b0c 100644
--- a/WebCore/storage/IDBObjectStoreBackendImpl.cpp
+++ b/WebCore/storage/IDBObjectStoreBackendImpl.cpp
@@ -36,6 +36,8 @@
 #include "IDBKeyPath.h"
 #include "IDBKeyPathBackendImpl.h"
 #include "IDBKeyRange.h"
+#include "IDBTransactionBackendInterface.h"
+#include "ScriptExecutionContext.h"
 #include "SQLiteDatabase.h"
 #include "SQLiteStatement.h"
 #include "SQLiteTransaction.h"
@@ -44,6 +46,33 @@
 
 namespace WebCore {
 
+template <class T, class Method, class Param1, class Param2>
+class IDBTask : public ScriptExecutionContext::Task {
+public:
+    IDBTask(T* obj, Method method, const Param1& param1, const Param2& param2)
+        : m_obj(obj), m_method(method), m_param1(param1), m_param2(param2) 
+    {
+    }
+
+    virtual void performTask(ScriptExecutionContext*) 
+    {
+        if (m_obj)
+            (m_obj->*m_method)(m_param1, m_param2);
+    }
+
+private:
+    T* m_obj;
+    Method m_method;
+    Param1 m_param1;
+    Param2 m_param2;
+};
+
+template <class T, class Method, class Param1, class Param2>
+PassOwnPtr<ScriptExecutionContext::Task> createTask(T* object, Method method, const Param1& param1, const Param2& param2)
+{
+    return adoptPtr(new IDBTask<T, Method, Param1, Param2>(object, method, param1, param2));
+}
+
 IDBObjectStoreBackendImpl::~IDBObjectStoreBackendImpl()
 {
 }
@@ -77,7 +106,13 @@ static void bindWhereClause(SQLiteStatement& query, int64_t id, IDBKey* key)
     key->bind(query, 2);
 }
 
-void IDBObjectStoreBackendImpl::get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks)
+void IDBObjectStoreBackendImpl::get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction)
+{
+    if (!transaction->scheduleTask(createTask(this, &IDBObjectStoreBackendImpl::getInternal, key, callbacks)))
+        callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::NOT_ALLOWED_ERR, "Get must be called in the context of a transaction."));
+}
+
+void IDBObjectStoreBackendImpl::getInternal(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks)
 {
     SQLiteStatement query(sqliteDatabase(), "SELECT keyString, keyDate, keyNumber, value FROM ObjectStoreData " + whereClause(key.get()));
     bool ok = query.prepare() == SQLResultOk;
diff --git a/WebCore/storage/IDBObjectStoreBackendImpl.h b/WebCore/storage/IDBObjectStoreBackendImpl.h
index 32ef920..36c0014 100644
--- a/WebCore/storage/IDBObjectStoreBackendImpl.h
+++ b/WebCore/storage/IDBObjectStoreBackendImpl.h
@@ -36,6 +36,7 @@ namespace WebCore {
 
 class IDBDatabaseBackendImpl;
 class IDBIndexBackendImpl;
+class IDBTransactionBackendInterface;
 class SQLiteDatabase;
 
 class IDBObjectStoreBackendImpl : public IDBObjectStoreBackendInterface {
@@ -51,7 +52,7 @@ public:
     String keyPath() const { return m_keyPath; }
     PassRefPtr<DOMStringList> indexNames() const;
 
-    void get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>);
+    void get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface* transaction);
     void put(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key, bool addOnly, PassRefPtr<IDBCallbacks>);
     void remove(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>);
 
@@ -69,6 +70,8 @@ private:
     void loadIndexes();
     SQLiteDatabase& sqliteDatabase() const;
 
+    void getInternal(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>);
+
     RefPtr<IDBDatabaseBackendImpl> m_database;
 
     int64_t m_id;
diff --git a/WebCore/storage/IDBObjectStoreBackendInterface.h b/WebCore/storage/IDBObjectStoreBackendInterface.h
index 200ac29..c19855c 100644
--- a/WebCore/storage/IDBObjectStoreBackendInterface.h
+++ b/WebCore/storage/IDBObjectStoreBackendInterface.h
@@ -38,6 +38,7 @@ class IDBCallbacks;
 class IDBIndexBackendInterface;
 class IDBKey;
 class IDBKeyRange;
+class IDBTransactionBackendInterface;
 class SerializedScriptValue;
 
 class IDBObjectStoreBackendInterface : public ThreadSafeShared<IDBObjectStoreBackendInterface> {
@@ -48,7 +49,7 @@ public:
     virtual String keyPath() const = 0;
     virtual PassRefPtr<DOMStringList> indexNames() const = 0;
 
-    virtual void get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>) = 0;
+    virtual void get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface* transaction) = 0;
     virtual void put(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key, bool addOnly, PassRefPtr<IDBCallbacks>) = 0;
     virtual void remove(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>) = 0;
 
diff --git a/WebCore/storage/IDBPendingTransactionMonitor.cpp b/WebCore/storage/IDBPendingTransactionMonitor.cpp
index d026099..799200d 100644
--- a/WebCore/storage/IDBPendingTransactionMonitor.cpp
+++ b/WebCore/storage/IDBPendingTransactionMonitor.cpp
@@ -25,47 +25,48 @@
 
 #include "config.h"
 #include "IDBPendingTransactionMonitor.h"
+#include "IDBTransactionBackendInterface.h"
 
 #if ENABLE(INDEXED_DATABASE)
 
 namespace WebCore {
 
-Vector<int>* IDBPendingTransactionMonitor::m_ids = 0;
+Vector<IDBTransactionBackendInterface*>* IDBPendingTransactionMonitor::m_transactions = 0;
 
-bool IDBPendingTransactionMonitor::hasPendingTransactions()
+void IDBPendingTransactionMonitor::addPendingTransaction(IDBTransactionBackendInterface* transaction)
 {
-    return m_ids && m_ids->size();
+    if (!m_transactions)
+        m_transactions = new Vector<IDBTransactionBackendInterface*>();
+    m_transactions->append(transaction);
 }
 
-void IDBPendingTransactionMonitor::addPendingTransaction(int id)
+void IDBPendingTransactionMonitor::removePendingTransaction(IDBTransactionBackendInterface* transaction)
 {
-    if (!m_ids)
-        m_ids = new Vector<int>();
-    m_ids->append(id);
-}
+    if (!m_transactions)
+        return;
 
-void IDBPendingTransactionMonitor::removePendingTransaction(int id)
-{
-    m_ids->remove(id);
-    if (!m_ids->size()) {
-        delete m_ids;
-        m_ids = 0;
+    size_t pos = m_transactions->find(transaction);
+    if (pos == notFound)
+        return;
+
+    m_transactions->remove(pos);
+
+    if (!m_transactions->size()) {
+        delete m_transactions;
+        m_transactions = 0;
     }
 }
 
-void IDBPendingTransactionMonitor::clearPendingTransactions()
+void IDBPendingTransactionMonitor::abortPendingTransactions()
 {
-    if (!m_ids)
+    if (!m_transactions)
         return;
 
-    m_ids->clear();
-    delete m_ids;
-    m_ids = 0;
-}
+    for (size_t i = 0; i < m_transactions->size(); ++i)
+        m_transactions->at(i)->abort();
 
-const Vector<int>& IDBPendingTransactionMonitor::pendingTransactions()
-{
-    return *m_ids;
+    delete m_transactions;
+    m_transactions = 0;
 }
 
 };
diff --git a/WebCore/storage/IDBPendingTransactionMonitor.h b/WebCore/storage/IDBPendingTransactionMonitor.h
index 00e833a..783a731 100644
--- a/WebCore/storage/IDBPendingTransactionMonitor.h
+++ b/WebCore/storage/IDBPendingTransactionMonitor.h
@@ -33,27 +33,27 @@
 
 namespace WebCore {
 
+class IDBTransactionBackendInterface;
+
 // This class keeps track of the transactions created during the current
 // Javascript execution context. A transaction is 'pending' if no asynchronous
 // operation is currently queued for it (e.g. an IDBObjectStore::put() or similar).
 // All pending transactions are aborted as soon as execution returns from
 // the script engine.
 //
-// FIXME: move the vector of transaction IDs to TLS. Keeping it static
+// FIXME: move the vector of transactions to TLS. Keeping it static
 // will not work once we add support for workers. Another possible
 // solution is to keep the vector in the ScriptExecutionContext.
 class IDBPendingTransactionMonitor : public Noncopyable {
 public:
-    static bool hasPendingTransactions();
-    static void addPendingTransaction(int id);
-    static void removePendingTransaction(int id);
-    static void clearPendingTransactions();
-    static const Vector<int>& pendingTransactions();
+    static void addPendingTransaction(IDBTransactionBackendInterface*);
+    static void removePendingTransaction(IDBTransactionBackendInterface*);
+    static void abortPendingTransactions();
 
 private:
     IDBPendingTransactionMonitor();
 
-    static Vector<int>* m_ids;
+    static Vector<IDBTransactionBackendInterface*>* m_transactions;
 };
 
 } // namespace WebCore
diff --git a/WebCore/storage/IDBRequest.cpp b/WebCore/storage/IDBRequest.cpp
index 6fbda0e..a7760f4 100644
--- a/WebCore/storage/IDBRequest.cpp
+++ b/WebCore/storage/IDBRequest.cpp
@@ -40,22 +40,35 @@
 #include "IDBIndex.h"
 #include "IDBErrorEvent.h"
 #include "IDBObjectStore.h"
+#include "IDBPendingTransactionMonitor.h"
 #include "IDBSuccessEvent.h"
 #include "ScriptExecutionContext.h"
 
 namespace WebCore {
 
-IDBRequest::IDBRequest(ScriptExecutionContext* context, PassRefPtr<IDBAny> source)
+IDBRequest::IDBRequest(ScriptExecutionContext* context, PassRefPtr<IDBAny> source, IDBTransactionBackendInterface* transaction)
     : ActiveDOMObject(context, this)
     , m_source(source)
+    , m_transaction(transaction)
     , m_timer(this, &IDBRequest::timerFired)
     , m_aborted(false)
     , m_readyState(LOADING)
 {
+    if (transaction)
+        IDBPendingTransactionMonitor::removePendingTransaction(transaction);
 }
 
 IDBRequest::~IDBRequest()
 {
+    // The transaction pointer is used to notify the transaction once the JS events were
+    // dispatched by this request object. If no new tasks were added by the event JS callbacks,
+    // the transaction can commit. Otherwise, it can continue executing the new tasks.
+    // It is important to guarantee that the transaction is notified after the events are
+    // dispatched, as the transaction cannot commit or execute new tasks in the absence
+    // of these notifications. We clear the transaction pointer once the events have dispatched,
+    // so having a non-zero pointer at IDBRequest destruction time shows that the events have not
+    // yet fired and there is a transaction waiting to be notified. This is an error.
+    ASSERT(!m_transaction);
     abort();
 }
 
@@ -100,7 +113,9 @@ void IDBRequest::onSuccess(PassRefPtr<IDBKey> idbKey)
 
 void IDBRequest::onSuccess(PassRefPtr<IDBObjectStoreBackendInterface> backend)
 {
-    scheduleEvent(IDBAny::create(IDBObjectStore::create(backend)), 0);
+    // FIXME: the transaction pointer should be the one of the setVersion transaction. This is because
+    // this callback is only executed for operations that neen to run in a setVersion transaction.
+    scheduleEvent(IDBAny::create(IDBObjectStore::create(backend, 0)), 0);
 }
 
 void IDBRequest::onSuccess(PassRefPtr<SerializedScriptValue> serializedScriptValue)
@@ -161,6 +176,13 @@ void IDBRequest::timerFired(Timer<IDBRequest>*)
             dispatchEvent(IDBSuccessEvent::create(m_source, pendingEvents[i].m_result));
         }
     }
+    if (m_transaction) {
+        // Now that we processed all pending events, let the transaction monitor check if
+        // it can commit the current transaction or if there's anything new pending.
+        // FIXME: Handle the workers case.
+        m_transaction->didCompleteTaskEvents();
+        m_transaction.clear();
+    }
 }
 
 void IDBRequest::scheduleEvent(PassRefPtr<IDBAny> result, PassRefPtr<IDBDatabaseError> error)
diff --git a/WebCore/storage/IDBRequest.h b/WebCore/storage/IDBRequest.h
index 9b0ea7e..c0515aa 100644
--- a/WebCore/storage/IDBRequest.h
+++ b/WebCore/storage/IDBRequest.h
@@ -42,9 +42,11 @@
 
 namespace WebCore {
 
+class IDBTransactionBackendInterface;
+
 class IDBRequest : public IDBCallbacks, public EventTarget, public ActiveDOMObject {
 public:
-    static PassRefPtr<IDBRequest> create(ScriptExecutionContext* context, PassRefPtr<IDBAny> source) { return adoptRef(new IDBRequest(context, source)); }
+    static PassRefPtr<IDBRequest> create(ScriptExecutionContext* context, PassRefPtr<IDBAny> source, IDBTransactionBackendInterface* transaction = 0) { return adoptRef(new IDBRequest(context, source, transaction)); }
     virtual ~IDBRequest();
 
     // Defined in the IDL
@@ -80,7 +82,7 @@ public:
     using RefCounted<IDBCallbacks>::deref;
 
 private:
-    IDBRequest(ScriptExecutionContext*, PassRefPtr<IDBAny> source);
+    IDBRequest(ScriptExecutionContext*, PassRefPtr<IDBAny> source, IDBTransactionBackendInterface* transaction);
 
     void timerFired(Timer<IDBRequest>*);
     void scheduleEvent(PassRefPtr<IDBAny> result, PassRefPtr<IDBDatabaseError>);
@@ -92,6 +94,7 @@ private:
     virtual EventTargetData* ensureEventTargetData();
 
     RefPtr<IDBAny> m_source;
+    RefPtr<IDBTransactionBackendInterface> m_transaction;
 
     struct PendingEvent {
         RefPtr<IDBAny> m_result;
diff --git a/WebCore/storage/IDBTransaction.cpp b/WebCore/storage/IDBTransaction.cpp
index 4e93378..ed76281 100644
--- a/WebCore/storage/IDBTransaction.cpp
+++ b/WebCore/storage/IDBTransaction.cpp
@@ -32,6 +32,7 @@
 #include "EventException.h"
 #include "IDBAbortEvent.h"
 #include "IDBDatabase.h"
+#include "IDBDatabaseException.h"
 #include "IDBObjectStore.h"
 #include "IDBObjectStoreBackendInterface.h"
 #include "IDBPendingTransactionMonitor.h"
@@ -46,7 +47,7 @@ IDBTransaction::IDBTransaction(ScriptExecutionContext* context, PassRefPtr<IDBTr
     , m_stopped(false)
     , m_timer(this, &IDBTransaction::timerFired)
 {
-    IDBPendingTransactionMonitor::addPendingTransaction(m_backend->id());
+    IDBPendingTransactionMonitor::addPendingTransaction(m_backend.get());
 }
 
 IDBTransaction::~IDBTransaction()
@@ -66,7 +67,11 @@ IDBDatabase* IDBTransaction::db()
 PassRefPtr<IDBObjectStore> IDBTransaction::objectStore(const String& name, const ExceptionCode&)
 {
     RefPtr<IDBObjectStoreBackendInterface> objectStoreBackend = m_backend->objectStore(name);
-    RefPtr<IDBObjectStore> objectStore = IDBObjectStore::create(objectStoreBackend);
+    if (!objectStoreBackend) {
+        throwError(IDBDatabaseException::NOT_ALLOWED_ERR);
+        return 0;
+    }
+    RefPtr<IDBObjectStore> objectStore = IDBObjectStore::create(objectStoreBackend, m_backend.get());
     return objectStore.release();
 }
 
diff --git a/WebCore/storage/IDBTransactionBackendImpl.cpp b/WebCore/storage/IDBTransactionBackendImpl.cpp
index 51b33b2..4f18437 100644
--- a/WebCore/storage/IDBTransactionBackendImpl.cpp
+++ b/WebCore/storage/IDBTransactionBackendImpl.cpp
@@ -29,11 +29,12 @@
 #if ENABLE(INDEXED_DATABASE)
 
 #include "IDBDatabaseBackendImpl.h"
+#include "IDBTransactionCoordinator.h"
 #include "SQLiteDatabase.h"
 
 namespace WebCore {
 
-PassRefPtr<IDBTransactionBackendInterface> IDBTransactionBackendImpl::create(DOMStringList* objectStores, unsigned short mode, unsigned long timeout, int id, IDBDatabaseBackendImpl* database)
+PassRefPtr<IDBTransactionBackendImpl> IDBTransactionBackendImpl::create(DOMStringList* objectStores, unsigned short mode, unsigned long timeout, int id, IDBDatabaseBackendImpl* database)
 {
     return adoptRef(new IDBTransactionBackendImpl(objectStores, mode, timeout, id, database));
 }
@@ -43,26 +44,104 @@ IDBTransactionBackendImpl::IDBTransactionBackendImpl(DOMStringList* objectStores
     , m_mode(mode)
     , m_timeout(timeout)
     , m_id(id)
-    , m_aborted(false)
+    , m_state(NotStarted)
     , m_database(database)
+    , m_transaction(new SQLiteTransaction(database->sqliteDatabase()))
+    , m_timer(this, &IDBTransactionBackendImpl::timerFired)
+    , m_pendingEvents(0)
 {
 }
 
 PassRefPtr<IDBObjectStoreBackendInterface> IDBTransactionBackendImpl::objectStore(const String& name)
 {
+    if (isFinished())
+        return 0;
     return m_database->objectStore(name, 0); // FIXME: remove mode param.
 }
 
-void IDBTransactionBackendImpl::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>)
+bool IDBTransactionBackendImpl::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task> task)
 {
-    // FIXME: implement.
-    ASSERT_NOT_REACHED();
+    if (isFinished())
+        return false;
+
+    m_taskQueue.append(task);
+    if (m_state == NotStarted)
+        start();
+
+    return true;
 }
 
 void IDBTransactionBackendImpl::abort()
 {
-    m_aborted = true;
+    if (isFinished())
+        return;
+
+    m_state = Finished;
+    m_transaction->rollback();
     m_callbacks->onAbort();
+    m_database->transactionCoordinator()->didFinishTransaction(this);
+}
+
+void IDBTransactionBackendImpl::didCompleteTaskEvents()
+{
+    ASSERT(m_state == Started);
+    ASSERT(m_pendingEvents);
+
+    m_pendingEvents--;
+
+    if (!m_pendingEvents && m_taskQueue.isEmpty()) {
+        // The last task event has completed and the task
+        // queue is empty. Commit the transaction.
+        commit();
+        return;
+    }
+
+    // We are still waiting for other events to complete. However,
+    // the task queue is non-empty and the timer is inactive.
+    // We can therfore schedule the timer again.
+    if (!m_taskQueue.isEmpty() && !m_timer.isActive())
+        m_timer.startOneShot(0);
+}
+
+void IDBTransactionBackendImpl::run()
+{
+    ASSERT(m_state == Started);
+    ASSERT(!m_timer.isActive());
+
+    m_timer.startOneShot(0);
+}
+
+void IDBTransactionBackendImpl::start()
+{
+    ASSERT(m_state == NotStarted);
+
+    m_state = Started;
+    m_transaction->begin();
+    m_database->transactionCoordinator()->didStartTransaction(this);
+}
+
+void IDBTransactionBackendImpl::commit()
+{
+    ASSERT(m_state == Started);
+
+    m_state = Finished;
+    m_transaction->commit();
+    m_database->transactionCoordinator()->didFinishTransaction(this);
+}
+
+void IDBTransactionBackendImpl::timerFired(Timer<IDBTransactionBackendImpl>*)
+{
+    ASSERT(!m_taskQueue.isEmpty());
+    ASSERT(m_state == Started);
+
+    TaskQueue queue;
+    queue.swap(m_taskQueue);
+    while (!queue.isEmpty()) {
+        OwnPtr<ScriptExecutionContext::Task> task(queue.first().release());
+        queue.removeFirst();
+        m_pendingEvents++;
+        task->performTask(0);
+    }
 }
 
 };
diff --git a/WebCore/storage/IDBTransactionBackendImpl.h b/WebCore/storage/IDBTransactionBackendImpl.h
index fb57401..6d9a3ac 100644
--- a/WebCore/storage/IDBTransactionBackendImpl.h
+++ b/WebCore/storage/IDBTransactionBackendImpl.h
@@ -31,6 +31,8 @@
 #include "DOMStringList.h"
 #include "IDBTransactionBackendInterface.h"
 #include "IDBTransactionCallbacks.h"
+#include <SQLiteTransaction.h>
+#include <wtf/Deque.h>
 #include <wtf/RefPtr.h>
 
 namespace WebCore {
@@ -39,26 +41,51 @@ class IDBDatabaseBackendImpl;
 
 class IDBTransactionBackendImpl : public IDBTransactionBackendInterface {
 public:
-    static PassRefPtr<IDBTransactionBackendInterface> create(DOMStringList* objectStores, unsigned short mode, unsigned long timeout, int id, IDBDatabaseBackendImpl*);
-    virtual ~IDBTransactionBackendImpl() { }
+    static PassRefPtr<IDBTransactionBackendImpl> create(DOMStringList* objectStores, unsigned short mode, unsigned long timeout, int id, IDBDatabaseBackendImpl*);
+    virtual ~IDBTransactionBackendImpl() { abort(); }
 
     virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name);
     virtual unsigned short mode() const { return m_mode; }
-    virtual void scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>);
+    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>);
+    virtual void didCompleteTaskEvents();
     virtual void abort();
     virtual int id() const { return m_id; }
     virtual void setCallbacks(IDBTransactionCallbacks* callbacks) { m_callbacks = callbacks; }
 
+    void run();
+    bool isFinished() const { return m_state == Finished; }
+
 private:
     IDBTransactionBackendImpl(DOMStringList* objectStores, unsigned short mode, unsigned long timeout, int id, IDBDatabaseBackendImpl*);
 
+    enum State {
+        NotStarted,
+        Started,
+        Finished,
+    };
+
+    void start();
+    void commit();
+
+    void timerFired(Timer<IDBTransactionBackendImpl>*);
+
     RefPtr<DOMStringList> m_objectStoreNames;
     unsigned short m_mode;
     unsigned long m_timeout;
     int m_id;
-    bool m_aborted;
+
+    State m_state;
     RefPtr<IDBTransactionCallbacks> m_callbacks;
     RefPtr<IDBDatabaseBackendImpl> m_database;
+
+    typedef Deque<OwnPtr<ScriptExecutionContext::Task> > TaskQueue;
+    TaskQueue m_taskQueue;
+
+    OwnPtr<SQLiteTransaction> m_transaction;
+
+    // FIXME: delete the timer once we have threads instead.
+    Timer<IDBTransactionBackendImpl> m_timer;
+    int m_pendingEvents;
 };
 
 } // namespace WebCore
diff --git a/WebCore/storage/IDBTransactionBackendInterface.h b/WebCore/storage/IDBTransactionBackendInterface.h
index 39651f1..db95d03 100644
--- a/WebCore/storage/IDBTransactionBackendInterface.h
+++ b/WebCore/storage/IDBTransactionBackendInterface.h
@@ -50,7 +50,8 @@ public:
 
     virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name) = 0;
     virtual unsigned short mode() const = 0;
-    virtual void scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>) = 0;
+    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>) = 0;
+    virtual void didCompleteTaskEvents() = 0;
     virtual void abort() = 0;
     virtual int id() const = 0;
     virtual void setCallbacks(IDBTransactionCallbacks*) = 0;
diff --git a/WebCore/storage/IDBTransactionCoordinator.cpp b/WebCore/storage/IDBTransactionCoordinator.cpp
index 9790c1f..049bed3 100644
--- a/WebCore/storage/IDBTransactionCoordinator.cpp
+++ b/WebCore/storage/IDBTransactionCoordinator.cpp
@@ -47,21 +47,48 @@ IDBTransactionCoordinator::~IDBTransactionCoordinator()
 
 PassRefPtr<IDBTransactionBackendInterface> IDBTransactionCoordinator::createTransaction(DOMStringList* objectStores, unsigned short mode, unsigned long timeout, IDBDatabaseBackendImpl* database)
 {
-    RefPtr<IDBTransactionBackendInterface> transaction = IDBTransactionBackendImpl::create(objectStores, mode, timeout, ++m_nextID, database);
-    m_transactionQueue.add(transaction.get());
-    m_idMap.add(m_nextID, transaction);
+    RefPtr<IDBTransactionBackendImpl> transaction = IDBTransactionBackendImpl::create(objectStores, mode, timeout, ++m_nextID, database);
+    m_transactions.add(m_nextID, transaction);
     return transaction.release();
 }
 
-void IDBTransactionCoordinator::abort(int id)
+void IDBTransactionCoordinator::didStartTransaction(IDBTransactionBackendImpl* transaction)
 {
-    ASSERT(m_idMap.contains(id));
-    RefPtr<IDBTransactionBackendInterface> transaction = m_idMap.get(id);
-    ASSERT(transaction);
-    m_transactionQueue.remove(transaction.get());
-    m_idMap.remove(id);
-    transaction->abort();
-    // FIXME: this will change once we have transactions actually running.
+    ASSERT(m_transactions.contains(transaction->id()));
+
+    m_startedTransactions.add(transaction);
+    processStartedTransactions();
+}
+
+void IDBTransactionCoordinator::didFinishTransaction(IDBTransactionBackendImpl* transaction)
+{
+    ASSERT(m_transactions.contains(transaction->id()));
+
+    if (m_startedTransactions.contains(transaction)) {
+        ASSERT(!m_runningTransactions.contains(transaction));
+        m_startedTransactions.remove(transaction);
+    } else {
+        ASSERT(m_runningTransactions.contains(transaction));
+        m_runningTransactions.remove(transaction);
+    }
+    m_transactions.remove(transaction->id());
+
+    processStartedTransactions();
+}
+
+void IDBTransactionCoordinator::processStartedTransactions()
+{
+    // FIXME: This should allocate a thread to the next transaction that's
+    // ready to run. For now we only have a single running transaction.
+    if (m_startedTransactions.isEmpty() || !m_runningTransactions.isEmpty())
+        return;
+
+    ASSERT(m_transactions.contains(transaction->id()));
+
+    IDBTransactionBackendImpl* transaction = *m_startedTransactions.begin();
+    m_startedTransactions.remove(transaction);
+    m_runningTransactions.add(transaction);
+    transaction->run();
 }
 
 };
diff --git a/WebCore/storage/IDBTransactionCoordinator.h b/WebCore/storage/IDBTransactionCoordinator.h
index 104a956..5e54ab4 100644
--- a/WebCore/storage/IDBTransactionCoordinator.h
+++ b/WebCore/storage/IDBTransactionCoordinator.h
@@ -35,6 +35,7 @@
 
 namespace WebCore {
 
+class IDBTransactionBackendImpl;
 class IDBTransactionCallbacks;
 class IDBDatabaseBackendImpl;
 
@@ -55,14 +56,21 @@ public:
     virtual ~IDBTransactionCoordinator();
 
     PassRefPtr<IDBTransactionBackendInterface> createTransaction(DOMStringList* objectStores, unsigned short mode, unsigned long timeout, IDBDatabaseBackendImpl*);
-    void abort(int transactionId);
+
+    // Called by transactions as they start and finish.
+    void didStartTransaction(IDBTransactionBackendImpl*);
+    void didFinishTransaction(IDBTransactionBackendImpl*);
 
 private:
     IDBTransactionCoordinator();
 
-    ListHashSet<IDBTransactionBackendInterface*> m_transactionQueue;
-    typedef HashMap<int, RefPtr<IDBTransactionBackendInterface> > IdToTransactionMap;
-    IdToTransactionMap m_idMap;
+    void processStartedTransactions();
+
+    // This map owns all transactions known to the coordinator.
+    HashMap<int, RefPtr<IDBTransactionBackendImpl> > m_transactions;
+    // Transactions in different states are grouped below.
+    ListHashSet<IDBTransactionBackendImpl* > m_startedTransactions;
+    HashSet<IDBTransactionBackendImpl* > m_runningTransactions;
     int m_nextID;
 };
 
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 842904c..54add6f 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,36 @@
+2010-09-23  Andrei Popescu  <andreip at google.com>
+
+        Reviewed by Jeremy Orlow.
+
+        IDBObjectStore::get should run in a transaction.
+        https://bugs.webkit.org/show_bug.cgi?id=44700
+
+        * public/WebIDBFactory.h:
+        * public/WebIDBObjectStore.h:
+        * public/WebIDBTransaction.h:
+        (WebKit::WebIDBTransaction::didCompleteTaskEvents):
+        (WebKit::WebIDBTransaction::getIDBTransactionBackendInterface):
+        * src/IDBDatabaseProxy.h:
+        * src/IDBFactoryBackendProxy.cpp:
+        * src/IDBFactoryBackendProxy.h:
+        * src/IDBObjectStoreProxy.cpp:
+        (WebCore::IDBObjectStoreProxy::get):
+        * src/IDBObjectStoreProxy.h:
+        * src/IDBTransactionBackendProxy.cpp:
+        (WebCore::IDBTransactionBackendProxy::scheduleTask):
+        (WebCore::IDBTransactionBackendProxy::didCompleteTaskEvents):
+        * src/IDBTransactionBackendProxy.h:
+        (WebCore::IDBTransactionBackendProxy::getWebIDBTransaction):
+        * src/WebIDBFactoryImpl.cpp:
+        * src/WebIDBFactoryImpl.h:
+        * src/WebIDBObjectStoreImpl.cpp:
+        (WebKit::WebIDBObjectStoreImpl::get):
+        * src/WebIDBObjectStoreImpl.h:
+        * src/WebIDBTransactionImpl.cpp:
+        (WebKit::WebIDBTransactionImpl::didCompleteTaskEvents):
+        (WebKit::WebIDBTransactionImpl::getIDBTransactionBackendInterface):
+        * src/WebIDBTransactionImpl.h:
+
 2010-09-23  Jeremy Orlow  <jorlow at chromium.org>
 
         Unreviewed small fix for my last patch.
diff --git a/WebKit/chromium/public/WebIDBFactory.h b/WebKit/chromium/public/WebIDBFactory.h
index 0be4c63..cb5d369 100755
--- a/WebKit/chromium/public/WebIDBFactory.h
+++ b/WebKit/chromium/public/WebIDBFactory.h
@@ -54,8 +54,6 @@ public:
     // The WebKit implementation of open ignores the WebFrame* parameter.
     virtual void open(const WebString& name, const WebString& description, WebIDBCallbacks* callbacks, const WebSecurityOrigin& origin, WebFrame* webFrame, const WebString& dataDir) { WEBKIT_ASSERT_NOT_REACHED(); }
 
-    virtual void abortPendingTransactions(const WebVector<int>& pendingIDs) { WEBKIT_ASSERT_NOT_REACHED(); }
-
     // The file name that would be used for persisting a given indexed database on the file system.
     WEBKIT_API static WebString databaseFileName(const WebString& name, const WebSecurityOrigin&);
 };
diff --git a/WebKit/chromium/public/WebIDBObjectStore.h b/WebKit/chromium/public/WebIDBObjectStore.h
index 569ede1..19efd48 100755
--- a/WebKit/chromium/public/WebIDBObjectStore.h
+++ b/WebKit/chromium/public/WebIDBObjectStore.h
@@ -35,6 +35,7 @@
 namespace WebKit {
 
 class WebIDBKeyRange;
+class WebIDBTransaction;
 
 // See comment in WebIndexedDatabase for a high level overview these classes.
 class WebIDBObjectStore {
diff --git a/WebKit/chromium/public/WebIDBTransaction.h b/WebKit/chromium/public/WebIDBTransaction.h
index a79c18b..0ecf55e 100644
--- a/WebKit/chromium/public/WebIDBTransaction.h
+++ b/WebKit/chromium/public/WebIDBTransaction.h
@@ -28,6 +28,8 @@
 
 #include "WebString.h"
 
+namespace WebCore { class IDBTransactionBackendInterface; }
+
 namespace WebKit {
 
 class WebIDBObjectStore;
@@ -49,6 +51,7 @@ public:
         return 0;
     }
     virtual void abort() { WEBKIT_ASSERT_NOT_REACHED(); }
+    virtual void didCompleteTaskEvents() { WEBKIT_ASSERT_NOT_REACHED(); }
     virtual int id() const
     {
         // FIXME: Uncomment this after the next Chromium WebKit roll.
@@ -56,6 +59,15 @@ public:
         return 0;
     }
     virtual void setCallbacks(WebIDBTransactionCallbacks*) { WEBKIT_ASSERT_NOT_REACHED(); }
+
+#if WEBKIT_IMPLEMENTATION
+    virtual WebCore::IDBTransactionBackendInterface* getIDBTransactionBackendInterface() const
+    {
+        WEBKIT_ASSERT_NOT_REACHED();
+        return 0;
+    }
+#endif
+
 };
 
 } // namespace WebKit
diff --git a/WebKit/chromium/src/IDBDatabaseProxy.h b/WebKit/chromium/src/IDBDatabaseProxy.h
index 42a7d7e..fffd23e 100644
--- a/WebKit/chromium/src/IDBDatabaseProxy.h
+++ b/WebKit/chromium/src/IDBDatabaseProxy.h
@@ -47,7 +47,7 @@ public:
     virtual String version() const;
     virtual PassRefPtr<DOMStringList> objectStores() const;
 
-    // FIXME: Add transaction and setVersion.
+    // FIXME: Add setVersion.
 
     virtual void createObjectStore(const String& name, const String& keyPath, bool autoIncrement, PassRefPtr<IDBCallbacks>);
     virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name, unsigned short mode);
diff --git a/WebKit/chromium/src/IDBFactoryBackendProxy.cpp b/WebKit/chromium/src/IDBFactoryBackendProxy.cpp
index 18101e4..d43e787 100755
--- a/WebKit/chromium/src/IDBFactoryBackendProxy.cpp
+++ b/WebKit/chromium/src/IDBFactoryBackendProxy.cpp
@@ -65,14 +65,6 @@ void IDBFactoryBackendProxy::open(const String& name, const String& description,
     m_webIDBFactory->open(name, description, new WebIDBCallbacksImpl(callbacks), origin, webFrame, dataDir);
 }
 
-void IDBFactoryBackendProxy::abortPendingTransactions(const Vector<int>& pendingIDs)
-{
-    ASSERT(pendingIDs.size());
-    WebKit::WebVector<int> ids = pendingIDs;
-
-    m_webIDBFactory->abortPendingTransactions(ids);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/IDBFactoryBackendProxy.h b/WebKit/chromium/src/IDBFactoryBackendProxy.h
index ac30cf2..6371686 100755
--- a/WebKit/chromium/src/IDBFactoryBackendProxy.h
+++ b/WebKit/chromium/src/IDBFactoryBackendProxy.h
@@ -46,7 +46,6 @@ public:
 
     PassRefPtr<DOMStringList> databases(void) const;
     virtual void open(const String& name, const String& description, PassRefPtr<IDBCallbacks>, PassRefPtr<SecurityOrigin>, Frame*, const String& dataDir);
-    virtual void abortPendingTransactions(const Vector<int>& pendingIDs);
 
 private:
     IDBFactoryBackendProxy();
diff --git a/WebKit/chromium/src/IDBObjectStoreProxy.cpp b/WebKit/chromium/src/IDBObjectStoreProxy.cpp
index ad27fa3..82ca5f6 100755
--- a/WebKit/chromium/src/IDBObjectStoreProxy.cpp
+++ b/WebKit/chromium/src/IDBObjectStoreProxy.cpp
@@ -30,11 +30,13 @@
 #include "IDBCallbacks.h"
 #include "IDBIndexBackendProxy.h"
 #include "IDBKeyRange.h"
+#include "IDBTransactionBackendProxy.h"
 #include "WebIDBCallbacksImpl.h"
 #include "WebIDBKeyRange.h"
 #include "WebIDBIndex.h"
 #include "WebIDBKey.h"
 #include "WebIDBObjectStore.h"
+#include "WebIDBTransactionImpl.h"
 #include "WebSerializedScriptValue.h"
 
 #if ENABLE(INDEXED_DATABASE)
@@ -70,9 +72,12 @@ PassRefPtr<DOMStringList> IDBObjectStoreProxy::indexNames() const
     return m_webIDBObjectStore->indexNames();
 }
 
-void IDBObjectStoreProxy::get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks)
+void IDBObjectStoreProxy::get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks> callbacks, IDBTransactionBackendInterface* transaction)
 {
-    m_webIDBObjectStore->get(key, new WebIDBCallbacksImpl(callbacks));
+    // The transaction pointer is guaranteed to be a pointer to a proxy object as, in the renderer,
+    // all implementations of IDB interfaces are proxy objects.
+    IDBTransactionBackendProxy* transactionProxy = static_cast<IDBTransactionBackendProxy*>(transaction);
+    m_webIDBObjectStore->get(key, new WebIDBCallbacksImpl(callbacks), *transactionProxy->getWebIDBTransaction());
 }
 
 void IDBObjectStoreProxy::put(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key, bool addOnly, PassRefPtr<IDBCallbacks> callbacks)
diff --git a/WebKit/chromium/src/IDBObjectStoreProxy.h b/WebKit/chromium/src/IDBObjectStoreProxy.h
index a334572..13dfe23 100755
--- a/WebKit/chromium/src/IDBObjectStoreProxy.h
+++ b/WebKit/chromium/src/IDBObjectStoreProxy.h
@@ -46,7 +46,7 @@ public:
     String keyPath() const;
     PassRefPtr<DOMStringList> indexNames() const;
 
-    void get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>);
+    void get(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>, IDBTransactionBackendInterface*);
     void put(PassRefPtr<SerializedScriptValue> value, PassRefPtr<IDBKey> key, bool addOnly, PassRefPtr<IDBCallbacks>);
     void remove(PassRefPtr<IDBKey> key, PassRefPtr<IDBCallbacks>);
 
diff --git a/WebKit/chromium/src/IDBTransactionBackendProxy.cpp b/WebKit/chromium/src/IDBTransactionBackendProxy.cpp
index be6b058..59e88d8 100644
--- a/WebKit/chromium/src/IDBTransactionBackendProxy.cpp
+++ b/WebKit/chromium/src/IDBTransactionBackendProxy.cpp
@@ -69,11 +69,17 @@ void IDBTransactionBackendProxy::abort()
     m_webIDBTransaction->abort();
 }
 
-void IDBTransactionBackendProxy::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>)
+bool IDBTransactionBackendProxy::scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>)
 {
     // This should never be reached as it's the impl objects who get to
     // execute tasks in the browser process.
     ASSERT_NOT_REACHED();
+    return false;
+}
+
+void IDBTransactionBackendProxy::didCompleteTaskEvents()
+{
+    m_webIDBTransaction->didCompleteTaskEvents();
 }
 
 int IDBTransactionBackendProxy::id() const
diff --git a/WebKit/chromium/src/IDBTransactionBackendProxy.h b/WebKit/chromium/src/IDBTransactionBackendProxy.h
index d62b8ff..3daf73e 100644
--- a/WebKit/chromium/src/IDBTransactionBackendProxy.h
+++ b/WebKit/chromium/src/IDBTransactionBackendProxy.h
@@ -45,10 +45,13 @@ public:
     virtual PassRefPtr<IDBObjectStoreBackendInterface> objectStore(const String& name);
     virtual unsigned short mode() const;
     virtual void abort();
-    virtual void scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>);
+    virtual bool scheduleTask(PassOwnPtr<ScriptExecutionContext::Task>);
+    virtual void didCompleteTaskEvents();
     virtual int id() const;
     virtual void setCallbacks(IDBTransactionCallbacks*);
 
+    WebKit::WebIDBTransaction* getWebIDBTransaction() const { return m_webIDBTransaction.get(); }
+
 private:
     IDBTransactionBackendProxy(PassOwnPtr<WebKit::WebIDBTransaction>);
 
diff --git a/WebKit/chromium/src/WebIDBFactoryImpl.cpp b/WebKit/chromium/src/WebIDBFactoryImpl.cpp
index 3c8d459..7147cf0 100755
--- a/WebKit/chromium/src/WebIDBFactoryImpl.cpp
+++ b/WebKit/chromium/src/WebIDBFactoryImpl.cpp
@@ -63,15 +63,6 @@ void WebIDBFactoryImpl::open(const WebString& name, const WebString& description
     m_idbFactoryBackend->open(name, description, IDBCallbacksProxy::create(callbacks), origin, 0, dataDir);
 }
 
-void WebIDBFactoryImpl::abortPendingTransactions(const WebVector<int>& pendingIDs)
-{
-    WTF::Vector<int> ids(pendingIDs.size());
-    for (size_t i = 0; i < pendingIDs.size(); ++i)
-        ids[i] = pendingIDs[i];
-
-    m_idbFactoryBackend->abortPendingTransactions(ids);
-}
-
 } // namespace WebKit
 
 #endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBFactoryImpl.h b/WebKit/chromium/src/WebIDBFactoryImpl.h
index 4dc0a10..a0a4d7d 100755
--- a/WebKit/chromium/src/WebIDBFactoryImpl.h
+++ b/WebKit/chromium/src/WebIDBFactoryImpl.h
@@ -43,7 +43,6 @@ public:
     virtual ~WebIDBFactoryImpl();
 
     virtual void open(const WebString& name, const WebString& description, WebIDBCallbacks*, const WebSecurityOrigin&, WebFrame*, const WebString& dataDir);
-    virtual void abortPendingTransactions(const WebVector<int>& pendingIDs);
 
 private:
     WTF::RefPtr<WebCore::IDBFactoryBackendInterface> m_idbFactoryBackend;
diff --git a/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp b/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp
index 1ad1d9f..36d8ace 100755
--- a/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp
+++ b/WebKit/chromium/src/WebIDBObjectStoreImpl.cpp
@@ -33,6 +33,7 @@
 #include "WebIDBIndexImpl.h"
 #include "WebIDBKey.h"
 #include "WebIDBKeyRange.h"
+#include "WebIDBTransaction.h"
 #include "WebSerializedScriptValue.h"
 
 #if ENABLE(INDEXED_DATABASE)
@@ -65,9 +66,9 @@ WebDOMStringList WebIDBObjectStoreImpl::indexNames() const
     return m_objectStore->indexNames();
 }
 
-void WebIDBObjectStoreImpl::get(const WebIDBKey& key, WebIDBCallbacks* callbacks)
+void WebIDBObjectStoreImpl::get(const WebIDBKey& key, WebIDBCallbacks* callbacks, const WebIDBTransaction& transaction)
 {
-    m_objectStore->get(key, IDBCallbacksProxy::create(callbacks));
+    m_objectStore->get(key, IDBCallbacksProxy::create(callbacks), transaction.getIDBTransactionBackendInterface());
 }
 
 void WebIDBObjectStoreImpl::put(const WebSerializedScriptValue& value, const WebIDBKey& key, bool addOnly, WebIDBCallbacks* callbacks)
diff --git a/WebKit/chromium/src/WebIDBObjectStoreImpl.h b/WebKit/chromium/src/WebIDBObjectStoreImpl.h
index 9f31369..a9f1200 100755
--- a/WebKit/chromium/src/WebIDBObjectStoreImpl.h
+++ b/WebKit/chromium/src/WebIDBObjectStoreImpl.h
@@ -47,7 +47,7 @@ public:
     WebString keyPath() const;
     WebDOMStringList indexNames() const;
 
-    void get(const WebIDBKey& key, WebIDBCallbacks*);
+    void get(const WebIDBKey& key, WebIDBCallbacks*, const WebIDBTransaction&);
     void put(const WebSerializedScriptValue& value, const WebIDBKey& key, bool addOnly, WebIDBCallbacks*);
     void remove(const WebIDBKey& key, WebIDBCallbacks*);
 
diff --git a/WebKit/chromium/src/WebIDBTransactionImpl.cpp b/WebKit/chromium/src/WebIDBTransactionImpl.cpp
index 0dc9702..f5d8748 100644
--- a/WebKit/chromium/src/WebIDBTransactionImpl.cpp
+++ b/WebKit/chromium/src/WebIDBTransactionImpl.cpp
@@ -64,6 +64,11 @@ void WebIDBTransactionImpl::abort()
     m_backend->abort();
 }
 
+void WebIDBTransactionImpl::didCompleteTaskEvents()
+{
+    m_backend->didCompleteTaskEvents();
+}
+
 int WebIDBTransactionImpl::id() const
 {
     return m_backend->id();
@@ -75,6 +80,11 @@ void WebIDBTransactionImpl::setCallbacks(WebIDBTransactionCallbacks* callbacks)
     m_backend->setCallbacks(idbCallbacks.get());
 }
 
+IDBTransactionBackendInterface* WebIDBTransactionImpl::getIDBTransactionBackendInterface() const
+{
+    return m_backend.get();
+}
+
 } // namespace WebKit
 
 #endif // ENABLE(INDEXED_DATABASE)
diff --git a/WebKit/chromium/src/WebIDBTransactionImpl.h b/WebKit/chromium/src/WebIDBTransactionImpl.h
index a9bde68..24bab91 100644
--- a/WebKit/chromium/src/WebIDBTransactionImpl.h
+++ b/WebKit/chromium/src/WebIDBTransactionImpl.h
@@ -33,8 +33,6 @@
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefPtr.h>
 
-namespace WebCore { class IDBTransactionBackendInterface; }
-
 namespace WebKit {
 
 // See comment in WebIndexedDatabase for a high level overview these classes.
@@ -46,9 +44,12 @@ public:
     virtual int mode() const;
     virtual WebIDBObjectStore* objectStore(const WebString& name);
     virtual void abort();
+    virtual void didCompleteTaskEvents();
     virtual int id() const;
     virtual void setCallbacks(WebIDBTransactionCallbacks*);
 
+    virtual WebCore::IDBTransactionBackendInterface* getIDBTransactionBackendInterface() const;
+
 private:
     WTF::RefPtr<WebCore::IDBTransactionBackendInterface> m_backend;
 };

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list