Diff
Modified: branches/safari-609-branch/Source/WTF/ChangeLog (259993 => 259994)
--- branches/safari-609-branch/Source/WTF/ChangeLog 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WTF/ChangeLog 2020-04-13 03:48:36 UTC (rev 259994)
@@ -1,3 +1,71 @@
+2020-04-12 Alan Coon <[email protected]>
+
+ Cherry-pick r259316. rdar://problem/61269751
+
+ IndexedDB: destroy WebIDBServer when session is removed in network process
+ https://bugs.webkit.org/show_bug.cgi?id=209606
+ <rdar://problem/59310081>
+
+ Reviewed by Geoffrey Garen.
+
+ Source/WebCore:
+
+ Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
+ everything in database finishes correctly.
+
+ * Modules/indexeddb/server/IDBServer.cpp:
+ (WebCore::IDBServer::IDBServer::~IDBServer):
+ (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
+ (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
+ (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
+ Source/WebKit:
+
+ Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
+
+ * NetworkProcess/IndexedDB/WebIDBServer.cpp:
+ (WebKit::WebIDBServer::~WebIDBServer):
+ (WebKit::WebIDBServer::addConnection):
+ (WebKit::WebIDBServer::removeConnection):
+ (WebKit::WebIDBServer::close):
+ * NetworkProcess/IndexedDB/WebIDBServer.h:
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::destroySession):
+ (WebKit::NetworkProcess::connectionToWebProcessClosed):
+
+ Source/WTF:
+
+ Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
+ thread finishes.
+
+ * wtf/CrossThreadTaskHandler.cpp:
+ (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
+ (WTF::CrossThreadTaskHandler::setCompletionCallback):
+ (WTF::CrossThreadTaskHandler::kill):
+ * wtf/CrossThreadTaskHandler.h:
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2020-03-31 Sihui Liu <[email protected]>
+
+ IndexedDB: destroy WebIDBServer when session is removed in network process
+ https://bugs.webkit.org/show_bug.cgi?id=209606
+ <rdar://problem/59310081>
+
+ Reviewed by Geoffrey Garen.
+
+ Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
+ thread finishes.
+
+ * wtf/CrossThreadTaskHandler.cpp:
+ (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
+ (WTF::CrossThreadTaskHandler::setCompletionCallback):
+ (WTF::CrossThreadTaskHandler::kill):
+ * wtf/CrossThreadTaskHandler.h:
+
2020-04-09 Alan Coon <[email protected]>
Revert r259689. rdar://problem/61269751
Modified: branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.cpp (259993 => 259994)
--- branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.cpp 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.cpp 2020-04-13 03:48:36 UTC (rev 259994)
@@ -37,6 +37,9 @@
Locker<Lock> locker(m_taskThreadCreationLock);
Thread::create(threadName, [this] {
taskRunLoop();
+
+ if (m_completionCallback)
+ m_completionCallback();
})->detach();
}
@@ -132,4 +135,15 @@
}
}
+void CrossThreadTaskHandler::setCompletionCallback(Function<void ()>&& completionCallback)
+{
+ m_completionCallback = WTFMove(completionCallback);
+}
+
+void CrossThreadTaskHandler::kill()
+{
+ m_taskQueue.kill();
+ m_taskReplyQueue.kill();
+}
+
} // namespace WTF
Modified: branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.h (259993 => 259994)
--- branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.h 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WTF/wtf/CrossThreadTaskHandler.h 2020-04-13 03:48:36 UTC (rev 259994)
@@ -48,6 +48,9 @@
WTF_EXPORT_PRIVATE void suspendAndWait();
WTF_EXPORT_PRIVATE void resume();
+ WTF_EXPORT_PRIVATE void kill();
+ WTF_EXPORT_PRIVATE void setCompletionCallback(Function<void ()>&&);
+
private:
void handleTaskRepliesOnMainThread();
void taskRunLoop();
@@ -68,6 +71,8 @@
CrossThreadQueue<CrossThreadTask> m_taskQueue;
CrossThreadQueue<CrossThreadTask> m_taskReplyQueue;
+
+ Function<void ()> m_completionCallback;
};
} // namespace WTF
Modified: branches/safari-609-branch/Source/WebCore/ChangeLog (259993 => 259994)
--- branches/safari-609-branch/Source/WebCore/ChangeLog 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebCore/ChangeLog 2020-04-13 03:48:36 UTC (rev 259994)
@@ -1,5 +1,76 @@
2020-04-12 Alan Coon <[email protected]>
+ Cherry-pick r259316. rdar://problem/61269751
+
+ IndexedDB: destroy WebIDBServer when session is removed in network process
+ https://bugs.webkit.org/show_bug.cgi?id=209606
+ <rdar://problem/59310081>
+
+ Reviewed by Geoffrey Garen.
+
+ Source/WebCore:
+
+ Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
+ everything in database finishes correctly.
+
+ * Modules/indexeddb/server/IDBServer.cpp:
+ (WebCore::IDBServer::IDBServer::~IDBServer):
+ (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
+ (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
+ (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
+ Source/WebKit:
+
+ Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
+
+ * NetworkProcess/IndexedDB/WebIDBServer.cpp:
+ (WebKit::WebIDBServer::~WebIDBServer):
+ (WebKit::WebIDBServer::addConnection):
+ (WebKit::WebIDBServer::removeConnection):
+ (WebKit::WebIDBServer::close):
+ * NetworkProcess/IndexedDB/WebIDBServer.h:
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::destroySession):
+ (WebKit::NetworkProcess::connectionToWebProcessClosed):
+
+ Source/WTF:
+
+ Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
+ thread finishes.
+
+ * wtf/CrossThreadTaskHandler.cpp:
+ (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
+ (WTF::CrossThreadTaskHandler::setCompletionCallback):
+ (WTF::CrossThreadTaskHandler::kill):
+ * wtf/CrossThreadTaskHandler.h:
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2020-03-31 Sihui Liu <[email protected]>
+
+ IndexedDB: destroy WebIDBServer when session is removed in network process
+ https://bugs.webkit.org/show_bug.cgi?id=209606
+ <rdar://problem/59310081>
+
+ Reviewed by Geoffrey Garen.
+
+ Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
+ everything in database finishes correctly.
+
+ * Modules/indexeddb/server/IDBServer.cpp:
+ (WebCore::IDBServer::IDBServer::~IDBServer):
+ (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
+ (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
+ (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
+2020-04-12 Alan Coon <[email protected]>
+
Cherry-pick r257901. rdar://problem/61269751
Remove unused variable m_allUniqueIDBDatabases in IDBServer
Modified: branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (259993 => 259994)
--- branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp 2020-04-13 03:48:36 UTC (rev 259994)
@@ -60,6 +60,9 @@
IDBServer::~IDBServer()
{
ASSERT(!isMainThread());
+
+ for (auto& database : m_uniqueIDBDatabaseMap.values())
+ database->immediateClose();
}
void IDBServer::registerConnection(IDBConnectionToClient& connection)
@@ -534,7 +537,7 @@
HashSet<UniqueIDBDatabase*> openDatabases;
for (auto& database : m_uniqueIDBDatabaseMap.values())
- database->immediateCloseForUserDelete();
+ database->immediateClose();
m_uniqueIDBDatabaseMap.clear();
@@ -561,7 +564,7 @@
}
for (auto& database : openDatabases) {
- database->immediateCloseForUserDelete();
+ database->immediateClose();
m_uniqueIDBDatabaseMap.remove(database->identifier());
}
Modified: branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (259993 => 259994)
--- branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2020-04-13 03:48:36 UTC (rev 259994)
@@ -1144,9 +1144,9 @@
request.connection().didDeleteDatabase(result);
}
-void UniqueIDBDatabase::immediateCloseForUserDelete()
+void UniqueIDBDatabase::immediateClose()
{
- LOG(IndexedDB, "UniqueIDBDatabase::immediateCloseForUserDelete");
+ LOG(IndexedDB, "UniqueIDBDatabase::immediateClose");
// Error out all transactions.
// Pending transactions must be cleared before in-progress transactions,
Modified: branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (259993 => 259994)
--- branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2020-04-13 03:48:36 UTC (rev 259994)
@@ -107,7 +107,7 @@
void enqueueTransaction(Ref<UniqueIDBDatabaseTransaction>&&);
void handleDelete(IDBConnectionToClient&, const IDBRequestData&);
- void immediateCloseForUserDelete();
+ void immediateClose();
void abortActiveTransactions();
Modified: branches/safari-609-branch/Source/WebKit/ChangeLog (259993 => 259994)
--- branches/safari-609-branch/Source/WebKit/ChangeLog 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebKit/ChangeLog 2020-04-13 03:48:36 UTC (rev 259994)
@@ -1,3 +1,74 @@
+2020-04-12 Alan Coon <[email protected]>
+
+ Cherry-pick r259316. rdar://problem/61269751
+
+ IndexedDB: destroy WebIDBServer when session is removed in network process
+ https://bugs.webkit.org/show_bug.cgi?id=209606
+ <rdar://problem/59310081>
+
+ Reviewed by Geoffrey Garen.
+
+ Source/WebCore:
+
+ Rename immediateCloseForUserDelete to immediateClose as we now use it in destructor of IDBServer to make sure
+ everything in database finishes correctly.
+
+ * Modules/indexeddb/server/IDBServer.cpp:
+ (WebCore::IDBServer::IDBServer::~IDBServer):
+ (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesModifiedSince):
+ (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::immediateClose):
+ (WebCore::IDBServer::UniqueIDBDatabase::immediateCloseForUserDelete): Deleted.
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
+ Source/WebKit:
+
+ Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
+
+ * NetworkProcess/IndexedDB/WebIDBServer.cpp:
+ (WebKit::WebIDBServer::~WebIDBServer):
+ (WebKit::WebIDBServer::addConnection):
+ (WebKit::WebIDBServer::removeConnection):
+ (WebKit::WebIDBServer::close):
+ * NetworkProcess/IndexedDB/WebIDBServer.h:
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::destroySession):
+ (WebKit::NetworkProcess::connectionToWebProcessClosed):
+
+ Source/WTF:
+
+ Add function to kill CrossThreadTaskHandler and make thread finish. Also add a callback to be called before
+ thread finishes.
+
+ * wtf/CrossThreadTaskHandler.cpp:
+ (WTF::CrossThreadTaskHandler::CrossThreadTaskHandler):
+ (WTF::CrossThreadTaskHandler::setCompletionCallback):
+ (WTF::CrossThreadTaskHandler::kill):
+ * wtf/CrossThreadTaskHandler.h:
+
+ git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259316 268f45cc-cd09-0410-ab3c-d52691b4dbfc
+
+ 2020-03-31 Sihui Liu <[email protected]>
+
+ IndexedDB: destroy WebIDBServer when session is removed in network process
+ https://bugs.webkit.org/show_bug.cgi?id=209606
+ <rdar://problem/59310081>
+
+ Reviewed by Geoffrey Garen.
+
+ Tested manually to verify WebIDBServer is removed and its thread ends when session is removed.
+
+ * NetworkProcess/IndexedDB/WebIDBServer.cpp:
+ (WebKit::WebIDBServer::~WebIDBServer):
+ (WebKit::WebIDBServer::addConnection):
+ (WebKit::WebIDBServer::removeConnection):
+ (WebKit::WebIDBServer::close):
+ * NetworkProcess/IndexedDB/WebIDBServer.h:
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::destroySession):
+ (WebKit::NetworkProcess::connectionToWebProcessClosed):
+
2020-04-10 Alan Coon <[email protected]>
Cherry-pick r259802. rdar://problem/61477495
Modified: branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp (259993 => 259994)
--- branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp 2020-04-13 03:48:36 UTC (rev 259994)
@@ -53,7 +53,12 @@
});
semaphore.wait();
}
-
+
+WebIDBServer::~WebIDBServer()
+{
+ ASSERT(RunLoop::isMain());
+}
+
void WebIDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime, CompletionHandler<void()>&& callback)
{
ASSERT(RunLoop::isMain());
@@ -335,6 +340,7 @@
LockHolder locker(m_server->lock());
m_server->registerConnection(iter->value->connectionToClient());
});
+ m_connections.add(&connection);
connection.addThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName(), this);
}
@@ -342,6 +348,7 @@
{
ASSERT(RunLoop::isMain());
+ m_connections.remove(&connection);
connection.removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
postTask([this, protectedThis = makeRef(*this), connectionID = connection.uniqueID()] {
auto connection = m_connectionMap.take(connectionID);
@@ -365,5 +372,26 @@
CrossThreadTaskHandler::postTask(CrossThreadTask(WTFMove(task)));
}
+void WebIDBServer::close()
+{
+ ASSERT(RunLoop::isMain());
+
+ // Remove the references held by IPC::Connection.
+ for (auto* connection : m_connections)
+ connection->removeThreadMessageReceiver(Messages::WebIDBServer::messageReceiverName());
+
+ CrossThreadTaskHandler::setCompletionCallback([protectedThis = makeRef(*this)]() mutable {
+ ASSERT(!RunLoop::isMain());
+ callOnMainRunLoop([protectedThis = WTFMove(protectedThis)]() mutable { });
+ });
+
+ postTask([this]() mutable {
+ m_connectionMap.clear();
+ m_server = nullptr;
+
+ CrossThreadTaskHandler::kill();
+ });
+}
+
} // namespace WebKit
#endif
Modified: branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h (259993 => 259994)
--- branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h 2020-04-13 03:48:36 UTC (rev 259994)
@@ -87,9 +87,11 @@
void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
void dispatchToThread(WTF::Function<void()>&&);
+ void close();
private:
WebIDBServer(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
+ ~WebIDBServer();
void postTask(WTF::Function<void()>&&);
@@ -97,6 +99,7 @@
bool m_isSuspended { false };
HashMap<IPC::Connection::UniqueID, std::unique_ptr<WebIDBConnectionToClient>> m_connectionMap;
+ HashSet<IPC::Connection*> m_connections;
};
} // namespace WebKit
Modified: branches/safari-609-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp (259993 => 259994)
--- branches/safari-609-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2020-04-13 03:48:29 UTC (rev 259993)
+++ branches/safari-609-branch/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2020-04-13 03:48:36 UTC (rev 259994)
@@ -578,6 +578,8 @@
#endif
m_storageManagerSet->remove(sessionID);
+ if (auto webIDBServer = m_webIDBServers.take(sessionID))
+ webIDBServer->close();
}
#if ENABLE(RESOURCE_LOAD_STATISTICS)
@@ -2544,7 +2546,8 @@
void NetworkProcess::connectionToWebProcessClosed(IPC::Connection& connection, PAL::SessionID sessionID)
{
m_storageManagerSet->removeConnection(connection);
- webIDBServer(sessionID).removeConnection(connection);
+ if (auto* webIDBServer = m_webIDBServers.get(sessionID))
+ webIDBServer->removeConnection(connection);
}
NetworkConnectionToWebProcess* NetworkProcess::webProcessConnection(ProcessIdentifier identifier) const