Title: [252060] trunk
Revision
252060
Author
[email protected]
Date
2019-11-05 10:25:38 -0800 (Tue, 05 Nov 2019)

Log Message

REGRESSION (r250754): web page using IDBIndex doesn't load occasionally
https://bugs.webkit.org/show_bug.cgi?id=203431

Reviewed by Brady Eidson.

Source/WebCore:

We now allow page to enter cache even when there are active IDB objects. The open database connection or blocked
database request on suspended pages may stop other active pages from deleting or opening the same database.

To fix this issue, we close those open connections on suspended page when we know from the versionchange event,
that there is open/delete request blocked. For blocked requests on suspended page, we abort them and return
error. This way, when the suspended page resumes, it will get close event fired on previously opened database
connections, and error event fired on previously blocked requests.

API test: IndexedDB.IndexedDBInPageCache

* Modules/indexeddb/IDBDatabase.h:
* Modules/indexeddb/IDBOpenDBRequest.cpp:
(WebCore::IDBOpenDBRequest::requestCompleted):
(WebCore::IDBOpenDBRequest::requestBlocked):
(WebCore::IDBOpenDBRequest::setIsContextSuspended):
* Modules/indexeddb/IDBOpenDBRequest.h:
* Modules/indexeddb/IndexedDB.h:
* Modules/indexeddb/client/IDBConnectionProxy.cpp:
(WebCore::IDBClient::IDBConnectionProxy::completeOpenDBRequest):
(WebCore::IDBClient::IDBConnectionProxy::fireVersionChangeEvent):
(WebCore::IDBClient::IDBConnectionProxy::didFireVersionChangeEvent):
(WebCore::IDBClient::setMatchingItemsContextSuspended):
(WebCore::IDBClient::IDBConnectionProxy::setContextSuspended):
* Modules/indexeddb/client/IDBConnectionProxy.h:
* Modules/indexeddb/client/IDBConnectionToServer.cpp:
(WebCore::IDBClient::IDBConnectionToServer::didFireVersionChangeEvent):
* Modules/indexeddb/client/IDBConnectionToServer.h:
* Modules/indexeddb/client/IDBConnectionToServerDelegate.h:
* Modules/indexeddb/server/IDBServer.cpp:
(WebCore::IDBServer::IDBServer::didFireVersionChangeEvent):
* Modules/indexeddb/server/IDBServer.h:
* Modules/indexeddb/server/UniqueIDBDatabase.cpp:
(WebCore::IDBServer::UniqueIDBDatabase::clearTransactionsOnConnection):
(WebCore::IDBServer::UniqueIDBDatabase::didFireVersionChangeEvent):
(WebCore::IDBServer::UniqueIDBDatabase::connectionClosedFromClient):
* Modules/indexeddb/server/UniqueIDBDatabase.h:
* Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:
(WebCore::IDBServer::UniqueIDBDatabaseConnection::didFireVersionChangeEvent):
* Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:
* Modules/indexeddb/shared/InProcessIDBServer.cpp:
(WebCore::InProcessIDBServer::didFireVersionChangeEvent):
* Modules/indexeddb/shared/InProcessIDBServer.h:
* dom/Document.cpp:
(WebCore::Document::setBackForwardCacheState):
* workers/WorkerGlobalScope.cpp:
(WebCore::WorkerGlobalScope::suspend):
(WebCore::WorkerGlobalScope::resume):
* workers/WorkerGlobalScope.h:
* workers/WorkerThread.cpp:
(WebCore::WorkerThread::suspend):

Source/WebKit:

* NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp:
(WebKit::WebIDBConnectionToClient::didFireVersionChangeEvent):
* NetworkProcess/IndexedDB/WebIDBConnectionToClient.h:
* NetworkProcess/IndexedDB/WebIDBConnectionToClient.messages.in:
* WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
(WebKit::WebIDBConnectionToServer::didFireVersionChangeEvent):
* WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h:

Tools:

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.html: Added.
* TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.mm: Added.
(-[IndexedDBInPageCacheMessageHandler userContentController:didReceiveScriptMessage:]):
(TEST):
* TestWebKitAPI/Tests/WebKitCocoa/IndexedDBNotInPageCache.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (252059 => 252060)


