Diff
Modified: trunk/Source/WebCore/ChangeLog (194168 => 194169)
--- trunk/Source/WebCore/ChangeLog 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/ChangeLog 2015-12-16 20:29:09 UTC (rev 194169)
@@ -1,3 +1,42 @@
+2015-12-16 Brady Eidson <[email protected]>
+
+ Modern IDB: Have IDBServerOperations know whether they represent an open or delete request.
+ https://bugs.webkit.org/show_bug.cgi?id=152351
+
+ Reviewed by Alex Christensen.
+
+ No new tests (Refactor, existing tests pass).
+
+ * Modules/indexeddb/IndexedDB.h:
+
+ * Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp:
+ (WebCore::IDBClient::IDBOpenDBRequest::createDeleteRequest):
+ (WebCore::IDBClient::IDBOpenDBRequest::createOpenRequest):
+ (WebCore::IDBClient::IDBOpenDBRequest::IDBOpenDBRequest):
+ * Modules/indexeddb/client/IDBOpenDBRequestImpl.h:
+
+ * Modules/indexeddb/client/IDBRequestImpl.h:
+ (WebCore::IDBClient::IDBRequest::requestType):
+
+ * Modules/indexeddb/server/IDBServerOperation.cpp:
+ (WebCore::IDBServer::IDBServerOperation::isOpenRequest):
+ (WebCore::IDBServer::IDBServerOperation::isDeleteRequest):
+ * Modules/indexeddb/server/IDBServerOperation.h:
+
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::maybeDeleteDatabase):
+ (WebCore::IDBServer::UniqueIDBDatabase::handleOpenDatabaseOperations):
+ (WebCore::IDBServer::UniqueIDBDatabase::startVersionChangeTransaction):
+ (WebCore::IDBServer::UniqueIDBDatabase::notifyConnectionsOfVersionChangeForUpgrade):
+ (WebCore::IDBServer::UniqueIDBDatabase::operationAndTransactionTimerFired):
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
+ * Modules/indexeddb/shared/IDBRequestData.cpp:
+ (WebCore::IDBRequestData::IDBRequestData):
+ * Modules/indexeddb/shared/IDBRequestData.h:
+ (WebCore::IDBRequestData::isOpenRequest):
+ (WebCore::IDBRequestData::isDeleteRequest):
+
2015-12-16 Alex Christensen <[email protected]>
Build fix after r194156.
Modified: trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h 2015-12-16 20:29:09 UTC (rev 194169)
@@ -99,6 +99,12 @@
Min,
};
+enum class RequestType {
+ Open,
+ Delete,
+ Other,
+};
+
} // namespace IndexedDB
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.cpp 2015-12-16 20:29:09 UTC (rev 194169)
@@ -41,20 +41,21 @@
Ref<IDBOpenDBRequest> IDBOpenDBRequest::createDeleteRequest(IDBConnectionToServer& connection, ScriptExecutionContext* context, const IDBDatabaseIdentifier& databaseIdentifier)
{
ASSERT(databaseIdentifier.isValid());
- return adoptRef(*new IDBOpenDBRequest(connection, context, databaseIdentifier, 0));
+ return adoptRef(*new IDBOpenDBRequest(connection, context, databaseIdentifier, 0, IndexedDB::RequestType::Delete));
}
Ref<IDBOpenDBRequest> IDBOpenDBRequest::createOpenRequest(IDBConnectionToServer& connection, ScriptExecutionContext* context, const IDBDatabaseIdentifier& databaseIdentifier, uint64_t version)
{
ASSERT(databaseIdentifier.isValid());
- return adoptRef(*new IDBOpenDBRequest(connection, context, databaseIdentifier, version));
+ return adoptRef(*new IDBOpenDBRequest(connection, context, databaseIdentifier, version, IndexedDB::RequestType::Open));
}
-IDBOpenDBRequest::IDBOpenDBRequest(IDBConnectionToServer& connection, ScriptExecutionContext* context, const IDBDatabaseIdentifier& databaseIdentifier, uint64_t version)
+IDBOpenDBRequest::IDBOpenDBRequest(IDBConnectionToServer& connection, ScriptExecutionContext* context, const IDBDatabaseIdentifier& databaseIdentifier, uint64_t version, IndexedDB::RequestType requestType)
: IDBRequest(connection, context)
, m_databaseIdentifier(databaseIdentifier)
, m_version(version)
{
+ m_requestType = requestType;
}
IDBOpenDBRequest::~IDBOpenDBRequest()
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.h (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.h 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBOpenDBRequestImpl.h 2015-12-16 20:29:09 UTC (rev 194169)
@@ -58,7 +58,7 @@
void fireErrorAfterVersionChangeCompletion();
private:
- IDBOpenDBRequest(IDBConnectionToServer&, ScriptExecutionContext*, const IDBDatabaseIdentifier&, uint64_t version);
+ IDBOpenDBRequest(IDBConnectionToServer&, ScriptExecutionContext*, const IDBDatabaseIdentifier&, uint64_t version, IndexedDB::RequestType);
void onError(const IDBResultData&);
void onSuccess(const IDBResultData&);
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBRequestImpl.h (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBRequestImpl.h 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBRequestImpl.h 2015-12-16 20:29:09 UTC (rev 194169)
@@ -100,6 +100,8 @@
void setSource(IDBCursor&);
void setVersionChangeTransaction(IDBTransaction&);
+ IndexedDB::RequestType requestType() const { return m_requestType; }
+
protected:
IDBRequest(IDBConnectionToServer&, ScriptExecutionContext*);
IDBRequest(ScriptExecutionContext&, IDBObjectStore&, IDBTransaction&);
@@ -126,6 +128,7 @@
bool m_shouldExposeTransactionToDOM { true };
RefPtr<DOMError> m_domError;
IDBError m_idbError;
+ IndexedDB::RequestType m_requestType = { IndexedDB::RequestType::Other };
private:
void onError();
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServerOperation.cpp (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServerOperation.cpp 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServerOperation.cpp 2015-12-16 20:29:09 UTC (rev 194169)
@@ -44,6 +44,16 @@
{
}
+bool IDBServerOperation::isOpenRequest() const
+{
+ return m_requestData.isOpenRequest();
+}
+
+bool IDBServerOperation::isDeleteRequest() const
+{
+ return m_requestData.isDeleteRequest();
+}
+
} // namespace IDBServer
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServerOperation.h (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServerOperation.h 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServerOperation.h 2015-12-16 20:29:09 UTC (rev 194169)
@@ -43,6 +43,9 @@
IDBConnectionToClient& connection() { return m_connection; }
const IDBRequestData& requestData() const { return m_requestData; }
+ bool isOpenRequest() const;
+ bool isDeleteRequest() const;
+
private:
IDBServerOperation(IDBConnectionToClient&, const IDBRequestData&);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2015-12-16 20:29:09 UTC (rev 194169)
@@ -109,6 +109,7 @@
for (auto& operation : m_pendingDeleteDatabaseOperations) {
ASSERT(m_databaseInfo);
+ ASSERT(operation->isDeleteRequest());
operation->connection().didDeleteDatabase(IDBResultData::deleteDatabaseSuccess(operation->requestData().requestIdentifier(), *m_databaseInfo));
}
@@ -158,10 +159,10 @@
return;
}
- ASSERT(!m_versionChangeOperation);
+ ASSERT(!m_currentOperation);
ASSERT(!m_versionChangeDatabaseConnection);
- m_versionChangeOperation = adoptRef(operation.leakRef());
+ m_currentOperation = WTF::move(operation);
m_versionChangeDatabaseConnection = rawConnection;
// 3.3.7 "versionchange" transaction steps
@@ -175,7 +176,7 @@
notifyConnectionsOfVersionChangeForUpgrade();
// And we notify this OpenDBRequest that it is blocked until those connections close.
- m_versionChangeDatabaseConnection->connectionToClient().notifyOpenDBRequestBlocked(m_versionChangeOperation->requestData().requestIdentifier(), m_databaseInfo->version(), requestedVersion);
+ m_versionChangeDatabaseConnection->connectionToClient().notifyOpenDBRequestBlocked(m_currentOperation->requestData().requestIdentifier(), m_databaseInfo->version(), requestedVersion);
}
bool UniqueIDBDatabase::hasAnyOpenConnections() const
@@ -245,11 +246,11 @@
LOG(IndexedDB, "(main) UniqueIDBDatabase::startVersionChangeTransaction");
ASSERT(!m_versionChangeTransaction);
- ASSERT(m_versionChangeOperation);
+ ASSERT(m_currentOperation);
+ ASSERT(m_currentOperation->isOpenRequest());
ASSERT(m_versionChangeDatabaseConnection);
- auto operation = m_versionChangeOperation;
- m_versionChangeOperation = nullptr;
+ auto operation = WTF::move(m_currentOperation);
uint64_t requestedVersion = operation->requestData().requestedVersion();
if (!requestedVersion)
@@ -275,10 +276,11 @@
void UniqueIDBDatabase::notifyConnectionsOfVersionChangeForUpgrade()
{
- ASSERT(m_versionChangeOperation);
+ ASSERT(m_currentOperation);
+ ASSERT(m_currentOperation->isOpenRequest());
ASSERT(m_versionChangeDatabaseConnection);
- notifyConnectionsOfVersionChange(m_versionChangeOperation->requestData().requestedVersion());
+ notifyConnectionsOfVersionChange(m_currentOperation->requestData().requestedVersion());
}
void UniqueIDBDatabase::notifyConnectionsOfVersionChange(uint64_t requestedVersion)
@@ -921,7 +923,7 @@
// If the database was not deleted in the previous step, try to run a transaction now.
if (m_pendingTransactions.isEmpty()) {
- if (!hasAnyOpenConnections() && m_versionChangeOperation) {
+ if (!hasAnyOpenConnections() && m_currentOperation) {
startVersionChangeTransaction();
return;
}
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2015-12-16 20:29:09 UTC (rev 194169)
@@ -173,11 +173,11 @@
Deque<Ref<IDBServerOperation>> m_pendingOpenDatabaseOperations;
Deque<Ref<IDBServerOperation>> m_pendingDeleteDatabaseOperations;
+ RefPtr<IDBServerOperation> m_currentOperation;
HashSet<RefPtr<UniqueIDBDatabaseConnection>> m_openDatabaseConnections;
HashSet<RefPtr<UniqueIDBDatabaseConnection>> m_closePendingDatabaseConnections;
- RefPtr<IDBServerOperation> m_versionChangeOperation;
RefPtr<UniqueIDBDatabaseConnection> m_versionChangeDatabaseConnection;
UniqueIDBDatabaseTransaction* m_versionChangeTransaction { nullptr };
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.cpp (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.cpp 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.cpp 2015-12-16 20:29:09 UTC (rev 194169)
@@ -38,6 +38,7 @@
, m_requestIdentifier(std::make_unique<IDBResourceIdentifier>(connection, request))
, m_databaseIdentifier(request.databaseIdentifier())
, m_requestedVersion(request.version())
+ , m_requestType(request.requestType())
{
}
@@ -62,6 +63,7 @@
, m_indexRecordType(other.m_indexRecordType)
, m_databaseIdentifier(other.m_databaseIdentifier)
, m_requestedVersion(other.m_requestedVersion)
+ , m_requestType(other.m_requestType)
{
if (other.m_requestIdentifier)
m_requestIdentifier = std::make_unique<IDBResourceIdentifier>(*other.m_requestIdentifier);
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h (194168 => 194169)
--- trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h 2015-12-16 20:06:00 UTC (rev 194168)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h 2015-12-16 20:29:09 UTC (rev 194169)
@@ -30,6 +30,7 @@
#include "IDBDatabaseIdentifier.h"
#include "IDBResourceIdentifier.h"
+#include "IndexedDB.h"
namespace WebCore {
@@ -61,6 +62,9 @@
const IDBDatabaseIdentifier& databaseIdentifier() const { return m_databaseIdentifier; }
uint64_t requestedVersion() const;
+ bool isOpenRequest() const { return m_requestType == IndexedDB::RequestType::Open; }
+ bool isDeleteRequest() const { return m_requestType == IndexedDB::RequestType::Delete; }
+
IDBRequestData isolatedCopy();
private:
@@ -74,6 +78,8 @@
IDBDatabaseIdentifier m_databaseIdentifier;
uint64_t m_requestedVersion { 0 };
+
+ IndexedDB::RequestType m_requestType { IndexedDB::RequestType::Other };
};
} // namespace WebCore