Title: [194452] trunk
Revision
194452
Author
[email protected]
Date
2015-12-30 21:43:33 -0800 (Wed, 30 Dec 2015)

Log Message

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.

Source/WebCore:

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):

LayoutTests:

- Unskip two timeout tests that now pass.
- Reclassify a text-failure test to be skipped for new reasons.

* platform/mac-wk1/TestExpectations:

Modified Paths

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; }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to