Diff
Modified: trunk/Source/WebCore/ChangeLog (140218 => 140219)
--- trunk/Source/WebCore/ChangeLog 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebCore/ChangeLog 2013-01-19 00:43:58 UTC (rev 140219)
@@ -1,3 +1,48 @@
+2013-01-18 Alec Flett <alecfl...@chromium.org>
+
+ IndexedDB: Switch to new createTransaction call
+ https://bugs.webkit.org/show_bug.cgi?id=107311
+
+ Reviewed by Tony Chang.
+
+ Convert frontend callers to use the new backend createTransaction
+ call which is the final divorce between the frontend and backend
+ transaction objects. This allows an asynchronous call in Chromium
+ and allows the front and backend to have their own lifecycle,
+ allowing the backend to be cleaned up as soon as a transaction is complete,
+ rather than waiting for the JS object to get cleaned up.
+
+ No new tests, this is a refactor covered by existing tests.
+
+ * Modules/indexeddb/IDBDatabase.cpp:
+ (WebCore::IDBDatabase::transaction):
+ * Modules/indexeddb/IDBDatabaseBackendImpl.cpp:
+ (WebCore::IDBDatabaseBackendImpl::commit):
+ (WebCore::IDBDatabaseBackendImpl::abort):
+ (WebCore::IDBDatabaseBackendImpl::createTransaction):
+ (WebCore::IDBDatabaseBackendImpl::runIntVersionChangeTransaction):
+ * Modules/indexeddb/IDBDatabaseCallbacksImpl.cpp:
+ (WebCore::IDBDatabaseCallbacksImpl::onAbort):
+ (WebCore::IDBDatabaseCallbacksImpl::onComplete):
+ * Modules/indexeddb/IDBOpenDBRequest.cpp:
+ (WebCore::IDBOpenDBRequest::onUpgradeNeeded):
+ * Modules/indexeddb/IDBTransaction.cpp:
+ (WebCore::IDBTransaction::create):
+ (WebCore::IDBTransaction::IDBTransaction):
+ (WebCore::IDBTransaction::setActive):
+ (WebCore::IDBTransaction::abort):
+ * Modules/indexeddb/IDBTransaction.h:
+ (WebCore):
+ (IDBTransaction):
+ * Modules/indexeddb/IDBTransactionBackendImpl.cpp:
+ (WebCore::IDBTransactionBackendImpl::create):
+ (WebCore::IDBTransactionBackendImpl::IDBTransactionBackendImpl):
+ (WebCore::IDBTransactionBackendImpl::abort):
+ (WebCore::IDBTransactionBackendImpl::commit):
+ * Modules/indexeddb/IDBTransactionBackendImpl.h:
+ (IDBTransactionBackendImpl):
+ (WebCore::IDBTransactionBackendImpl::setCallbacks):
+
2013-01-18 Brady Eidson <beid...@apple.com>
Rework NetworkProcess resource load identifiers.
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp (140218 => 140219)
--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.cpp 2013-01-19 00:43:58 UTC (rev 140219)
@@ -243,19 +243,10 @@
objectStoreIds.append(objectStoreId);
}
- // We need to create a new transaction synchronously. Locks are acquired asynchronously. Operations
- // can be queued against the transaction at any point. They will start executing as soon as the
- // appropriate locks have been acquired.
- // Also note that each backend object corresponds to exactly one IDBTransaction object.
int64_t transactionId = nextTransactionId();
- RefPtr<IDBTransactionBackendInterface> transactionBackend = m_backend->createTransaction(transactionId, objectStoreIds, mode);
- if (!transactionBackend) {
- ASSERT(ec);
- return 0;
- }
+ m_backend->createTransaction(transactionId, m_databaseCallbacks, objectStoreIds, mode);
- RefPtr<IDBTransaction> transaction = IDBTransaction::create(context, transactionId, transactionBackend, scope, mode, this);
- transactionBackend->setCallbacks(transaction.get());
+ RefPtr<IDBTransaction> transaction = IDBTransaction::create(context, transactionId, scope, mode, this);
return transaction.release();
}
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp (140218 => 140219)
--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp 2013-01-19 00:43:58 UTC (rev 140219)
@@ -660,14 +660,16 @@
void IDBDatabaseBackendImpl::commit(int64_t transactionId)
{
- ASSERT(m_transactions.contains(transactionId));
- m_transactions.get(transactionId)->commit();
+ // The frontend suggests that we commit, but we may have previously initiated an abort, and so have disposed of the transaction. onAbort has already been dispatched to the frontend, so it will find out about that asynchronously.
+ if (m_transactions.contains(transactionId))
+ m_transactions.get(transactionId)->commit();
}
void IDBDatabaseBackendImpl::abort(int64_t transactionId)
{
- ASSERT(m_transactions.contains(transactionId));
- m_transactions.get(transactionId)->abort();
+ // If the transaction is unknown, then it has already been aborted by the backend before this call so it is safe to ignore it.
+ if (m_transactions.contains(transactionId))
+ m_transactions.get(transactionId)->abort();
}
void IDBDatabaseBackendImpl::get(int64_t transactionId, int64_t objectStoreId, int64_t indexId, PassRefPtr<IDBKeyRange> keyRange, bool keyOnly, PassRefPtr<IDBCallbacks> callbacks)
@@ -1157,15 +1159,15 @@
// FIXME: Remove this method in https://bugs.webkit.org/show_bug.cgi?id=103923.
PassRefPtr<IDBTransactionBackendInterface> IDBDatabaseBackendImpl::createTransaction(int64_t transactionId, const Vector<int64_t>& objectStoreIds, IDBTransaction::Mode mode)
{
- RefPtr<IDBTransactionBackendImpl> transaction = IDBTransactionBackendImpl::create(transactionId, objectStoreIds, mode, this);
- ASSERT(!m_transactions.contains(transactionId));
- m_transactions.add(transactionId, transaction.get());
- return transaction.release();
+ ASSERT_NOT_REACHED();
+ return 0;
}
void IDBDatabaseBackendImpl::createTransaction(int64_t transactionId, PassRefPtr<IDBDatabaseCallbacks> callbacks, const Vector<int64_t>& objectStoreIds, unsigned short mode)
{
- ASSERT_NOT_REACHED();
+ RefPtr<IDBTransactionBackendImpl> transaction = IDBTransactionBackendImpl::create(transactionId, callbacks, objectStoreIds, static_cast<IDBTransaction::Mode>(mode), this);
+ ASSERT(!m_transactions.contains(transactionId));
+ m_transactions.add(transactionId, transaction.get());
}
void IDBDatabaseBackendImpl::openConnection(PassRefPtr<IDBCallbacks> prpCallbacks, PassRefPtr<IDBDatabaseCallbacks> prpDatabaseCallbacks, int64_t transactionId, int64_t version)
@@ -1255,8 +1257,8 @@
}
Vector<int64_t> objectStoreIds;
- RefPtr<IDBTransactionBackendInterface> transactionInterface = createTransaction(transactionId, objectStoreIds, IDBTransaction::VERSION_CHANGE);
- RefPtr<IDBTransactionBackendImpl> transaction = IDBTransactionBackendImpl::from(transactionInterface.get());
+ createTransaction(transactionId, databaseCallbacks, objectStoreIds, IDBTransaction::VERSION_CHANGE);
+ RefPtr<IDBTransactionBackendImpl> transaction = m_transactions.get(transactionId);
if (!transaction->scheduleTask(VersionChangeOperation::create(this, transactionId, requestedVersion, callbacks, databaseCallbacks), VersionChangeAbortOperation::create(this, m_metadata.version, m_metadata.intVersion))) {
ASSERT_NOT_REACHED();
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp (140218 => 140219)
--- trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp 2013-01-19 00:43:58 UTC (rev 140219)
@@ -69,13 +69,12 @@
enqueueEvent(IDBUpgradeNeededEvent::create(oldVersion, m_version, eventNames().blockedEvent));
}
-void IDBOpenDBRequest::onUpgradeNeeded(int64_t oldVersion, PassRefPtr<IDBTransactionBackendInterface> prpTransactionBackend, PassRefPtr<IDBDatabaseBackendInterface> prpDatabaseBackend)
+void IDBOpenDBRequest::onUpgradeNeeded(int64_t oldVersion, PassRefPtr<IDBTransactionBackendInterface>, PassRefPtr<IDBDatabaseBackendInterface> prpDatabaseBackend)
{
IDB_TRACE("IDBOpenDBRequest::onUpgradeNeeded()");
if (m_contextStopped || !scriptExecutionContext()) {
- RefPtr<IDBTransactionBackendInterface> transaction = prpTransactionBackend;
- transaction->abort();
RefPtr<IDBDatabaseBackendInterface> db = prpDatabaseBackend;
+ db->abort(m_transactionId);
db->close(m_databaseCallbacks);
return;
}
@@ -89,7 +88,6 @@
// were passed in during the (asynchronous) onUpgradeNeeded call from the backend. http://wkbug.com/103920
IDBDatabaseMetadata metadata = databaseBackend->metadata();
- RefPtr<IDBTransactionBackendInterface> transactionBackend = prpTransactionBackend;
RefPtr<IDBDatabase> idbDatabase = IDBDatabase::create(scriptExecutionContext(), databaseBackend, m_databaseCallbacks);
idbDatabase->setMetadata(metadata);
m_databaseCallbacks->connect(idbDatabase.get());
@@ -101,9 +99,7 @@
}
metadata.intVersion = oldVersion;
- RefPtr<IDBTransaction> frontend = IDBTransaction::create(scriptExecutionContext(), m_transactionId, transactionBackend, idbDatabase.get(), this, metadata);
- transactionBackend->setCallbacks(frontend.get());
- m_transaction = frontend;
+ m_transaction = IDBTransaction::create(scriptExecutionContext(), m_transactionId, idbDatabase.get(), this, metadata);
m_result = IDBAny::create(idbDatabase.release());
if (m_version == IDBDatabaseMetadata::NoIntVersion)
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp (140218 => 140219)
--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2013-01-19 00:43:58 UTC (rev 140219)
@@ -43,17 +43,17 @@
namespace WebCore {
-PassRefPtr<IDBTransaction> IDBTransaction::create(ScriptExecutionContext* context, int64_t id, PassRefPtr<IDBTransactionBackendInterface> backend, const Vector<String>& objectStoreNames, IDBTransaction::Mode mode, IDBDatabase* db)
+PassRefPtr<IDBTransaction> IDBTransaction::create(ScriptExecutionContext* context, int64_t id, const Vector<String>& objectStoreNames, IDBTransaction::Mode mode, IDBDatabase* db)
{
IDBOpenDBRequest* openDBRequest = 0;
- RefPtr<IDBTransaction> transaction(adoptRef(new IDBTransaction(context, id, backend, objectStoreNames, mode, db, openDBRequest, IDBDatabaseMetadata())));
+ RefPtr<IDBTransaction> transaction(adoptRef(new IDBTransaction(context, id, objectStoreNames, mode, db, openDBRequest, IDBDatabaseMetadata())));
transaction->suspendIfNeeded();
return transaction.release();
}
-PassRefPtr<IDBTransaction> IDBTransaction::create(ScriptExecutionContext* context, int64_t id, PassRefPtr<IDBTransactionBackendInterface> backend, IDBDatabase* db, IDBOpenDBRequest* openDBRequest, const IDBDatabaseMetadata& previousMetadata)
+PassRefPtr<IDBTransaction> IDBTransaction::create(ScriptExecutionContext* context, int64_t id, IDBDatabase* db, IDBOpenDBRequest* openDBRequest, const IDBDatabaseMetadata& previousMetadata)
{
- RefPtr<IDBTransaction> transaction(adoptRef(new IDBTransaction(context, id, backend, Vector<String>(), VERSION_CHANGE, db, openDBRequest, previousMetadata)));
+ RefPtr<IDBTransaction> transaction(adoptRef(new IDBTransaction(context, id, Vector<String>(), VERSION_CHANGE, db, openDBRequest, previousMetadata)));
transaction->suspendIfNeeded();
return transaction.release();
}
@@ -89,9 +89,8 @@
}
-IDBTransaction::IDBTransaction(ScriptExecutionContext* context, int64_t id, PassRefPtr<IDBTransactionBackendInterface> backend, const Vector<String>& objectStoreNames, IDBTransaction::Mode mode, IDBDatabase* db, IDBOpenDBRequest* openDBRequest, const IDBDatabaseMetadata& previousMetadata)
+IDBTransaction::IDBTransaction(ScriptExecutionContext* context, int64_t id, const Vector<String>& objectStoreNames, IDBTransaction::Mode mode, IDBDatabase* db, IDBOpenDBRequest* openDBRequest, const IDBDatabaseMetadata& previousMetadata)
: ActiveDOMObject(context, this)
- , m_backend(backend)
, m_id(id)
, m_database(db)
, m_objectStoreNames(objectStoreNames)
@@ -102,8 +101,6 @@
, m_contextStopped(false)
, m_previousMetadata(previousMetadata)
{
- ASSERT(m_backend);
-
if (mode == VERSION_CHANGE) {
// Not active until the callback.
m_state = Inactive;
@@ -210,7 +207,7 @@
m_state = active ? Active : Inactive;
if (!active && m_requestList.isEmpty())
- m_backend->commit();
+ backendDB()->commit(m_id);
}
void IDBTransaction::abort(ExceptionCode& ec)
@@ -229,8 +226,7 @@
}
RefPtr<IDBTransaction> selfRef = this;
- if (m_backend)
- m_backend->abort();
+ backendDB()->abort(m_id);
}
IDBTransaction::OpenCursorNotifier::OpenCursorNotifier(PassRefPtr<IDBTransaction> transaction, IDBCursor* cursor)
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h (140218 => 140219)
--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.h 2013-01-19 00:43:58 UTC (rev 140219)
@@ -46,7 +46,6 @@
class IDBDatabase;
class IDBObjectStore;
class IDBOpenDBRequest;
-class IDBTransactionBackendInterface;
class IDBDatabaseBackendInterface;
struct IDBObjectStoreMetadata;
@@ -58,8 +57,8 @@
VERSION_CHANGE = 2
};
- static PassRefPtr<IDBTransaction> create(ScriptExecutionContext*, int64_t, PassRefPtr<IDBTransactionBackendInterface>, const Vector<String>& objectStoreNames, Mode, IDBDatabase*);
- static PassRefPtr<IDBTransaction> create(ScriptExecutionContext*, int64_t, PassRefPtr<IDBTransactionBackendInterface>, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata& previousMetadata);
+ static PassRefPtr<IDBTransaction> create(ScriptExecutionContext*, int64_t, const Vector<String>& objectStoreNames, Mode, IDBDatabase*);
+ static PassRefPtr<IDBTransaction> create(ScriptExecutionContext*, int64_t, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata& previousMetadata);
virtual ~IDBTransaction();
static const AtomicString& modeReadOnly();
@@ -128,7 +127,7 @@
using RefCounted<IDBTransactionCallbacks>::deref;
private:
- IDBTransaction(ScriptExecutionContext*, int64_t, PassRefPtr<IDBTransactionBackendInterface>, const Vector<String>&, Mode, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata&);
+ IDBTransaction(ScriptExecutionContext*, int64_t, const Vector<String>&, Mode, IDBDatabase*, IDBOpenDBRequest*, const IDBDatabaseMetadata&);
void enqueueEvent(PassRefPtr<Event>);
void closeOpenCursors();
@@ -149,8 +148,6 @@
Finished, // No more events will fire and no new requests may be filed.
};
- // FIXME: Remove references to the backend when the backend is fully flattened: https://bugs.webkit.org/show_bug.cgi?id=99774
- RefPtr<IDBTransactionBackendInterface> m_backend;
int64_t m_id;
RefPtr<IDBDatabase> m_database;
const Vector<String> m_objectStoreNames;
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendImpl.cpp (140218 => 140219)
--- trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendImpl.cpp 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendImpl.cpp 2013-01-19 00:43:58 UTC (rev 140219)
@@ -37,21 +37,22 @@
namespace WebCore {
-PassRefPtr<IDBTransactionBackendImpl> IDBTransactionBackendImpl::create(int64_t id, const Vector<int64_t>& objectStoreIds, IDBTransaction::Mode mode, IDBDatabaseBackendImpl* database)
+PassRefPtr<IDBTransactionBackendImpl> IDBTransactionBackendImpl::create(int64_t id, PassRefPtr<IDBDatabaseCallbacks> callbacks, const Vector<int64_t>& objectStoreIds, IDBTransaction::Mode mode, IDBDatabaseBackendImpl* database)
{
HashSet<int64_t> objectStoreHashSet;
for (size_t i = 0; i < objectStoreIds.size(); ++i)
objectStoreHashSet.add(objectStoreIds[i]);
- return adoptRef(new IDBTransactionBackendImpl(id, objectStoreHashSet, mode, database));
+ return adoptRef(new IDBTransactionBackendImpl(id, callbacks, objectStoreHashSet, mode, database));
}
-IDBTransactionBackendImpl::IDBTransactionBackendImpl(int64_t id, const HashSet<int64_t>& objectStoreIds, IDBTransaction::Mode mode, IDBDatabaseBackendImpl* database)
+IDBTransactionBackendImpl::IDBTransactionBackendImpl(int64_t id, PassRefPtr<IDBDatabaseCallbacks> callbacks, const HashSet<int64_t>& objectStoreIds, IDBTransaction::Mode mode, IDBDatabaseBackendImpl* database)
: m_id(id)
, m_objectStoreIds(objectStoreIds)
, m_mode(mode)
, m_state(Unused)
, m_commitPending(false)
+ , m_callbacks(callbacks)
, m_database(database)
, m_transaction(database->backingStore().get())
, m_taskTimer(this, &IDBTransactionBackendImpl::taskTimerFired)
@@ -133,7 +134,7 @@
m_database->transactionFinished(this);
if (m_callbacks)
- m_callbacks->onAbort(error);
+ m_callbacks->onAbort(m_id, error);
m_database->transactionFinishedAndAbortFired(this);
@@ -219,10 +220,10 @@
m_database->transactionFinished(this);
if (committed) {
- m_callbacks->onComplete();
+ m_callbacks->onComplete(m_id);
m_database->transactionFinishedAndCompleteFired(this);
} else {
- m_callbacks->onAbort(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error committing transaction."));
+ m_callbacks->onAbort(m_id, IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Internal error committing transaction."));
m_database->transactionFinishedAndAbortFired(this);
}
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendImpl.h (140218 => 140219)
--- trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendImpl.h 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransactionBackendImpl.h 2013-01-19 00:43:58 UTC (rev 140219)
@@ -44,7 +44,7 @@
class IDBTransactionBackendImpl : public IDBTransactionBackendInterface {
public:
- static PassRefPtr<IDBTransactionBackendImpl> create(int64_t transactionId, const Vector<int64_t>&, IDBTransaction::Mode, IDBDatabaseBackendImpl*);
+ static PassRefPtr<IDBTransactionBackendImpl> create(int64_t transactionId, PassRefPtr<IDBDatabaseCallbacks>, const Vector<int64_t>&, IDBTransaction::Mode, IDBDatabaseBackendImpl*);
static IDBTransactionBackendImpl* from(IDBTransactionBackendInterface* interface)
{
return static_cast<IDBTransactionBackendImpl*>(interface);
@@ -54,7 +54,7 @@
// IDBTransactionBackendInterface
virtual void abort();
void commit();
- virtual void setCallbacks(IDBTransactionCallbacks* callbacks) { m_callbacks = callbacks; }
+ virtual void setCallbacks(IDBTransactionCallbacks* callbacks) { ASSERT_NOT_REACHED(); }
class Operation {
public:
@@ -79,7 +79,7 @@
IDBDatabaseBackendImpl* database() const { return m_database.get(); }
private:
- IDBTransactionBackendImpl(int64_t id, const HashSet<int64_t>& objectStoreIds, IDBTransaction::Mode, IDBDatabaseBackendImpl*);
+ IDBTransactionBackendImpl(int64_t id, PassRefPtr<IDBDatabaseCallbacks>, const HashSet<int64_t>& objectStoreIds, IDBTransaction::Mode, IDBDatabaseBackendImpl*);
enum State {
Unused, // Created, but no tasks yet.
@@ -102,7 +102,7 @@
State m_state;
bool m_commitPending;
- RefPtr<IDBTransactionCallbacks> m_callbacks;
+ RefPtr<IDBDatabaseCallbacks> m_callbacks;
RefPtr<IDBDatabaseBackendImpl> m_database;
typedef Deque<OwnPtr<Operation> > TaskQueue;
Modified: trunk/Source/WebKit/chromium/ChangeLog (140218 => 140219)
--- trunk/Source/WebKit/chromium/ChangeLog 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebKit/chromium/ChangeLog 2013-01-19 00:43:58 UTC (rev 140219)
@@ -1,3 +1,14 @@
+2013-01-18 Alec Flett <alecfl...@chromium.org>
+
+ IndexedDB: Switch to new createTransaction call
+ https://bugs.webkit.org/show_bug.cgi?id=107311
+
+ Reviewed by Tony Chang.
+
+ * public/WebIDBTransaction.h:
+
+ Remove an old method that nobody calls.
+
2013-01-18 Alpha Lam <hc...@chromium.org>
[chromium] Roll Chromium DEPS to 177676
Modified: trunk/Source/WebKit/chromium/public/WebIDBTransaction.h (140218 => 140219)
--- trunk/Source/WebKit/chromium/public/WebIDBTransaction.h 2013-01-19 00:41:44 UTC (rev 140218)
+++ trunk/Source/WebKit/chromium/public/WebIDBTransaction.h 2013-01-19 00:43:58 UTC (rev 140219)
@@ -47,7 +47,6 @@
virtual void commit() { WEBKIT_ASSERT_NOT_REACHED(); }
virtual void abort() { WEBKIT_ASSERT_NOT_REACHED(); }
- virtual void didCompleteTaskEvents() { WEBKIT_ASSERT_NOT_REACHED(); }
virtual void setCallbacks(WebIDBTransactionCallbacks*) { WEBKIT_ASSERT_NOT_REACHED(); }
// FIXME: this is never called from WebCore. Find a cleaner solution.