--- trunk/Source/WebCore/ChangeLog	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/ChangeLog	2019-11-05 18:25:38 UTC (rev 252060)
@@ -1,3 +1,61 @@
+2019-11-05  Sihui Liu  <[email protected]>
+
+        REGRESSION (r250754): web page using IDBIndex doesn't load occasionally
+        https://bugs.webkit.org/show_bug.cgi?id=203431
+
+        Reviewed by Brady Eidson.
+
+        We now allow page to enter cache even when there are active IDB objects. The open database connection or blocked
+        database request on suspended pages may stop other active pages from deleting or opening the same database.
+
+        To fix this issue, we close those open connections on suspended page when we know from the versionchange event, 
+        that there is open/delete request blocked. For blocked requests on suspended page, we abort them and return 
+        error. This way, when the suspended page resumes, it will get close event fired on previously opened database 
+        connections, and error event fired on previously blocked requests.
+
+        API test: IndexedDB.IndexedDBInPageCache
+
+        * Modules/indexeddb/IDBDatabase.h:
+        * Modules/indexeddb/IDBOpenDBRequest.cpp:
+        (WebCore::IDBOpenDBRequest::requestCompleted):
+        (WebCore::IDBOpenDBRequest::requestBlocked):
+        (WebCore::IDBOpenDBRequest::setIsContextSuspended):
+        * Modules/indexeddb/IDBOpenDBRequest.h:
+        * Modules/indexeddb/IndexedDB.h:
+        * Modules/indexeddb/client/IDBConnectionProxy.cpp:
+        (WebCore::IDBClient::IDBConnectionProxy::completeOpenDBRequest):
+        (WebCore::IDBClient::IDBConnectionProxy::fireVersionChangeEvent):
+        (WebCore::IDBClient::IDBConnectionProxy::didFireVersionChangeEvent):
+        (WebCore::IDBClient::setMatchingItemsContextSuspended):
+        (WebCore::IDBClient::IDBConnectionProxy::setContextSuspended):
+        * Modules/indexeddb/client/IDBConnectionProxy.h:
+        * Modules/indexeddb/client/IDBConnectionToServer.cpp:
+        (WebCore::IDBClient::IDBConnectionToServer::didFireVersionChangeEvent):
+        * Modules/indexeddb/client/IDBConnectionToServer.h:
+        * Modules/indexeddb/client/IDBConnectionToServerDelegate.h:
+        * Modules/indexeddb/server/IDBServer.cpp:
+        (WebCore::IDBServer::IDBServer::didFireVersionChangeEvent):
+        * Modules/indexeddb/server/IDBServer.h:
+        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+        (WebCore::IDBServer::UniqueIDBDatabase::clearTransactionsOnConnection):
+        (WebCore::IDBServer::UniqueIDBDatabase::didFireVersionChangeEvent):
+        (WebCore::IDBServer::UniqueIDBDatabase::connectionClosedFromClient):
+        * Modules/indexeddb/server/UniqueIDBDatabase.h:
+        * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp:
+        (WebCore::IDBServer::UniqueIDBDatabaseConnection::didFireVersionChangeEvent):
+        * Modules/indexeddb/server/UniqueIDBDatabaseConnection.h:
+        * Modules/indexeddb/shared/InProcessIDBServer.cpp:
+        (WebCore::InProcessIDBServer::didFireVersionChangeEvent):
+        * Modules/indexeddb/shared/InProcessIDBServer.h:
+        * dom/Document.cpp:
+        (WebCore::Document::setBackForwardCacheState):
+        * workers/WorkerGlobalScope.cpp:
+        (WebCore::WorkerGlobalScope::suspend):
+        (WebCore::WorkerGlobalScope::resume):
+        * workers/WorkerGlobalScope.h:
+        * workers/WorkerThread.cpp:
+        (WebCore::WorkerThread::suspend):
+
 2019-11-05  Eric Carlson  <[email protected]>
 
         http/tests/media/track-in-band-hls-metadata.html sometimes crashes after r251626

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabase.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -110,6 +110,9 @@
 
     bool hasPendingActivity() const final;
 
+    void setIsContextSuspended(bool isContextSuspended) { m_isContextSuspended = isContextSuspended; }
+    bool isContextSuspended() const { return m_isContextSuspended; }
+
 private:
     IDBDatabase(ScriptExecutionContext&, IDBClient::IDBConnectionProxy&, const IDBResultData&);
 
@@ -130,6 +133,8 @@
     HashMap<IDBResourceIdentifier, RefPtr<IDBTransaction>> m_abortingTransactions;
     
     const EventNames& m_eventNames; // Need to cache this so we can use it from GC threads.
+
+    bool m_isContextSuspended { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -190,6 +190,8 @@
 
     ASSERT(&originThread() == &Thread::current());
 
+    m_isBlocked = false;
+
     // If an Open request was completed after the page has navigated, leaving this request
     // with a stopped script execution context, we need to message back to the server so it
     // doesn't hang waiting on a database connection or transaction that will never exist.
@@ -229,11 +231,28 @@
 void IDBOpenDBRequest::requestBlocked(uint64_t oldVersion, uint64_t newVersion)
 {
     ASSERT(&originThread() == &Thread::current());
+    ASSERT(!m_isBlocked);
 
+    m_isBlocked = true;
+
     LOG(IndexedDB, "IDBOpenDBRequest::requestBlocked");
     enqueueEvent(IDBVersionChangeEvent::create(oldVersion, newVersion, eventNames().blockedEvent));
 }
 
+void IDBOpenDBRequest::setIsContextSuspended(bool isContextSuspended)
+{
+    m_isContextSuspended = isContextSuspended;
+
+    // If this request is blocked, it means this request is being processed on the server.
+    // The client needs to actively stop the request so it doesn't blocks the processing of subsequent requests.
+    if (m_isBlocked) {
+        IDBRequestData requestData(connectionProxy(), *this);
+        connectionProxy().openDBRequestCancelled(requestData);
+        auto result = IDBResultData::error(requestData.requestIdentifier(), IDBError { UnknownError, "Blocked open request on cached page is aborted to unblock other requests"_s });
+        requestCompleted(result);
+    }
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(INDEXED_DATABASE)

Modified: trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBOpenDBRequest.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -52,6 +52,9 @@
     void fireSuccessAfterVersionChangeCommit();
     void fireErrorAfterVersionChangeCompletion();
 
+    void setIsContextSuspended(bool);
+    bool isContextSuspended() const { return m_isContextSuspended; }
+
 private:
     IDBOpenDBRequest(ScriptExecutionContext&, IDBClient::IDBConnectionProxy&, const IDBDatabaseIdentifier&, uint64_t version, IndexedDB::RequestType);
 
@@ -68,6 +71,9 @@
 
     IDBDatabaseIdentifier m_databaseIdentifier;
     uint64_t m_version { 0 };
+
+    bool m_isContextSuspended { false };
+    bool m_isBlocked { false };
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/IndexedDB.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -104,6 +104,8 @@
     Values,
 };
 
+enum class ConnectionClosedOnBehalfOfServer : bool { No, Yes };
+
 } // namespace IndexedDB
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -115,6 +115,19 @@
     if (!request)
         return;
 
