Modified: branches/chromium/1180/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp (120957 => 120958)
--- branches/chromium/1180/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp 2012-06-21 19:26:37 UTC (rev 120957)
+++ branches/chromium/1180/Source/WebCore/Modules/indexeddb/IDBDatabaseBackendImpl.cpp 2012-06-21 19:29:24 UTC (rev 120958)
@@ -109,6 +109,7 @@
, m_identifier(uniqueIdentifier)
, m_factory(factory)
, m_transactionCoordinator(coordinator)
+ , m_pendingConnectionCount(0)
{
ASSERT(!m_name.isNull());
}
@@ -222,7 +223,7 @@
// FIXME: Only fire onBlocked if there are open connections after the
// VersionChangeEvents are received, not just set up to fire.
// https://bugs.webkit.org/show_bug.cgi?id=71130
- if (m_databaseCallbacksSet.size() > 1) {
+ if (connectionCount() > 1) {
callbacks->onBlocked();
RefPtr<PendingSetVersionCall> pendingSetVersionCall = PendingSetVersionCall::create(version, callbacks, databaseCallbacks);
m_pendingSetVersionCalls.append(pendingSetVersionCall);
@@ -278,9 +279,14 @@
}
}
+int32_t IDBDatabaseBackendImpl::connectionCount()
+{
+ return m_databaseCallbacksSet.size() + m_pendingConnectionCount;
+}
+
void IDBDatabaseBackendImpl::processPendingCalls()
{
- ASSERT(m_databaseCallbacksSet.size() <= 1);
+ ASSERT(connectionCount() <= 1);
// Pending calls may be requeued or aborted
Deque<RefPtr<PendingSetVersionCall> > pendingSetVersionCalls;
@@ -345,18 +351,24 @@
void IDBDatabaseBackendImpl::registerFrontendCallbacks(PassRefPtr<IDBDatabaseCallbacks> callbacks)
{
+ ASSERT(m_backingStore.get());
+ ASSERT(m_pendingConnectionCount);
+ --m_pendingConnectionCount;
m_databaseCallbacksSet.add(RefPtr<IDBDatabaseCallbacks>(callbacks));
}
void IDBDatabaseBackendImpl::openConnection(PassRefPtr<IDBCallbacks> callbacks)
{
+ ASSERT(m_backingStore.get());
if (!m_pendingDeleteCalls.isEmpty() || m_runningVersionChangeTransaction || !m_pendingSetVersionCalls.isEmpty())
m_pendingOpenCalls.append(PendingOpenCall::create(callbacks));
else {
if (m_id == InvalidId && !openInternal())
callbacks->onError(IDBDatabaseError::create(IDBDatabaseException::UNKNOWN_ERR, "Internal error."));
- else
+ else {
+ ++m_pendingConnectionCount;
callbacks->onSuccess(this);
+ }
}
}
@@ -395,12 +407,12 @@
RefPtr<IDBDatabaseCallbacks> callbacks = prpCallbacks;
ASSERT(m_databaseCallbacksSet.contains(callbacks));
m_databaseCallbacksSet.remove(callbacks);
- if (m_databaseCallbacksSet.size() > 1)
+ if (connectionCount() > 1)
return;
processPendingCalls();
- if (!m_databaseCallbacksSet.size()) {
+ if (!connectionCount()) {
TransactionSet transactions(m_transactions);
for (TransactionSet::const_iterator it = transactions.begin(); it != transactions.end(); ++it)
(*it)->abort();
Modified: branches/chromium/1180/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp (120957 => 120958)
--- branches/chromium/1180/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp 2012-06-21 19:26:37 UTC (rev 120957)
+++ branches/chromium/1180/Source/WebCore/inspector/InspectorIndexedDBAgent.cpp 2012-06-21 19:29:24 UTC (rev 120958)
@@ -43,6 +43,7 @@
#include "IDBCallbacks.h"
#include "IDBCursor.h"
#include "IDBDatabaseBackendInterface.h"
+#include "IDBDatabaseCallbacks.h"
#include "IDBFactoryBackendInterface.h"
#include "IDBIndexBackendInterface.h"
#include "IDBKey.h"
@@ -115,6 +116,21 @@
virtual void onBlocked() { }
};
+class InspectorIDBDatabaseCallbacks : public IDBDatabaseCallbacks {
+public:
+ static PassRefPtr<InspectorIDBDatabaseCallbacks> create()
+ {
+ return adoptRef(new InspectorIDBDatabaseCallbacks());
+ }
+
+ virtual ~InspectorIDBDatabaseCallbacks() { }
+
+ virtual void onVersionChange(const String& version) { }
+private:
+ InspectorIDBDatabaseCallbacks() { }
+};
+
+
class InspectorIDBTransactionCallback : public IDBTransactionCallbacks {
public:
static PassRefPtr<InspectorIDBTransactionCallback> create()
@@ -172,6 +188,28 @@
virtual void execute(PassRefPtr<IDBDatabaseBackendInterface>) = 0;
};
+class DatabaseConnection {
+public:
+ DatabaseConnection()
+ : m_idbDatabaseCallbacks(InspectorIDBDatabaseCallbacks::create()) { }
+
+ void connect(PassRefPtr<IDBDatabaseBackendInterface> idbDatabase)
+ {
+ m_idbDatabase = idbDatabase;
+ m_idbDatabase->registerFrontendCallbacks(m_idbDatabaseCallbacks);
+ }
+
+ ~DatabaseConnection()
+ {
+ if (m_idbDatabase)
+ m_idbDatabase->close(m_idbDatabaseCallbacks);
+ }
+
+private:
+ RefPtr<IDBDatabaseBackendInterface> m_idbDatabase;
+ RefPtr<IDBDatabaseCallbacks> m_idbDatabaseCallbacks;
+};
+
class OpenDatabaseCallback : public InspectorIDBCallback {
public:
static PassRefPtr<OpenDatabaseCallback> create(ExecutableWithDatabase* executableWithDatabase)
@@ -181,8 +219,9 @@
virtual ~OpenDatabaseCallback() { }
- virtual void onSuccess(PassRefPtr<IDBDatabaseBackendInterface> idbDatabase)
+ virtual void onSuccess(PassRefPtr<IDBDatabaseBackendInterface> prpDatabase)
{
+ RefPtr<IDBDatabaseBackendInterface> idbDatabase = prpDatabase;
m_executableWithDatabase->execute(idbDatabase);
}
@@ -263,8 +302,10 @@
virtual ~DatabaseLoaderCallback() { }
- virtual void execute(PassRefPtr<IDBDatabaseBackendInterface> idbDatabase)
+ virtual void execute(PassRefPtr<IDBDatabaseBackendInterface> prpDatabase)
{
+ RefPtr<IDBDatabaseBackendInterface> idbDatabase = prpDatabase;
+ m_connection.connect(idbDatabase);
if (!m_frontendProvider->frontend())
return;
@@ -315,6 +356,7 @@
, m_requestId(requestId) { }
RefPtr<InspectorIndexedDBAgent::FrontendProvider> m_frontendProvider;
int m_requestId;
+ DatabaseConnection m_connection;
};
static PassRefPtr<IDBKey> idbKeyFromInspectorObject(InspectorObject* key)
@@ -430,6 +472,8 @@
return key.release();
}
+class DataLoaderCallback;
+
class OpenCursorCallback : public InspectorIDBCallback {
public:
enum CursorType {
@@ -437,9 +481,9 @@
IndexDataCursor
};
- static PassRefPtr<OpenCursorCallback> create(PassRefPtr<InspectorIndexedDBAgent::FrontendProvider> frontendProvider, InjectedScript injectedScript, PassRefPtr<IDBTransactionBackendInterface> idbTransaction, CursorType cursorType, int requestId, int skipCount, unsigned pageSize)
+ static PassRefPtr<OpenCursorCallback> create(PassRefPtr<InspectorIndexedDBAgent::FrontendProvider> frontendProvider, InjectedScript injectedScript, PassRefPtr<DataLoaderCallback> dataLoaderCallback, PassRefPtr<IDBTransactionBackendInterface> idbTransaction, CursorType cursorType, int requestId, int skipCount, unsigned pageSize)
{
- return adoptRef(new OpenCursorCallback(frontendProvider, injectedScript, idbTransaction, cursorType, requestId, skipCount, pageSize));
+ return adoptRef(new OpenCursorCallback(frontendProvider, injectedScript, dataLoaderCallback, idbTransaction, cursorType, requestId, skipCount, pageSize));
}
virtual ~OpenCursorCallback() { }
@@ -491,6 +535,7 @@
void end(bool hasMore)
{
+ m_dataLoaderCallback.clear();
if (!m_frontendProvider->frontend())
return;
@@ -509,9 +554,10 @@
}
private:
- OpenCursorCallback(PassRefPtr<InspectorIndexedDBAgent::FrontendProvider> frontendProvider, InjectedScript injectedScript, PassRefPtr<IDBTransactionBackendInterface> idbTransaction, CursorType cursorType, int requestId, int skipCount, unsigned pageSize)
+ OpenCursorCallback(PassRefPtr<InspectorIndexedDBAgent::FrontendProvider> frontendProvider, InjectedScript injectedScript, PassRefPtr<DataLoaderCallback> dataLoaderCallback, PassRefPtr<IDBTransactionBackendInterface> idbTransaction, CursorType cursorType, int requestId, int skipCount, unsigned pageSize)
: m_frontendProvider(frontendProvider)
, m_injectedScript(injectedScript)
+ , m_dataLoaderCallback(dataLoaderCallback)
, m_idbTransaction(idbTransaction)
, m_cursorType(cursorType)
, m_requestId(requestId)
@@ -523,6 +569,7 @@
}
RefPtr<InspectorIndexedDBAgent::FrontendProvider> m_frontendProvider;
InjectedScript m_injectedScript;
+ RefPtr<DataLoaderCallback> m_dataLoaderCallback;
RefPtr<IDBTransactionBackendInterface> m_idbTransaction;
CursorType m_cursorType;
int m_requestId;
@@ -541,8 +588,10 @@
virtual ~DataLoaderCallback() { }
- virtual void execute(PassRefPtr<IDBDatabaseBackendInterface> idbDatabase)
+ virtual void execute(PassRefPtr<IDBDatabaseBackendInterface> prpDatabase)
{
+ RefPtr<IDBDatabaseBackendInterface> idbDatabase = prpDatabase;
+ m_connection.connect(idbDatabase);
if (!m_frontendProvider->frontend())
return;
@@ -558,12 +607,12 @@
if (!idbIndex)
return;
- RefPtr<OpenCursorCallback> openCursorCallback = OpenCursorCallback::create(m_frontendProvider, m_injectedScript, idbTransaction.get(), OpenCursorCallback::IndexDataCursor, m_requestId, m_skipCount, m_pageSize);
+ RefPtr<OpenCursorCallback> openCursorCallback = OpenCursorCallback::create(m_frontendProvider, m_injectedScript, this, idbTransaction.get(), OpenCursorCallback::IndexDataCursor, m_requestId, m_skipCount, m_pageSize);
ExceptionCode ec = 0;
idbIndex->openCursor(m_idbKeyRange, IDBCursor::NEXT, openCursorCallback, idbTransaction.get(), ec);
} else {
- RefPtr<OpenCursorCallback> openCursorCallback = OpenCursorCallback::create(m_frontendProvider, m_injectedScript, idbTransaction.get(), OpenCursorCallback::ObjectStoreDataCursor, m_requestId, m_skipCount, m_pageSize);
+ RefPtr<OpenCursorCallback> openCursorCallback = OpenCursorCallback::create(m_frontendProvider, m_injectedScript, this, idbTransaction.get(), OpenCursorCallback::ObjectStoreDataCursor, m_requestId, m_skipCount, m_pageSize);
ExceptionCode ec = 0;
idbObjectStore->openCursor(m_idbKeyRange, IDBCursor::NEXT, openCursorCallback, idbTransaction.get(), ec);
@@ -588,6 +637,7 @@
RefPtr<IDBKeyRange> m_idbKeyRange;
int m_skipCount;
unsigned m_pageSize;
+ DatabaseConnection m_connection;
};
} // namespace