Diff
Modified: trunk/LayoutTests/ChangeLog (194451 => 194452)
--- trunk/LayoutTests/ChangeLog 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/LayoutTests/ChangeLog 2015-12-31 05:43:33 UTC (rev 194452)
@@ -1,3 +1,15 @@
+2015-12-30 Brady Eidson <[email protected]>
+
+ Modern IDB: Only fire blocked events after all open connections have handled their versionchange events.
+ https://bugs.webkit.org/show_bug.cgi?id=152593
+
+ Reviewed by Andy Estes.
+
+ - Unskip two timeout tests that now pass.
+ - Reclassify a text-failure test to be skipped for new reasons.
+
+ * platform/mac-wk1/TestExpectations:
+
2015-12-30 Gyuyoung Kim <[email protected]>
Unreviewed, EFL gardening.
Modified: trunk/LayoutTests/platform/mac-wk1/TestExpectations (194451 => 194452)
--- trunk/LayoutTests/platform/mac-wk1/TestExpectations 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/LayoutTests/platform/mac-wk1/TestExpectations 2015-12-31 05:43:33 UTC (rev 194452)
@@ -91,13 +91,10 @@
# IDB tests that timeout
storage/indexeddb/database-quota.html [ Skip ]
storage/indexeddb/dont-wedge.html [ Skip ]
-storage/indexeddb/intversion-pending-version-changes-ascending.html [ Skip ]
storage/indexeddb/transaction-starvation.html [ Skip ]
-storage/indexeddb/unblocked-version-changes.html [ Skip ]
# IDB tests with text failures
storage/indexeddb/database-deletepending-flag.html [ Failure ]
-storage/indexeddb/delete-closed-database-object.html [ Failure ]
storage/indexeddb/intversion-gated-on-delete.html [ Failure ]
storage/indexeddb/odd-strings.html [ Failure ]
storage/indexeddb/open-db-private-browsing.html [ Failure ]
@@ -106,6 +103,7 @@
storage/indexeddb/transaction-scope-sequencing.html [ Failure ]
# Relies on internals.observeGC
+storage/indexeddb/delete-closed-database-object.html [ Skip ]
storage/indexeddb/cursor-leak.html [ Failure ]
storage/indexeddb/cursor-request-cycle.html [ Failure ]
storage/indexeddb/request-leak.html [ Failure ]
Modified: trunk/Source/WebCore/ChangeLog (194451 => 194452)
--- trunk/Source/WebCore/ChangeLog 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/ChangeLog 2015-12-31 05:43:33 UTC (rev 194452)
@@ -1,3 +1,82 @@
+2015-12-30 Brady Eidson <[email protected]>
+
+ Modern IDB: Only fire blocked events after all open connections have handled their versionchange events.
+ https://bugs.webkit.org/show_bug.cgi?id=152593
+
+ Reviewed by Andy Estes.
+
+ No new tests (At least two previously timing-out tests now pass, others are now closer to passing).
+
+ Before this patch, whenever we sent all open connections the versionchange event, we would immediately
+ fire the blocked event on the request.
+
+ That's not right, as those event handlers can close the connections, rendering the request unblocked.
+
+ So this patch implements the behavior of waiting for each open connection to either close or positively
+ message back "I finished firing my versionchange event handler"
+
+ This behavior is explicitly denoted in the spec and is covered by existing tests.
+
+ * Modules/indexeddb/client/IDBConnectionToServer.cpp:
+ (WebCore::IDBClient::IDBConnectionToServer::fireVersionChangeEvent):
+ (WebCore::IDBClient::IDBConnectionToServer::didFireVersionChangeEvent):
+ * Modules/indexeddb/client/IDBConnectionToServer.h:
+ * Modules/indexeddb/client/IDBConnectionToServerDelegate.h:
+
+ * Modules/indexeddb/client/IDBDatabaseImpl.cpp:
+ (WebCore::IDBClient::IDBDatabase::fireVersionChangeEvent):
+ (WebCore::IDBClient::IDBDatabase::dispatchEvent):
+ * Modules/indexeddb/client/IDBDatabaseImpl.h:
+
+ * Modules/indexeddb/client/IDBVersionChangeEventImpl.cpp:
+ (WebCore::IDBClient::IDBVersionChangeEvent::IDBVersionChangeEvent):
+ * Modules/indexeddb/client/IDBVersionChangeEventImpl.h:
+
+ * Modules/indexeddb/server/IDBConnectionToClient.cpp:
+ (WebCore::IDBServer::IDBConnectionToClient::fireVersionChangeEvent):
+ * Modules/indexeddb/server/IDBConnectionToClient.h:
+ * Modules/indexeddb/server/IDBConnectionToClientDelegate.h:
+
+ * Modules/indexeddb/server/IDBServer.cpp:
+ (WebCore::IDBServer::IDBServer::didFireVersionChangeEvent):
+ * Modules/indexeddb/server/IDBServer.h:
+
+ * Modules/indexeddb/server/ServerOpenDBRequest.cpp:
+ (WebCore::IDBServer::ServerOpenDBRequest::notifyRequestBlocked):
+ (WebCore::IDBServer::ServerOpenDBRequest::notifiedConnectionsOfVersionChange):
+ (WebCore::IDBServer::ServerOpenDBRequest::connectionClosedOrFiredVersionChangeEvent):
+ (WebCore::IDBServer::ServerOpenDBRequest::notifyDeleteRequestBlocked): Deleted.
+ * Modules/indexeddb/server/ServerOpenDBRequest.h:
+ (WebCore::IDBServer::ServerOpenDBRequest::hasNotifiedBlocked):
+ (WebCore::IDBServer::ServerOpenDBRequest::hasConnectionsPendingVersionChangeEvent):
+ (WebCore::IDBServer::ServerOpenDBRequest::hasNotifiedConnectionsOfVersionChange):
+ (WebCore::IDBServer::ServerOpenDBRequest::hasNotifiedDeleteRequestBlocked): Deleted.
+
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation):
+ (WebCore::IDBServer::UniqueIDBDatabase::performCurrentDeleteOperation):
+ (WebCore::IDBServer::UniqueIDBDatabase::maybeNotifyConnectionsOfVersionChange):
+ (WebCore::IDBServer::UniqueIDBDatabase::notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent):
+ (WebCore::IDBServer::UniqueIDBDatabase::didFireVersionChangeEvent):
+ (WebCore::IDBServer::UniqueIDBDatabase::connectionClosedFromClient):
+ (WebCore::IDBServer::UniqueIDBDatabase::notifyConnectionsOfVersionChangeForUpgrade): Deleted.
+ (WebCore::IDBServer::UniqueIDBDatabase::notifyConnectionsOfVersionChange): Deleted.
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
+ * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabaseConnection::connectionClosedFromClient):
+ (WebCore::IDBServer::UniqueIDBDatabaseConnection::didFireVersionChangeEvent):
+ (WebCore::IDBServer::UniqueIDBDatabaseConnection::fireVersionChangeEvent):
+ * Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:
+
+ * Modules/indexeddb/shared/InProcessIDBServer.cpp:
+ (WebCore::InProcessIDBServer::fireVersionChangeEvent):
+ (WebCore::InProcessIDBServer::didFireVersionChangeEvent):
+ * Modules/indexeddb/shared/InProcessIDBServer.h:
+
+ * dom/Event.h:
+ (WebCore::Event::isVersionChangeEvent):
+
2015-12-30 Simon Fraser <[email protected]>
Add explicit conversions between scrollOffset and scrollPostion, and use them in a few places
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp 2015-12-31 05:43:33 UTC (rev 194452)
@@ -317,7 +317,7 @@
transaction->didAbort(error);
}
-void IDBConnectionToServer::fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, uint64_t requestedVersion)
+void IDBConnectionToServer::fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion)
{
LOG(IndexedDB, "IDBConnectionToServer::fireVersionChangeEvent");
@@ -325,9 +325,16 @@
if (!connection)
return;
- connection->fireVersionChangeEvent(requestedVersion);
+ connection->fireVersionChangeEvent(requestIdentifier, requestedVersion);
}
+void IDBConnectionToServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier)
+{
+ LOG(IndexedDB, "IDBConnectionToServer::didFireVersionChangeEvent");
+
+ m_delegate->didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier);
+}
+
void IDBConnectionToServer::didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error)
{
LOG(IndexedDB, "IDBConnectionToServer::didStartTransaction");
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -103,7 +103,9 @@
void abortTransaction(IDBTransaction&);
void didAbortTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&);
- void fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, uint64_t requestedVersion);
+ void fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion);
+ void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier);
+
void didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&);
void notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion);
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -73,8 +73,8 @@
virtual void iterateCursor(const IDBRequestData&, const IDBKeyData&, unsigned long count) = 0;
virtual void establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo&) = 0;
-
virtual void databaseConnectionClosed(uint64_t databaseConnectionIdentifier) = 0;
+ virtual void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier) = 0;
virtual void ref() = 0;
virtual void deref() = 0;
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.cpp 2015-12-31 05:43:33 UTC (rev 194452)
@@ -357,19 +357,33 @@
maybeCloseInServer();
}
-void IDBDatabase::fireVersionChangeEvent(uint64_t requestedVersion)
+void IDBDatabase::fireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion)
{
uint64_t currentVersion = m_info.version();
- LOG(IndexedDB, "IDBDatabase::fireVersionChangeEvent - current version %" PRIu64 ", requested version %" PRIu64, currentVersion, requestedVersion);
+ LOG(IndexedDB, "IDBDatabase::fireVersionChangeEvent - current version %" PRIu64 ", requested version %" PRIu64 ", connection %" PRIu64, currentVersion, requestedVersion, m_databaseConnectionIdentifier);
- if (!scriptExecutionContext() || m_closePending)
+ if (!scriptExecutionContext() || m_closePending) {
+ serverConnection().didFireVersionChangeEvent(m_databaseConnectionIdentifier, requestIdentifier);
return;
+ }
- Ref<Event> event = IDBVersionChangeEvent::create(currentVersion, requestedVersion, eventNames().versionchangeEvent);
+ Ref<Event> event = IDBVersionChangeEvent::create(requestIdentifier, currentVersion, requestedVersion, eventNames().versionchangeEvent);
event->setTarget(this);
scriptExecutionContext()->eventQueue().enqueueEvent(WTF::move(event));
}
+bool IDBDatabase::dispatchEvent(Event& event)
+{
+ LOG(IndexedDB, "IDBDatabase::dispatchEvent (%" PRIu64 ")", m_databaseConnectionIdentifier);
+
+ bool result = WebCore::IDBDatabase::dispatchEvent(event);
+
+ if (event.isVersionChangeEvent() && event.type() == eventNames().versionchangeEvent)
+ serverConnection().didFireVersionChangeEvent(m_databaseConnectionIdentifier, static_cast<IDBVersionChangeEvent&>(event).requestIdentifier());
+
+ return result;
+}
+
void IDBDatabase::didCreateIndexInfo(const IDBIndexInfo& info)
{
auto* objectStore = m_info.infoForExistingObjectStore(info.objectStoreIdentifier());
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBDatabaseImpl.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -80,7 +80,7 @@
void willAbortTransaction(IDBTransaction&);
void didAbortTransaction(IDBTransaction&);
- void fireVersionChangeEvent(uint64_t requestedVersion);
+ void fireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion);
IDBConnectionToServer& serverConnection() { return m_serverConnection.get(); }
@@ -89,6 +89,8 @@
bool isClosingOrClosed() const { return m_closePending || m_closedInServer; }
+ bool dispatchEvent(Event&) override final;
+
private:
IDBDatabase(ScriptExecutionContext&, IDBConnectionToServer&, const IDBResultData&);
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBVersionChangeEventImpl.cpp (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBVersionChangeEventImpl.cpp 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBVersionChangeEventImpl.cpp 2015-12-31 05:43:33 UTC (rev 194452)
@@ -31,8 +31,9 @@
namespace WebCore {
namespace IDBClient {
-IDBVersionChangeEvent::IDBVersionChangeEvent(uint64_t oldVersion, uint64_t newVersion, const AtomicString& eventType)
+IDBVersionChangeEvent::IDBVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion, const AtomicString& eventType)
: WebCore::IDBVersionChangeEvent(eventType)
+ , m_requestIdentifier(requestIdentifier)
, m_oldVersion(oldVersion)
, m_newVersion(newVersion)
{
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBVersionChangeEventImpl.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBVersionChangeEventImpl.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBVersionChangeEventImpl.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -28,6 +28,7 @@
#if ENABLE(INDEXED_DATABASE)
+#include "IDBResourceIdentifier.h"
#include "IDBVersionChangeEvent.h"
namespace WebCore {
@@ -37,16 +38,26 @@
public:
static Ref<IDBVersionChangeEvent> create(uint64_t oldVersion, uint64_t newVersion, const AtomicString& eventType)
{
- return adoptRef(*new IDBVersionChangeEvent(oldVersion, newVersion, eventType));
+ return adoptRef(*new IDBVersionChangeEvent(IDBResourceIdentifier::emptyValue(), oldVersion, newVersion, eventType));
}
+ static Ref<IDBVersionChangeEvent> create(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion, const AtomicString& eventType)
+ {
+ return adoptRef(*new IDBVersionChangeEvent(requestIdentifier, oldVersion, newVersion, eventType));
+ }
+
+ const IDBResourceIdentifier& requestIdentifier() const { return m_requestIdentifier; }
+
+ bool isVersionChangeEvent() const override final { return true; }
+
private:
- IDBVersionChangeEvent(uint64_t oldVersion, uint64_t newVersion, const AtomicString& eventType);
+ IDBVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion, const AtomicString& eventType);
virtual uint64_t oldVersion() const override { return m_oldVersion; }
virtual Optional<uint64_t> newVersion() const override;
virtual EventInterface eventInterface() const override;
+ IDBResourceIdentifier m_requestIdentifier;
uint64_t m_oldVersion;
uint64_t m_newVersion;
};
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.cpp 2015-12-31 05:43:33 UTC (rev 194452)
@@ -123,9 +123,9 @@
m_delegate->didCommitTransaction(transactionIdentifier, error);
}
-void IDBConnectionToClient::fireVersionChangeEvent(UniqueIDBDatabaseConnection& connection, uint64_t requestedVersion)
+void IDBConnectionToClient::fireVersionChangeEvent(UniqueIDBDatabaseConnection& connection, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion)
{
- m_delegate->fireVersionChangeEvent(connection, requestedVersion);
+ m_delegate->fireVersionChangeEvent(connection, requestIdentifier, requestedVersion);
}
void IDBConnectionToClient::didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error)
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -64,7 +64,7 @@
void didOpenCursor(const IDBResultData&);
void didIterateCursor(const IDBResultData&);
- void fireVersionChangeEvent(UniqueIDBDatabaseConnection&, uint64_t requestedVersion);
+ void fireVersionChangeEvent(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion);
void didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&);
void notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClientDelegate.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -60,7 +60,7 @@
virtual void didOpenCursor(const IDBResultData&) = 0;
virtual void didIterateCursor(const IDBResultData&) = 0;
- virtual void fireVersionChangeEvent(UniqueIDBDatabaseConnection&, uint64_t requestedVersion) = 0;
+ virtual void fireVersionChangeEvent(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion) = 0;
virtual void didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&) = 0;
virtual void notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion) = 0;
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp 2015-12-31 05:43:33 UTC (rev 194452)
@@ -339,6 +339,14 @@
databaseConnection->connectionClosedFromClient();
}
+void IDBServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier)
+{
+ LOG(IndexedDB, "IDBServer::didFireVersionChangeEvent");
+
+ if (auto databaseConnection = m_databaseConnections.get(databaseConnectionIdentifier))
+ databaseConnection->didFireVersionChangeEvent(requestIdentifier);
+}
+
void IDBServer::postDatabaseTask(std::unique_ptr<CrossThreadTask>&& task)
{
ASSERT(isMainThread());
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -75,6 +75,7 @@
void establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo&);
void databaseConnectionClosed(uint64_t databaseConnectionIdentifier);
+ void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier);
void postDatabaseTask(std::unique_ptr<CrossThreadTask>&&);
void postDatabaseTaskReply(std::unique_ptr<CrossThreadTask>&&);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/ServerOpenDBRequest.cpp (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/ServerOpenDBRequest.cpp 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/ServerOpenDBRequest.cpp 2015-12-31 05:43:33 UTC (rev 194452)
@@ -55,13 +55,14 @@
return m_requestData.isDeleteRequest();
}
-void ServerOpenDBRequest::notifyDeleteRequestBlocked(uint64_t currentVersion)
+void ServerOpenDBRequest::notifyRequestBlocked(uint64_t currentVersion)
{
- ASSERT(isDeleteRequest());
- ASSERT(!m_notifiedDeleteRequestBlocked);
+ ASSERT(!m_notifiedBlocked);
- m_connection.notifyOpenDBRequestBlocked(m_requestData.requestIdentifier(), currentVersion, 0);
- m_notifiedDeleteRequestBlocked = true;
+ uint64_t requestedVersion = isOpenRequest() ? m_requestData.requestedVersion() : 0;
+ m_connection.notifyOpenDBRequestBlocked(m_requestData.requestIdentifier(), currentVersion, requestedVersion);
+
+ m_notifiedBlocked = true;
}
void ServerOpenDBRequest::notifyDidDeleteDatabase(const IDBDatabaseInfo& info)
@@ -71,6 +72,19 @@
m_connection.didDeleteDatabase(IDBResultData::deleteDatabaseSuccess(m_requestData.requestIdentifier(), info));
}
+void ServerOpenDBRequest::notifiedConnectionsOfVersionChange(HashSet<uint64_t>&& connectionIdentifiers)
+{
+ ASSERT(!m_notifiedConnectionsOfVersionChange);
+
+ m_notifiedConnectionsOfVersionChange = true;
+ m_connectionsPendingVersionChangeEvent = WTF::move(connectionIdentifiers);
+}
+
+void ServerOpenDBRequest::connectionClosedOrFiredVersionChangeEvent(uint64_t connectionIdentifier)
+{
+ m_connectionsPendingVersionChangeEvent.remove(connectionIdentifier);
+}
+
} // namespace IDBServer
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/indexeddb/server/ServerOpenDBRequest.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/ServerOpenDBRequest.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/ServerOpenDBRequest.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -30,6 +30,7 @@
#include "IDBConnectionToClient.h"
#include "IDBRequestData.h"
+#include <wtf/HashSet.h>
#include <wtf/Ref.h>
#include <wtf/RefCounted.h>
@@ -49,17 +50,28 @@
bool isOpenRequest() const;
bool isDeleteRequest() const;
- void notifyDeleteRequestBlocked(uint64_t currentVersion);
+ bool hasNotifiedBlocked() const { return m_notifiedBlocked; }
+ void notifyRequestBlocked(uint64_t currentVersion);
void notifyDidDeleteDatabase(const IDBDatabaseInfo&);
- bool hasNotifiedDeleteRequestBlocked() const { return m_notifiedDeleteRequestBlocked; }
+ uint64_t versionChangeID() const;
+
+ void notifiedConnectionsOfVersionChange(HashSet<uint64_t>&& connectionIdentifiers);
+ void connectionClosedOrFiredVersionChangeEvent(uint64_t connectionIdentifier);
+ bool hasConnectionsPendingVersionChangeEvent() const { return !m_connectionsPendingVersionChangeEvent.isEmpty(); }
+ bool hasNotifiedConnectionsOfVersionChange() const { return m_notifiedConnectionsOfVersionChange; }
+
+
private:
ServerOpenDBRequest(IDBConnectionToClient&, const IDBRequestData&);
IDBConnectionToClient& m_connection;
IDBRequestData m_requestData;
- bool m_notifiedDeleteRequestBlocked { false };
+ bool m_notifiedBlocked { false };
+
+ bool m_notifiedConnectionsOfVersionChange { false };
+ HashSet<uint64_t> m_connectionsPendingVersionChangeEvent;
};
} // namespace IDBServer
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2015-12-31 05:43:33 UTC (rev 194452)
@@ -158,10 +158,7 @@
}
// Otherwise we have to notify all those open connections and wait for them to close.
- notifyConnectionsOfVersionChangeForUpgrade();
-
- // And we notify this OpenDBRequest that it is blocked until those connections close.
- m_versionChangeDatabaseConnection->connectionToClient().notifyOpenDBRequestBlocked(m_currentOpenDBRequest->requestData().requestIdentifier(), m_databaseInfo->version(), requestedVersion);
+ maybeNotifyConnectionsOfVersionChange();
}
void UniqueIDBDatabase::performCurrentDeleteOperation()
@@ -173,15 +170,7 @@
ASSERT(m_currentOpenDBRequest->isDeleteRequest());
if (hasAnyOpenConnections()) {
- // Exactly once, notify all open connections of the pending deletion.
- if (!m_hasNotifiedConnectionsOfDelete) {
- notifyConnectionsOfVersionChange(0);
- m_hasNotifiedConnectionsOfDelete = true;
- }
-
- if (!m_currentOpenDBRequest->hasNotifiedDeleteRequestBlocked())
- m_currentOpenDBRequest->notifyDeleteRequestBlocked(m_databaseInfo->version());
-
+ maybeNotifyConnectionsOfVersionChange();
return;
}
@@ -192,7 +181,6 @@
m_currentOpenDBRequest->notifyDidDeleteDatabase(*m_databaseInfo);
m_currentOpenDBRequest = nullptr;
- m_hasNotifiedConnectionsOfDelete = false;
m_deletePending = false;
if (m_pendingOpenDBRequests.isEmpty())
@@ -329,30 +317,69 @@
m_backingStore->beginTransaction(info);
}
-void UniqueIDBDatabase::notifyConnectionsOfVersionChangeForUpgrade()
+void UniqueIDBDatabase::maybeNotifyConnectionsOfVersionChange()
{
ASSERT(m_currentOpenDBRequest);
- ASSERT(m_currentOpenDBRequest->isOpenRequest());
- ASSERT(m_versionChangeDatabaseConnection);
- notifyConnectionsOfVersionChange(m_currentOpenDBRequest->requestData().requestedVersion());
-}
+ if (m_currentOpenDBRequest->hasNotifiedConnectionsOfVersionChange())
+ return;
-void UniqueIDBDatabase::notifyConnectionsOfVersionChange(uint64_t requestedVersion)
-{
- LOG(IndexedDB, "(main) UniqueIDBDatabase::notifyConnectionsOfVersionChange - %" PRIu64, requestedVersion);
+ uint64_t newVersion = m_currentOpenDBRequest->isOpenRequest() ? m_currentOpenDBRequest->requestData().requestedVersion() : 0;
+ auto requestIdentifier = m_currentOpenDBRequest->requestData().requestIdentifier();
+ LOG(IndexedDB, "(main) UniqueIDBDatabase::notifyConnectionsOfVersionChange - %" PRIu64, newVersion);
+
// 3.3.7 "versionchange" transaction steps
// Fire a versionchange event at each connection in m_openDatabaseConnections that is open.
// The event must not be fired on connections which has the closePending flag set.
+ HashSet<uint64_t> connectionIdentifiers;
for (auto connection : m_openDatabaseConnections) {
if (connection->closePending())
continue;
- connection->fireVersionChangeEvent(requestedVersion);
+ connection->fireVersionChangeEvent(requestIdentifier, newVersion);
+ connectionIdentifiers.add(connection->identifier());
}
+
+ m_currentOpenDBRequest->notifiedConnectionsOfVersionChange(WTF::move(connectionIdentifiers));
}
+void UniqueIDBDatabase::notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(uint64_t connectionIdentifier)
+{
+ LOG(IndexedDB, "UniqueIDBDatabase::notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent - %" PRIu64, connectionIdentifier);
+
+ ASSERT(m_currentOpenDBRequest);
+
+ m_currentOpenDBRequest->connectionClosedOrFiredVersionChangeEvent(connectionIdentifier);
+
+ if (m_currentOpenDBRequest->hasConnectionsPendingVersionChangeEvent())
+ return;
+
+ if (!hasAnyOpenConnections()) {
+ invokeOperationAndTransactionTimer();
+ return;
+ }
+
+ if (m_currentOpenDBRequest->hasNotifiedBlocked())
+ return;
+
+ // Since all open connections have fired their version change events but not all of them have closed,
+ // this request is officially blocked.
+ m_currentOpenDBRequest->notifyRequestBlocked(m_databaseInfo->version());
+}
+
+void UniqueIDBDatabase::didFireVersionChangeEvent(UniqueIDBDatabaseConnection& connection, const IDBResourceIdentifier& requestIdentifier)
+{
+ LOG(IndexedDB, "UniqueIDBDatabase::didFireVersionChangeEvent");
+
+ if (!m_currentOpenDBRequest)
+ return;
+
+ ASSERT_UNUSED(requestIdentifier, m_currentOpenDBRequest->requestData().requestIdentifier() == requestIdentifier);
+
+ notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(connection.identifier());
+}
+
void UniqueIDBDatabase::addOpenDatabaseConnection(Ref<UniqueIDBDatabaseConnection>&& connection)
{
ASSERT(!m_openDatabaseConnections.contains(&connection.get()));
@@ -938,6 +965,9 @@
ASSERT(m_openDatabaseConnections.contains(&connection));
+ if (m_currentOpenDBRequest)
+ notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(connection.identifier());
+
Deque<RefPtr<UniqueIDBDatabaseTransaction>> pendingTransactions;
while (!m_pendingTransactions.isEmpty()) {
auto transaction = m_pendingTransactions.takeFirst();
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -95,6 +95,7 @@
void didFinishHandlingVersionChange(UniqueIDBDatabaseTransaction&);
void transactionDestroyed(UniqueIDBDatabaseTransaction&);
void connectionClosedFromClient(UniqueIDBDatabaseConnection&);
+ void didFireVersionChangeEvent(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& requestIdentifier);
void enqueueTransaction(Ref<UniqueIDBDatabaseTransaction>&&);
@@ -115,8 +116,8 @@
bool hasAnyOpenConnections() const;
void startVersionChangeTransaction();
- void notifyConnectionsOfVersionChangeForUpgrade();
- void notifyConnectionsOfVersionChange(uint64_t requestedVersion);
+ void maybeNotifyConnectionsOfVersionChange();
+ void notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(uint64_t connectionIdentifier);
bool isVersionChangeInProgress();
void activateTransactionInBackingStore(UniqueIDBDatabaseTransaction&);
@@ -207,7 +208,6 @@
HashCountedSet<uint64_t> m_objectStoreTransactionCounts;
bool m_deletePending { false };
- bool m_hasNotifiedConnectionsOfDelete { false };
};
} // namespace IDBServer
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp 2015-12-31 05:43:33 UTC (rev 194452)
@@ -68,16 +68,23 @@
void UniqueIDBDatabaseConnection::connectionClosedFromClient()
{
- LOG(IndexedDB, "UniqueIDBDatabaseConnection::connectionClosedFromClient");
+ LOG(IndexedDB, "UniqueIDBDatabaseConnection::connectionClosedFromClient - %" PRIu64, m_identifier);
m_closePending = true;
m_database.connectionClosedFromClient(*this);
}
-void UniqueIDBDatabaseConnection::fireVersionChangeEvent(uint64_t requestedVersion)
+void UniqueIDBDatabaseConnection::didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier)
{
+ LOG(IndexedDB, "UniqueIDBDatabaseConnection::didFireVersionChangeEvent");
+
+ m_database.didFireVersionChangeEvent(*this, requestIdentifier);
+}
+
+void UniqueIDBDatabaseConnection::fireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion)
+{
ASSERT(!m_closePending);
- m_connectionToClient.fireVersionChangeEvent(*this, requestedVersion);
+ m_connectionToClient.fireVersionChangeEvent(*this, requestIdentifier, requestedVersion);
}
UniqueIDBDatabaseTransaction& UniqueIDBDatabaseConnection::createVersionChangeTransaction(uint64_t newVersion)
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -60,7 +60,7 @@
bool hasNonFinishedTransactions() const;
- void fireVersionChangeEvent(uint64_t requestedVersion);
+ void fireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion);
UniqueIDBDatabaseTransaction& createVersionChangeTransaction(uint64_t newVersion);
void establishTransaction(const IDBTransactionInfo&);
@@ -71,6 +71,7 @@
void didClearObjectStore(const IDBResultData&);
void didCreateIndex(const IDBResultData&);
void didDeleteIndex(const IDBResultData&);
+ void didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier);
private:
UniqueIDBDatabaseConnection(UniqueIDBDatabase&, IDBConnectionToClient&);
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp 2015-12-31 05:43:33 UTC (rev 194452)
@@ -336,12 +336,12 @@
});
}
-void InProcessIDBServer::fireVersionChangeEvent(IDBServer::UniqueIDBDatabaseConnection& connection, uint64_t requestedVersion)
+void InProcessIDBServer::fireVersionChangeEvent(IDBServer::UniqueIDBDatabaseConnection& connection, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion)
{
RefPtr<InProcessIDBServer> self(this);
uint64_t databaseConnectionIdentifier = connection.identifier();
- RunLoop::current().dispatch([this, self, databaseConnectionIdentifier, requestedVersion] {
- m_connectionToServer->fireVersionChangeEvent(databaseConnectionIdentifier, requestedVersion);
+ RunLoop::current().dispatch([this, self, databaseConnectionIdentifier, requestIdentifier, requestedVersion] {
+ m_connectionToServer->fireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, requestedVersion);
});
}
@@ -369,6 +369,14 @@
});
}
+void InProcessIDBServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier)
+{
+ RefPtr<InProcessIDBServer> self(this);
+ RunLoop::current().dispatch([this, self, databaseConnectionIdentifier, requestIdentifier] {
+ m_server->didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier);
+ });
+}
+
} // namespace WebCore
#endif // ENABLE(INDEXED_DATABASE)
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h (194451 => 194452)
--- trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -72,6 +72,7 @@
virtual void iterateCursor(const IDBRequestData&, const IDBKeyData&, unsigned long count) override final;
virtual void establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo&) override final;
virtual void databaseConnectionClosed(uint64_t databaseConnectionIdentifier) override final;
+ virtual void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier) override final;
// IDBConnectionToClient
virtual uint64_t identifier() const override;
@@ -90,7 +91,7 @@
virtual void didDeleteRecord(const IDBResultData&) override final;
virtual void didOpenCursor(const IDBResultData&) override final;
virtual void didIterateCursor(const IDBResultData&) override final;
- virtual void fireVersionChangeEvent(IDBServer::UniqueIDBDatabaseConnection&, uint64_t requestedVersion) override final;
+ virtual void fireVersionChangeEvent(IDBServer::UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion) override final;
virtual void didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&) override final;
virtual void notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion) override final;
Modified: trunk/Source/WebCore/dom/Event.h (194451 => 194452)
--- trunk/Source/WebCore/dom/Event.h 2015-12-31 05:24:12 UTC (rev 194451)
+++ trunk/Source/WebCore/dom/Event.h 2015-12-31 05:43:33 UTC (rev 194452)
@@ -151,6 +151,10 @@
virtual bool isTextEvent() const;
virtual bool isWheelEvent() const;
+#if ENABLE(INDEXED_DATABASE)
+ virtual bool isVersionChangeEvent() const { return false; }
+#endif
+
bool propagationStopped() const { return m_propagationStopped || m_immediatePropagationStopped; }
bool immediatePropagationStopped() const { return m_immediatePropagationStopped; }