+    if (request->isContextSuspended()) {
+        switch (resultData.type()) {
+        case IDBResultType::OpenDatabaseUpgradeNeeded: {
+            abortOpenAndUpgradeNeeded(resultData.databaseConnectionIdentifier(), resultData.transactionInfo().identifier());
+            auto result = IDBResultData::error(resultData.requestIdentifier(), IDBError { UnknownError, "Version change transaction on cached page is aborted to unblock other connections"_s });
+            request->performCallbackOnOriginThread(*request, &IDBOpenDBRequest::requestCompleted, result);
+            return;
+        }
+        default:
+            break;
+        }
+    }
+
     request->performCallbackOnOriginThread(*request, &IDBOpenDBRequest::requestCompleted, resultData);
 }
 
@@ -268,12 +281,18 @@
     if (!database)
         return;
 
+    if (database->isContextSuspended()) {
+        didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer::Yes);
+        database->performCallbackOnOriginThread(*database, &IDBDatabase::connectionToServerLost, IDBError { UnknownError, "Connection on cached page closed to unblock other connections"_s});
+        return;
+    }
+
     database->performCallbackOnOriginThread(*database, &IDBDatabase::fireVersionChangeEvent, requestIdentifier, requestedVersion);
 }
 
-void IDBConnectionProxy::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier)
+void IDBConnectionProxy::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed)
 {
-    callConnectionOnMainThread(&IDBConnectionToServer::didFireVersionChangeEvent, databaseConnectionIdentifier, requestIdentifier);
+    callConnectionOnMainThread(&IDBConnectionToServer::didFireVersionChangeEvent, databaseConnectionIdentifier, requestIdentifier, connectionClosed);
 }
 
 void IDBConnectionProxy::notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion)
@@ -542,6 +561,23 @@
         map.remove(key);
 }
 
+template<typename KeyType, typename ValueType>
+void setMatchingItemsContextSuspended(ScriptExecutionContext& currentContext, HashMap<KeyType, ValueType>& map, bool isContextSuspended)
+{
+    auto& currentThread = Thread::current();
+    for (auto& iterator : map) {
+        if (&iterator.value->originThread() != &currentThread)
+            continue;
+
+        auto* context = iterator.value->scriptExecutionContext();
+        if (!context)
+            continue;
+
+        if (context == &currentContext)
+            iterator.value->setIsContextSuspended(isContextSuspended);
+    }
+}
+
 void IDBConnectionProxy::forgetActivityForCurrentThread()
 {
     ASSERT(!isMainThread());
@@ -566,6 +602,18 @@
     }
 }
 
+void IDBConnectionProxy::setContextSuspended(ScriptExecutionContext& currentContext, bool isContextSuspended)
+{
+    {
+        Locker<Lock> lock(m_databaseConnectionMapLock);
+        setMatchingItemsContextSuspended(currentContext, m_databaseConnectionMap, isContextSuspended);
+    }
+    {
+        Locker<Lock> lock(m_openDBRequestMapLock);
+        setMatchingItemsContextSuspended(currentContext, m_openDBRequestMap, isContextSuspended);
+    }
+}
+
 } // namesapce IDBClient
 } // namespace WebCore
 

Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionProxy.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -85,7 +85,7 @@
     void renameIndex(TransactionOperation&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName);
 
     void fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion);
-    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier);
+    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, const IndexedDB::ConnectionClosedOnBehalfOfServer = IndexedDB::ConnectionClosedOnBehalfOfServer::No);
 
     void notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion);
     void openDBRequestCancelled(const IDBRequestData&);
@@ -124,6 +124,7 @@
     void forgetActiveOperations(const Vector<RefPtr<TransactionOperation>>&);
     void forgetTransaction(IDBTransaction&);
     void forgetActivityForCurrentThread();
+    void setContextSuspended(ScriptExecutionContext& currentContext, bool isContextSuspended);
 
 private:
     void completeOpenDBRequest(const IDBResultData&);

Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -415,13 +415,13 @@
     m_proxy->fireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, requestedVersion);
 }
 
-void IDBConnectionToServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier)
+void IDBConnectionToServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, const IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed)
 {
     LOG(IndexedDB, "IDBConnectionToServer::didFireVersionChangeEvent");
     ASSERT(isMainThread());
 
     if (m_serverConnectionIsValid)
-        m_delegate->didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier);
+        m_delegate->didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, connectionClosed);
 }
 
 void IDBConnectionToServer::didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError& error)

Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -116,7 +116,7 @@
     WEBCORE_EXPORT void didAbortTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&);
 
     WEBCORE_EXPORT void fireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, uint64_t requestedVersion);
-    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier);
+    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer);
 
     WEBCORE_EXPORT void didStartTransaction(const IDBResourceIdentifier& transactionIdentifier, const IDBError&);
 

Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -48,6 +48,7 @@
 
 namespace IndexedDB {
 enum class ObjectStoreOverwriteMode;
+enum class ConnectionClosedOnBehalfOfServer : bool;
 }
 
 struct IDBKeyRangeData;
@@ -83,7 +84,7 @@
     virtual void databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier) = 0;
     virtual void databaseConnectionClosed(uint64_t databaseConnectionIdentifier) = 0;
     virtual void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier) = 0;
-    virtual void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier) = 0;
+    virtual void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, const IndexedDB::ConnectionClosedOnBehalfOfServer) = 0;
     virtual void openDBRequestCancelled(const IDBRequestData&) = 0;
     virtual void confirmDidCloseFromServer(uint64_t databaseConnectionIdentifier) = 0;
 

Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -430,12 +430,12 @@
     databaseConnection->connectionClosedFromClient();
 }
 
