[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