-void IDBServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier)
+void IDBServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed)
 {
     LOG(IndexedDB, "IDBServer::didFireVersionChangeEvent");
 
     if (auto databaseConnection = m_databaseConnections.get(databaseConnectionIdentifier))
-        databaseConnection->didFireVersionChangeEvent(requestIdentifier);
+        databaseConnection->didFireVersionChangeEvent(requestIdentifier, connectionClosed);
 }
 
 void IDBServer::openDBRequestCancelled(const IDBRequestData& requestData)

Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -90,7 +90,7 @@
     WEBCORE_EXPORT void databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier);
     WEBCORE_EXPORT void databaseConnectionClosed(uint64_t databaseConnectionIdentifier);
     WEBCORE_EXPORT void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier);
-    WEBCORE_EXPORT void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier);
+    WEBCORE_EXPORT void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer);
     WEBCORE_EXPORT void openDBRequestCancelled(const IDBRequestData&);
     WEBCORE_EXPORT void confirmDidCloseFromServer(uint64_t databaseConnectionIdentifier);
 

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -752,8 +752,30 @@
     m_currentOpenDBRequest->maybeNotifyRequestBlocked(m_databaseInfo->version());
 }
 
-void UniqueIDBDatabase::didFireVersionChangeEvent(UniqueIDBDatabaseConnection& connection, const IDBResourceIdentifier& requestIdentifier)
+void UniqueIDBDatabase::clearTransactionsOnConnection(UniqueIDBDatabaseConnection& connection)
 {
+    Deque<RefPtr<UniqueIDBDatabaseTransaction>> pendingTransactions;
+    while (!m_pendingTransactions.isEmpty()) {
+        auto transaction = m_pendingTransactions.takeFirst();
+        if (&transaction->databaseConnection() != &connection)
+            pendingTransactions.append(WTFMove(transaction));
+        else
+            connection.deleteTransaction(*transaction);
+    }
+    if (!pendingTransactions.isEmpty())
+        m_pendingTransactions.swap(pendingTransactions);
+
+    Deque<RefPtr<UniqueIDBDatabaseTransaction>> transactionsToAbort;
+    for (auto& transaction : m_inProgressTransactions.values()) {
+        if (&transaction->databaseConnection() == &connection)
+            transactionsToAbort.append(transaction);
+    }
+    for (auto& transaction : transactionsToAbort)
+        transaction->abortWithoutCallback();
+}
+
+void UniqueIDBDatabase::didFireVersionChangeEvent(UniqueIDBDatabaseConnection& connection, const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosedOnBehalfOfServer)
+{
     LOG(IndexedDB, "UniqueIDBDatabase::didFireVersionChangeEvent");
 
     if (!m_currentOpenDBRequest)
@@ -761,6 +783,13 @@
 
     ASSERT_UNUSED(requestIdentifier, m_currentOpenDBRequest->requestData().requestIdentifier() == requestIdentifier);
 
+    if (connectionClosedOnBehalfOfServer == IndexedDB::ConnectionClosedOnBehalfOfServer::Yes) {
+        if (m_openDatabaseConnections.contains(&connection)) {
+            clearTransactionsOnConnection(connection);
+            m_openDatabaseConnections.remove(&connection);
+        }
+    }
+
     notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(connection.identifier());
 }
 
@@ -1845,25 +1874,8 @@
         m_versionChangeDatabaseConnection = nullptr;
     }
 
-    Deque<RefPtr<UniqueIDBDatabaseTransaction>> pendingTransactions;
-    while (!m_pendingTransactions.isEmpty()) {
-        auto transaction = m_pendingTransactions.takeFirst();
-        if (&transaction->databaseConnection() != &connection)
-            pendingTransactions.append(WTFMove(transaction));
-    }
+    clearTransactionsOnConnection(connection);
 
-    if (!pendingTransactions.isEmpty())
-        m_pendingTransactions.swap(pendingTransactions);
-
-    Deque<RefPtr<UniqueIDBDatabaseTransaction>> transactionsToAbort;
-    for (auto& transaction : m_inProgressTransactions.values()) {
-        if (&transaction->databaseConnection() == &connection)
-            transactionsToAbort.append(transaction);
-    }
-
-    for (auto& transaction : transactionsToAbort)
-        transaction->abortWithoutCallback();
-
     if (m_currentOpenDBRequest)
         notifyCurrentRequestConnectionClosedOrFiredVersionChangeEvent(connection.identifier());
 

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -105,7 +105,7 @@
     void transactionDestroyed(UniqueIDBDatabaseTransaction&);
     void connectionClosedFromClient(UniqueIDBDatabaseConnection&);
     void confirmConnectionClosedOnServer(UniqueIDBDatabaseConnection&);
-    void didFireVersionChangeEvent(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& requestIdentifier);
+    void didFireVersionChangeEvent(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer);
     void openDBRequestCancelled(const IDBResourceIdentifier& requestIdentifier);
     void confirmDidCloseFromServer(UniqueIDBDatabaseConnection&);
 
@@ -250,6 +250,8 @@
     void startSpaceIncreaseTask(uint64_t identifier, uint64_t taskSize);
     void finishSpaceIncreaseTask(uint64_t identifier, bool isTaskSuccessful);
 
+    void clearTransactionsOnConnection(UniqueIDBDatabaseConnection&);
+
     static uint64_t generateUniqueCallbackIdentifier();
 
     Ref<IDBServer> m_server;

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -107,13 +107,13 @@
         m_database->confirmDidCloseFromServer(*this);
 }
 
-void UniqueIDBDatabaseConnection::didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier)
+void UniqueIDBDatabaseConnection::didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed)
 {
     LOG(IndexedDB, "UniqueIDBDatabaseConnection::didFireVersionChangeEvent - %s - %" PRIu64, m_openRequestIdentifier.loggingString().utf8().data(), identifier());
 
     ASSERT(m_database);
     if (m_database)
-        m_database->didFireVersionChangeEvent(*this, requestIdentifier);
+        m_database->didFireVersionChangeEvent(*this, requestIdentifier, connectionClosed);
 }
 
 void UniqueIDBDatabaseConnection::didFinishHandlingVersionChange(const IDBResourceIdentifier& transactionIdentifier)

Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -78,7 +78,7 @@
     void didCreateIndex(const IDBResultData&);
     void didDeleteIndex(const IDBResultData&);
     void didRenameIndex(const IDBResultData&);
-    void didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier);
+    void didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer);
     void didFinishHandlingVersionChange(const IDBResourceIdentifier& transactionIdentifier);
     void confirmDidCloseFromServer();
 

Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -425,10 +425,10 @@
     });
 }
 
-void InProcessIDBServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier)
+void InProcessIDBServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, const IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed)
 {
-    RunLoop::current().dispatch([this, protectedThis = makeRef(*this), databaseConnectionIdentifier, requestIdentifier] {
-        m_server->didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier);
+    RunLoop::current().dispatch([this, protectedThis = makeRef(*this), databaseConnectionIdentifier, requestIdentifier, connectionClosed] {
+        m_server->didFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, connectionClosed);
     });
 }
 

Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h (252059 => 252060)


--- trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -91,7 +91,7 @@
     void databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier) final;
     void databaseConnectionClosed(uint64_t databaseConnectionIdentifier) final;
     void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier) final;
-    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier) final;
+    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, const IndexedDB::ConnectionClosedOnBehalfOfServer = IndexedDB::ConnectionClosedOnBehalfOfServer::No) final;
     void openDBRequestCancelled(const IDBRequestData&) final;
     void confirmDidCloseFromServer(uint64_t databaseConnectionIdentifier) final;
     void getAllDatabaseNames(const SecurityOriginData& mainFrameOrigin, const SecurityOriginData& openingOrigin, uint64_t callbackID) final;

Modified: trunk/Source/WebCore/dom/Document.cpp (252059 => 252060)


--- trunk/Source/WebCore/dom/Document.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/dom/Document.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -5161,10 +5161,19 @@
         m_styleRecalcTimer.stop();
 
         clearSharedObjectPool();
+
+#if ENABLE(INDEXED_DATABASE)
+        if (m_idbConnectionProxy)
+            m_idbConnectionProxy->setContextSuspended(*scriptExecutionContext(), true);
+#endif
         break;
     case NotInBackForwardCache:
         if (childNeedsStyleRecalc())
             scheduleStyleRecalc();
+#if ENABLE(INDEXED_DATABASE)
+        if (m_idbConnectionProxy)
+            m_idbConnectionProxy->setContextSuspended(*scriptExecutionContext(), false);
+#endif
         break;
     case AboutToEnterBackForwardCache:
         break;

Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.cpp (252059 => 252060)


--- trunk/Source/WebCore/workers/WorkerGlobalScope.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -210,6 +210,22 @@
 #endif
 }
 
+void WorkerGlobalScope::suspend()
+{
+#if ENABLE(INDEXED_DATABASE_IN_WORKERS)
+    if (m_connectionProxy)
+        m_connectionProxy->setContextSuspended(*scriptExecutionContext(), true);
+#endif
+}
+
+void WorkerGlobalScope::resume()
+{
+#if ENABLE(INDEXED_DATABASE_IN_WORKERS)
+    if (m_connectionProxy)
+        m_connectionProxy->setContextSuspended(*scriptExecutionContext(), false);
+#endif
+}
+
 #endif // ENABLE(INDEXED_DATABASE)
 
 WorkerLocation& WorkerGlobalScope::location() const

Modified: trunk/Source/WebCore/workers/WorkerGlobalScope.h (252059 => 252060)


--- trunk/Source/WebCore/workers/WorkerGlobalScope.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/workers/WorkerGlobalScope.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -75,6 +75,8 @@
 
 #if ENABLE(INDEXED_DATABASE)
     IDBClient::IDBConnectionProxy* idbConnectionProxy() final;
+    void suspend();
+    void resume();
 #endif
 
     WorkerCacheStorageConnection& cacheStorageConnection();

Modified: trunk/Source/WebCore/workers/WorkerThread.cpp (252059 => 252060)


--- trunk/Source/WebCore/workers/WorkerThread.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebCore/workers/WorkerThread.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -269,7 +269,13 @@
 {
     m_isSuspended = true;
     runLoop().postTask([&](ScriptExecutionContext&) {
+        if (m_workerGlobalScope)
+            m_workerGlobalScope->suspend();
+
         m_suspensionSemaphore.wait();
+
+        if (m_workerGlobalScope)
+            m_workerGlobalScope->resume();
     });
 }
 

Modified: trunk/Source/WebKit/ChangeLog (252059 => 252060)


--- trunk/Source/WebKit/ChangeLog	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebKit/ChangeLog	2019-11-05 18:25:38 UTC (rev 252060)
@@ -1,3 +1,18 @@
+2019-11-05  Sihui Liu  <[email protected]>
+
+        REGRESSION (r250754): web page using IDBIndex doesn't load occasionally
+        https://bugs.webkit.org/show_bug.cgi?id=203431
+
+        Reviewed by Brady Eidson.
+
+        * NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp:
+        (WebKit::WebIDBConnectionToClient::didFireVersionChangeEvent):
+        * NetworkProcess/IndexedDB/WebIDBConnectionToClient.h:
+        * NetworkProcess/IndexedDB/WebIDBConnectionToClient.messages.in:
+        * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
+        (WebKit::WebIDBConnectionToServer::didFireVersionChangeEvent):
+        * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h:
+
 2019-11-05  Fujii Hironori  <[email protected]>
 
         Unreviewed build fix for !ENABLE(MEDIA_STREAM) builds

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp (252059 => 252060)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -327,9 +327,9 @@
     idbServer().abortOpenAndUpgradeNeeded(databaseConnectionIdentifier, transactionIdentifier);
 }
 
-void WebIDBConnectionToClient::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier)
+void WebIDBConnectionToClient::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed)
 {
-    idbServer().didFireVersionChangeEvent(databaseConnectionIdentifier, transactionIdentifier);
+    idbServer().didFireVersionChangeEvent(databaseConnectionIdentifier, transactionIdentifier, connectionClosed);
 }
 
 void WebIDBConnectionToClient::openDBRequestCancelled(const IDBRequestData& requestData)

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.h (252059 => 252060)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -99,7 +99,7 @@
     void databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier);
     void databaseConnectionClosed(uint64_t databaseConnectionIdentifier);
     void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& transactionIdentifier);
-    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& requestIdentifier);
+    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& requestIdentifier, WebCore::IndexedDB::ConnectionClosedOnBehalfOfServer);
     void openDBRequestCancelled(const WebCore::IDBRequestData&);
     void confirmDidCloseFromServer(uint64_t databaseConnectionIdentifier);
 

Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.messages.in (252059 => 252060)


--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.messages.in	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBConnectionToClient.messages.in	2019-11-05 18:25:38 UTC (rev 252060)
@@ -47,7 +47,7 @@
     DatabaseConnectionPendingClose(uint64_t databaseConnectionIdentifier);
     DatabaseConnectionClosed(uint64_t databaseConnectionIdentifier);
     AbortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, WebCore::IDBResourceIdentifier transactionIdentifier);
-    DidFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, WebCore::IDBResourceIdentifier requestIdentifier);
+    DidFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, WebCore::IDBResourceIdentifier requestIdentifier, WebCore::IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosedOnBehalfOfServer);
     OpenDBRequestCancelled(WebCore::IDBRequestData requestData);
     ConfirmDidCloseFromServer(uint64_t databaseConnectionIdentifier);
 

Modified: trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp (252059 => 252060)


--- trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp	2019-11-05 18:25:38 UTC (rev 252060)
@@ -198,9 +198,9 @@
     send(Messages::WebIDBConnectionToClient::AbortOpenAndUpgradeNeeded(databaseConnectionIdentifier, transactionIdentifier));
 }
 
-void WebIDBConnectionToServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier)
+void WebIDBConnectionToServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, const IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed)
 {
-    send(Messages::WebIDBConnectionToClient::DidFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier));
+    send(Messages::WebIDBConnectionToClient::DidFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, connectionClosed));
 }
 
 void WebIDBConnectionToServer::openDBRequestCancelled(const IDBRequestData& requestData)

Modified: trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h (252059 => 252060)


--- trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h	2019-11-05 18:25:38 UTC (rev 252060)
@@ -80,7 +80,7 @@
     void databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier) final;
     void databaseConnectionClosed(uint64_t databaseConnectionIdentifier) final;
     void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& transactionIdentifier) final;
-    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& requestIdentifier) final;
+    void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& requestIdentifier, const WebCore::IndexedDB::ConnectionClosedOnBehalfOfServer) final;
     void openDBRequestCancelled(const WebCore::IDBRequestData&) final;
     void confirmDidCloseFromServer(uint64_t databaseConnectionIdentifier) final;
 

Modified: trunk/Tools/ChangeLog (252059 => 252060)


--- trunk/Tools/ChangeLog	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Tools/ChangeLog	2019-11-05 18:25:38 UTC (rev 252060)
@@ -1,3 +1,17 @@
+2019-11-05  Sihui Liu  <[email protected]>
+
+        REGRESSION (r250754): web page using IDBIndex doesn't load occasionally
+        https://bugs.webkit.org/show_bug.cgi?id=203431
+
+        Reviewed by Brady Eidson.
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.html: Added.
+        * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.mm: Added.
+        (-[IndexedDBInPageCacheMessageHandler userContentController:didReceiveScriptMessage:]):
+        (TEST):
+        * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBNotInPageCache.html: Added.
+
 2019-11-05  Jonathan Bedard  <[email protected]>
 
         webkitpy: Build ImageDiff if it is missing (Follow-fix)

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (252059 => 252060)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-11-05 18:05:12 UTC (rev 252059)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-11-05 18:25:38 UTC (rev 252060)
@@ -725,6 +725,9 @@
 		9368A25F229EFB4700A829CA /* local-storage-process-suspends-2.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9368A25C229EFB3A00A829CA /* local-storage-process-suspends-2.html */; };
 		936F72801CD7D9EC0068A0FB /* large-video-with-audio.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 936F727E1CD7D9D00068A0FB /* large-video-with-audio.html */; };
 		936F72811CD7D9EC0068A0FB /* large-video-with-audio.mp4 in Copy Resources */ = {isa = PBXBuildFile; fileRef = 936F727F1CD7D9D00068A0FB /* large-video-with-audio.mp4 */; };
+		9399BA0423711140008392BF /* IndexedDBInPageCache.mm in Sources */ = {isa = PBXBuildFile; fileRef = 9399BA01237110AE008392BF /* IndexedDBInPageCache.mm */; };
+		9399BA052371114F008392BF /* IndexedDBInPageCache.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9399BA02237110BF008392BF /* IndexedDBInPageCache.html */; };
+		9399BA062371114F008392BF /* IndexedDBNotInPageCache.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 9399BA03237110BF008392BF /* IndexedDBNotInPageCache.html */; };
 		93AF4ECE1506F064007FD57E /* NewFirstVisuallyNonEmptyLayoutForImages_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93AF4ECD1506F064007FD57E /* NewFirstVisuallyNonEmptyLayoutForImages_Bundle.cpp */; };
 		93AF4ED11506F130007FD57E /* lots-of-images.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 93AF4ECF1506F123007FD57E /* lots-of-images.html */; };
 		93B62054234EA62C00D49B97 /* StorageQuotaManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93B62053234EA32B00D49B97 /* StorageQuotaManager.cpp */; };
@@ -1288,9 +1291,11 @@
 				51A587851D2739E3004BA9AF /* IndexedDBDatabaseProcessKill-1.html in Copy Resources */,
 				CAB0FF5222332407006CA5B0 /* IndexedDBFileName-1.html in Copy Resources */,
 				CAB0FF5322332407006CA5B0 /* IndexedDBFileName-2.html in Copy Resources */,
+				9399BA052371114F008392BF /* IndexedDBInPageCache.html in Copy Resources */,
 				51BCEE4E1C84F53B0042C82E /* IndexedDBMultiProcess-1.html in Copy Resources */,
 				51BCEE4F1C84F53B0042C82E /* IndexedDBMultiProcess-2.html in Copy Resources */,
 				51A5877D1D1B49CD004BA9AF /* IndexedDBMultiProcess-3.html in Copy Resources */,
+				9399BA062371114F008392BF /* IndexedDBNotInPageCache.html in Copy Resources */,
 				51B1EE961C80FAEF0064FB98 /* IndexedDBPersistence-1.html in Copy Resources */,
 				51B1EE971C80FAEF0064FB98 /* IndexedDBPersistence-2.html in Copy Resources */,
 				57599E271F071AA000A3FB8C /* IndexedDBStructuredCloneBackwardCompatibility.sqlite3 in Copy Resources */,
@@ -2108,6 +2113,9 @@
 		9368A25D229EFB3A00A829CA /* local-storage-process-suspends-1.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "local-storage-process-suspends-1.html"; sourceTree = "<group>"; };
 		936F727E1CD7D9D00068A0FB /* large-video-with-audio.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "large-video-with-audio.html"; sourceTree = "<group>"; };
 		936F727F1CD7D9D00068A0FB /* large-video-with-audio.mp4 */ = {isa = PBXFileReference; lastKnownFileType = file; path = "large-video-with-audio.mp4"; sourceTree = "<group>"; };
+		9399BA01237110AE008392BF /* IndexedDBInPageCache.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IndexedDBInPageCache.mm; sourceTree = "<group>"; };
+		9399BA02237110BF008392BF /* IndexedDBInPageCache.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = IndexedDBInPageCache.html; sourceTree = "<group>"; };
+		9399BA03237110BF008392BF /* IndexedDBNotInPageCache.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = IndexedDBNotInPageCache.html; sourceTree = "<group>"; };
 		939BA91614103412001A01BD /* DeviceScaleFactorOnBack.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DeviceScaleFactorOnBack.mm; sourceTree = "<group>"; };
 		939BFE3918E5548900883275 /* StringTruncator.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = StringTruncator.mm; sourceTree = "<group>"; };
 		93A258981F92FF15003E510C /* TextCodec.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = TextCodec.cpp; sourceTree = "<group>"; };
@@ -2859,6 +2867,7 @@
 				5110FCEF1E01CBAA006F8D0B /* IDBIndexUpgradeToV2.mm */,
 				51A587841D272EF3004BA9AF /* IndexedDBDatabaseProcessKill.mm */,
 				CAB0FF5422332C3A006CA5B0 /* IndexedDBFileName.mm */,
+				9399BA01237110AE008392BF /* IndexedDBInPageCache.mm */,
 				51BCEE491C84F4AF0042C82E /* IndexedDBMultiProcess.mm */,
 				51B1EE8D1C80F5880064FB98 /* IndexedDBPersistence.mm */,
 				57599E201F07191700A3FB8C /* IndexedDBStructuredCloneBackwardCompatibility.mm */,
@@ -3326,9 +3335,11 @@
 				51A587821D272EB5004BA9AF /* IndexedDBDatabaseProcessKill-1.html */,
 				CAB0FF51223323F6006CA5B0 /* IndexedDBFileName-1.html */,
 				CAB0FF50223323F6006CA5B0 /* IndexedDBFileName-2.html */,
+				9399BA02237110BF008392BF /* IndexedDBInPageCache.html */,
 				51BCEE4C1C84F52C0042C82E /* IndexedDBMultiProcess-1.html */,
 				51BCEE4D1C84F52C0042C82E /* IndexedDBMultiProcess-2.html */,
 				51A5877C1D1B3D8D004BA9AF /* IndexedDBMultiProcess-3.html */,
+				9399BA03237110BF008392BF /* IndexedDBNotInPageCache.html */,
 				51B1EE941C80FADD0064FB98 /* IndexedDBPersistence-1.html */,
 				51B1EE951C80FADD0064FB98 /* IndexedDBPersistence-2.html */,
 				57599E241F07192C00A3FB8C /* IndexedDBStructuredCloneBackwardCompatibility.sqlite3 */,
@@ -4635,6 +4646,7 @@
 				5110FCFA1E01CDB8006F8D0B /* IDBIndexUpgradeToV2.mm in Sources */,
 				51A587861D273AA9004BA9AF /* IndexedDBDatabaseProcessKill.mm in Sources */,
 				CAB0FF5522332C57006CA5B0 /* IndexedDBFileName.mm in Sources */,
+				9399BA0423711140008392BF /* IndexedDBInPageCache.mm in Sources */,
 				7C83E0BE1D0A651300FEBCF3 /* IndexedDBMultiProcess.mm in Sources */,
 				7C83E0BF1D0A652200FEBCF3 /* IndexedDBPersistence.mm in Sources */,
 				57599E211F07191900A3FB8C /* IndexedDBStructuredCloneBackwardCompatibility.mm in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.html (0 => 252060)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.html	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.html	2019-11-05 18:25:38 UTC (rev 252060)
@@ -0,0 +1,37 @@
+<!DOCTYPE html>
+<script>
+
+var db;
+var openErrorFired = false;
+var request = window.indexedDB.open("TestIndexedDB");
+request._onsuccess_ = (event) => {
+    db = event.target.result;
+    db._onclose_ = (event) => {
+        if (openErrorFired) {
+            var thirdOpenRequest = window.indexedDB.open("TestIndexedDB");
+            thirdOpenRequest._onsuccess_ = (event) => {
+                window.webkit.messageHandlers.testHandler.postMessage("First Database Connection Closed, Second Database Connection Not Failed, Third Database Connection Opened");
+            }
+            thirdOpenRequest._onblock_ = (event) => {
+                window.webkit.messageHandlers.testHandler.postMessage("Third Database Connection Blocked");
+            }
+            thirdOpenRequest._onerror_ = (event) => {
+                window.webkit.messageHandlers.testHandler.postMessage("Third Database Connection Failed");
+            }
+        } else {
+            window.webkit.messageHandlers.testHandler.postMessage("Second Database Connection Not Failed");
+        }
+    }
+
+    var secondOpenRequest = window.indexedDB.open("TestIndexedDB", db.version + 1);
+    secondOpenRequest._onerror_ = (event) => {
+        openErrorFired = true;
+    }
+
+    window.webkit.messageHandlers.testHandler.postMessage("First Database Connection Opened");
+}
+request._onerror_ = (event) => {
+    window.webkit.messageHandlers.testHandler.postMessage("First Database Connection Failed");
+}
+
+</script>

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.mm (0 => 252060)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBInPageCache.mm	2019-11-05 18:25:38 UTC (rev 252060)
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2019 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#import "PlatformUtilities.h"
+#import "Test.h"
+
+#import <WebKit/WKProcessPoolPrivate.h>
+#import <WebKit/WKUserContentControllerPrivate.h>
+#import <WebKit/WKWebViewConfigurationPrivate.h>
+#import <WebKit/WKWebsiteDataStorePrivate.h>
+#import <WebKit/WebKit.h>
+#import <WebKit/_WKProcessPoolConfiguration.h>
+#import <WebKit/_WKUserStyleSheet.h>
+#import <WebKit/_WKWebsiteDataStoreConfiguration.h>
+#import <wtf/RetainPtr.h>
+
+static bool receivedScriptMessage;
+static RetainPtr<WKScriptMessage> lastScriptMessage;
+
+@interface IndexedDBInPageCacheMessageHandler : NSObject <WKScriptMessageHandler>
+@end
+
+@implementation IndexedDBInPageCacheMessageHandler
+
+- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
+{
+    receivedScriptMessage = true;
+    lastScriptMessage = message;
+}
+
+@end
+
+TEST(IndexedDB, IndexedDBInPageCache)
+{
+    auto handler = adoptNS([[IndexedDBInPageCacheMessageHandler alloc] init]);
+    auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+    [[configuration userContentController] addScriptMessageHandler:handler.get() name:@"testHandler"];
+
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+
+    // Load page that holds open database connection.
+    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"IndexedDBInPageCache" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
+    [webView loadRequest:request];
+
+    receivedScriptMessage = false;
+    TestWebKitAPI::Util::run(&receivedScriptMessage);
+    RetainPtr<NSString> string1 = (NSString *)[lastScriptMessage body];
+    EXPECT_WK_STREQ(@"First Database Connection Opened", string1.get());
+
+    // Load another page that deletes database.
+    NSURLRequest *request2 = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"IndexedDBNotInPageCache" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
+    [webView loadRequest:request2];
+
+    receivedScriptMessage = false;
+    TestWebKitAPI::Util::run(&receivedScriptMessage);
+    RetainPtr<NSString> string2 = (NSString *)[lastScriptMessage body];
+    EXPECT_WK_STREQ(@"Database Deleted", string2.get());
+
+    [webView goBack];
+    receivedScriptMessage = false;
+    TestWebKitAPI::Util::run(&receivedScriptMessage);
+    RetainPtr<NSString> string3 = (NSString *)[lastScriptMessage body];
+    EXPECT_WK_STREQ(@"First Database Connection Closed, Second Database Connection Not Failed, Third Database Connection Opened", string3.get());
+}

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBNotInPageCache.html (0 => 252060)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBNotInPageCache.html	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBNotInPageCache.html	2019-11-05 18:25:38 UTC (rev 252060)
@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<script>
+
+var request = window.indexedDB.deleteDatabase("TestIndexedDB");
+request._onsuccess_ = function(event) {
+    window.webkit.messageHandlers.testHandler.postMessage("Database Deleted");
+}
+request._onblocked_ = function(event) {
+    window.webkit.messageHandlers.testHandler.postMessage("Database Deletion Blocked");
+}
+
+</script>
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to