Diff
Modified: trunk/Source/WebCore/ChangeLog (266741 => 266742)
--- trunk/Source/WebCore/ChangeLog 2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebCore/ChangeLog 2020-09-08 19:37:42 UTC (rev 266742)
@@ -1,3 +1,17 @@
+2020-09-08 Sihui Liu <[email protected]>
+
+ Remove storage WorkQueue in NetworkProcess
+ https://bugs.webkit.org/show_bug.cgi?id=216199
+
+ Reviewed by Youenn Fablet.
+
+ Move origin fetching code from NetworkProcess to IDBServer.
+
+ * Modules/indexeddb/server/IDBServer.cpp:
+ (WebCore::IDBServer::IDBServer::collectOriginsForVersion const):
+ (WebCore::IDBServer::IDBServer::getOrigins const):
+ * Modules/indexeddb/server/IDBServer.h:
+
2020-09-08 Frank Yang <[email protected]>
CoreImage Implementation of CSS Filters invert(), opacity(), brightness(), contrast()
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (266741 => 266742)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp 2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp 2020-09-08 19:37:42 UTC (rev 266742)
@@ -541,6 +541,37 @@
connection->didGetAllDatabaseNamesAndVersions(requestIdentifier, WTFMove(databases));
}
+static void collectOriginsForVersion(const String& versionPath, HashSet<WebCore::SecurityOriginData>& securityOrigins)
+{
+ for (auto& topOriginPath : FileSystem::listDirectory(versionPath, "*")) {
+ auto databaseIdentifier = FileSystem::pathGetFileName(topOriginPath);
+ if (auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(databaseIdentifier)) {
+ securityOrigins.add(WTFMove(*securityOrigin));
+
+ for (auto& originPath : FileSystem::listDirectory(topOriginPath, "*")) {
+ databaseIdentifier = FileSystem::pathGetFileName(originPath);
+ if (auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(databaseIdentifier))
+ securityOrigins.add(WTFMove(*securityOrigin));
+ }
+ }
+ }
+}
+
+HashSet<SecurityOriginData> IDBServer::getOrigins() const
+{
+ ASSERT(!isMainThread());
+ ASSERT(m_lock.isHeld());
+
+ if (m_databaseDirectoryPath.isEmpty())
+ return { };
+
+ HashSet<WebCore::SecurityOriginData> securityOrigins;
+ collectOriginsForVersion(FileSystem::pathByAppendingComponent(m_databaseDirectoryPath, "v0"), securityOrigins);
+ collectOriginsForVersion(FileSystem::pathByAppendingComponent(m_databaseDirectoryPath, "v1"), securityOrigins);
+
+ return securityOrigins;
+}
+
void IDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime)
{
ASSERT(!isMainThread());
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h (266741 => 266742)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h 2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h 2020-09-08 19:37:42 UTC (rev 266742)
@@ -101,6 +101,7 @@
std::unique_ptr<IDBBackingStore> createBackingStore(const IDBDatabaseIdentifier&);
+ WEBCORE_EXPORT HashSet<SecurityOriginData> getOrigins() const;
WEBCORE_EXPORT void closeAndDeleteDatabasesModifiedSince(WallTime);
WEBCORE_EXPORT void closeAndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>&);
void closeDatabasesForOrigins(const Vector<SecurityOriginData>&, Function<bool(const SecurityOriginData&, const ClientOrigin&)>&&);
Modified: trunk/Source/WebKit/ChangeLog (266741 => 266742)
--- trunk/Source/WebKit/ChangeLog 2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/ChangeLog 2020-09-08 19:37:42 UTC (rev 266742)
@@ -1,3 +1,31 @@
+2020-09-08 Sihui Liu <[email protected]>
+
+ Remove storage WorkQueue in NetworkProcess
+ https://bugs.webkit.org/show_bug.cgi?id=216199
+
+ Reviewed by Youenn Fablet.
+
+ The only meaningful usage of this WorkQueue is iterating IndexedDB directories and collecting origins, while
+ there can be some IDB thread accessing the same directories. To remove the race, Let's just drop this WorkQueue
+ and fetch origins via WebIDBServer.
+
+ * NetworkProcess/IndexedDB/WebIDBServer.cpp:
+ (WebKit::WebIDBServer::getOrigins):
+ * NetworkProcess/IndexedDB/WebIDBServer.h:
+ * NetworkProcess/NetworkProcess.cpp:
+ (WebKit::NetworkProcess::addSessionStorageQuotaManager):
+ (WebKit::NetworkProcess::fetchWebsiteData):
+ (WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains):
+ (WebKit::NetworkProcess::registrableDomainsWithWebsiteData):
+ (WebKit::NetworkProcess::addIndexedDatabaseSession):
+ (WebKit::NetworkProcess::addServiceWorkerSession):
+ (WebKit::NetworkProcess::ensurePathExists): Deleted.
+ (WebKit::NetworkProcess::postStorageTask): Deleted.
+ (WebKit::NetworkProcess::performNextStorageTask): Deleted.
+ (WebKit::NetworkProcess::collectIndexedDatabaseOriginsForVersion): Deleted.
+ (WebKit::NetworkProcess::indexedDatabaseOrigins): Deleted.
+ * NetworkProcess/NetworkProcess.h:
+
2020-09-08 Peng Liu <[email protected]>
Clean up functions and state variables related to the picture-in-picture implementation
Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp (266741 => 266742)
--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp 2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp 2020-09-08 19:37:42 UTC (rev 266742)
@@ -59,6 +59,20 @@
ASSERT(RunLoop::isMain());
}
+void WebIDBServer::getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&& callback)
+{
+ ASSERT(RunLoop::isMain());
+
+ postTask([this, protectedThis = makeRef(*this), callback = WTFMove(callback)]() mutable {
+ ASSERT(!RunLoop::isMain());
+
+ LockHolder locker(m_server->lock());
+ postTaskReply(CrossThreadTask([callback = WTFMove(callback), origins = crossThreadCopy(m_server->getOrigins())]() mutable {
+ callback(WTFMove(origins));
+ }));
+ });
+}
+
void WebIDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime, CompletionHandler<void()>&& callback)
{
ASSERT(RunLoop::isMain());
Modified: trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h (266741 => 266742)
--- trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h 2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h 2020-09-08 19:37:42 UTC (rev 266742)
@@ -47,6 +47,7 @@
public:
static Ref<WebIDBServer> create(PAL::SessionID, const String& directory, WebCore::IDBServer::IDBServer::StorageQuotaManagerSpaceRequester&&);
+ void getOrigins(CompletionHandler<void(HashSet<WebCore::SecurityOriginData>&&)>&&);
void closeAndDeleteDatabasesModifiedSince(WallTime, CompletionHandler<void()>&& callback);
void closeAndDeleteDatabasesForOrigins(const Vector<WebCore::SecurityOriginData>&, CompletionHandler<void()>&& callback);
void renameOrigin(const WebCore::SecurityOriginData&, const WebCore::SecurityOriginData&, CompletionHandler<void()>&&);
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (266741 => 266742)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp 2020-09-08 19:37:42 UTC (rev 266742)
@@ -465,11 +465,8 @@
auto isNewEntry = m_sessionStorageQuotaManagers.ensure(sessionID, [defaultQuota, defaultThirdPartyQuota, &cacheRootPath] {
return makeUnique<SessionStorageQuotaManager>(cacheRootPath, defaultQuota, defaultThirdPartyQuota);
}).isNewEntry;
- if (isNewEntry) {
+ if (isNewEntry)
SandboxExtension::consumePermanently(cacheRootPathHandle);
- if (!cacheRootPath.isEmpty())
- postStorageTask(createCrossThreadTask(*this, &NetworkProcess::ensurePathExists, cacheRootPath));
- }
}
void NetworkProcess::removeSessionStorageQuotaManager(PAL::SessionID sessionID)
@@ -1558,13 +1555,10 @@
#if ENABLE(INDEXED_DATABASE)
auto path = m_idbDatabasePaths.get(sessionID);
if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases)) {
- // FIXME: Pick the right database store based on the session ID.
- postStorageTask(CrossThreadTask([this, callbackAggregator, path = crossThreadCopy(path)]() mutable {
- RunLoop::main().dispatch([callbackAggregator = WTFMove(callbackAggregator), securityOrigins = indexedDatabaseOrigins(path)] {
- for (const auto& securityOrigin : securityOrigins)
- callbackAggregator->m_websiteData.entries.append({ securityOrigin, WebsiteDataType::IndexedDBDatabases, 0 });
- });
- }));
+ webIDBServer(sessionID).getOrigins([callbackAggregator](auto&& origins) {
+ while (!origins.isEmpty())
+ callbackAggregator->m_websiteData.entries.append({ origins.takeAny(), WebsiteDataType::IndexedDBDatabases, 0 });
+ });
}
#endif
@@ -1956,22 +1950,13 @@
#if ENABLE(INDEXED_DATABASE)
auto path = m_idbDatabasePaths.get(sessionID);
if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases)) {
- // FIXME: Pick the right database store based on the session ID.
- postStorageTask(CrossThreadTask([this, sessionID, callbackAggregator, path = crossThreadCopy(path), domainsToDeleteAllNonCookieWebsiteDataFor = crossThreadCopy(domainsToDeleteAllNonCookieWebsiteDataFor)]() mutable {
- RunLoop::main().dispatch([this, sessionID, domainsToDeleteAllNonCookieWebsiteDataFor = WTFMove(domainsToDeleteAllNonCookieWebsiteDataFor), callbackAggregator, securityOrigins = indexedDatabaseOrigins(path)] {
- Vector<SecurityOriginData> entriesToDelete;
- for (const auto& securityOrigin : securityOrigins) {
- auto domain = RegistrableDomain::uncheckedCreateFromHost(securityOrigin.host);
- if (!domainsToDeleteAllNonCookieWebsiteDataFor.contains(domain))
- continue;
+ webIDBServer(sessionID).getOrigins([this, protectedThis = makeRef(*this), sessionID, callbackAggregator, domainsToDeleteAllNonCookieWebsiteDataFor](auto&& origins) {
+ if (!m_webIDBServers.contains(sessionID))
+ return;
- entriesToDelete.append(securityOrigin);
- callbackAggregator->m_domains.add(domain);
- }
-
- webIDBServer(sessionID).closeAndDeleteDatabasesForOrigins(entriesToDelete, [callbackAggregator] { });
- });
- }));
+ auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator->m_domains);
+ webIDBServer(sessionID).closeAndDeleteDatabasesForOrigins(originsToDelete, [callbackAggregator] { });
+ });
}
#endif
@@ -2101,13 +2086,10 @@
#if ENABLE(INDEXED_DATABASE)
auto path = m_idbDatabasePaths.get(sessionID);
if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases)) {
- // FIXME: Pick the right database store based on the session ID.
- postStorageTask(CrossThreadTask([this, callbackAggregator, path = crossThreadCopy(path)]() mutable {
- RunLoop::main().dispatch([callbackAggregator, securityOrigins = indexedDatabaseOrigins(path)] {
- for (const auto& securityOrigin : securityOrigins)
- callbackAggregator->m_websiteData.entries.append({ securityOrigin, WebsiteDataType::IndexedDBDatabases, 0 });
- });
- }));
+ webIDBServer(sessionID).getOrigins([callbackAggregator](auto&& origins) {
+ while (!origins.isEmpty())
+ callbackAggregator->m_websiteData.entries.append({ origins.takeAny(), WebsiteDataType::IndexedDBDatabases, 0 });
+ });
}
#endif
@@ -2425,72 +2407,6 @@
}).iterator->value;
}
-void NetworkProcess::ensurePathExists(const String& path)
-{
- ASSERT(!RunLoop::isMain());
-
- if (!FileSystem::makeAllDirectories(path))
- LOG_ERROR("Failed to make all directories for path '%s'", path.utf8().data());
-}
-
-void NetworkProcess::postStorageTask(CrossThreadTask&& task)
-{
- ASSERT(RunLoop::isMain());
-
- LockHolder locker(m_storageTaskMutex);
-
- m_storageTasks.append(WTFMove(task));
-
- m_storageTaskQueue->dispatch([this] {
- performNextStorageTask();
- });
-}
-
-void NetworkProcess::performNextStorageTask()
-{
- ASSERT(!RunLoop::isMain());
-
- CrossThreadTask task;
- {
- LockHolder locker(m_storageTaskMutex);
- ASSERT(!m_storageTasks.isEmpty());
- task = m_storageTasks.takeFirst();
- }
-
- task.performTask();
-}
-
-void NetworkProcess::collectIndexedDatabaseOriginsForVersion(const String& path, HashSet<WebCore::SecurityOriginData>& securityOrigins)
-{
- if (path.isEmpty())
- return;
-
- for (auto& topOriginPath : FileSystem::listDirectory(path, "*")) {
- auto databaseIdentifier = FileSystem::pathGetFileName(topOriginPath);
- if (auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(databaseIdentifier)) {
- securityOrigins.add(WTFMove(*securityOrigin));
-
- for (auto& originPath : FileSystem::listDirectory(topOriginPath, "*")) {
- databaseIdentifier = FileSystem::pathGetFileName(originPath);
- if (auto securityOrigin = SecurityOriginData::fromDatabaseIdentifier(databaseIdentifier))
- securityOrigins.add(WTFMove(*securityOrigin));
- }
- }
- }
-}
-
-HashSet<WebCore::SecurityOriginData> NetworkProcess::indexedDatabaseOrigins(const String& path)
-{
- if (path.isEmpty())
- return { };
-
- HashSet<WebCore::SecurityOriginData> securityOrigins;
- collectIndexedDatabaseOriginsForVersion(FileSystem::pathByAppendingComponent(path, "v0"), securityOrigins);
- collectIndexedDatabaseOriginsForVersion(FileSystem::pathByAppendingComponent(path, "v1"), securityOrigins);
-
- return securityOrigins;
-}
-
void NetworkProcess::addIndexedDatabaseSession(PAL::SessionID sessionID, String& indexedDatabaseDirectory, SandboxExtension::Handle& handle)
{
// *********
@@ -2499,8 +2415,6 @@
auto addResult = m_idbDatabasePaths.add(sessionID, indexedDatabaseDirectory);
if (addResult.isNewEntry) {
SandboxExtension::consumePermanently(handle);
- if (!indexedDatabaseDirectory.isEmpty())
- postStorageTask(createCrossThreadTask(*this, &NetworkProcess::ensurePathExists, indexedDatabaseDirectory));
setSessionStorageQuotaManagerIDBRootPath(sessionID, indexedDatabaseDirectory);
}
}
@@ -2635,11 +2549,8 @@
processTerminationDelayEnabled
};
auto addResult = m_serviceWorkerInfo.add(sessionID, WTFMove(info));
- if (addResult.isNewEntry) {
+ if (addResult.isNewEntry)
SandboxExtension::consumePermanently(handle);
- if (!addResult.iterator->value.databasePath.isEmpty())
- postStorageTask(createCrossThreadTask(*this, &NetworkProcess::ensurePathExists, addResult.iterator->value.databasePath));
- }
}
#endif // ENABLE(SERVICE_WORKER)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (266741 => 266742)
--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2020-09-08 19:29:26 UTC (rev 266741)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h 2020-09-08 19:37:42 UTC (rev 266742)
@@ -466,8 +466,6 @@
#if ENABLE(INDEXED_DATABASE)
void addIndexedDatabaseSession(PAL::SessionID, String&, SandboxExtension::Handle&);
- void collectIndexedDatabaseOriginsForVersion(const String&, HashSet<WebCore::SecurityOriginData>&);
- HashSet<WebCore::SecurityOriginData> indexedDatabaseOrigins(const String& path);
Ref<WebIDBServer> createWebIDBServer(PAL::SessionID);
void setSessionStorageQuotaManagerIDBRootPath(PAL::SessionID, const String& idbRootPath);
void removeWebIDBServerIfPossible(PAL::SessionID);
@@ -485,11 +483,6 @@
void addServiceWorkerSession(PAL::SessionID, bool processTerminationDelayEnabled, String&& serviceWorkerRegistrationDirectory, const SandboxExtension::Handle&);
#endif
- void postStorageTask(CrossThreadTask&&);
- // For execution on work queue thread only.
- void performNextStorageTask();
- void ensurePathExists(const String& path);
-
class SessionStorageQuotaManager {
WTF_MAKE_FAST_ALLOCATED;
public:
@@ -570,15 +563,10 @@
WebSQLiteDatabaseTracker m_webSQLiteDatabaseTracker;
#endif
- Ref<WorkQueue> m_storageTaskQueue { WorkQueue::create("com.apple.WebKit.StorageTask") };
-
#if ENABLE(INDEXED_DATABASE)
HashMap<PAL::SessionID, String> m_idbDatabasePaths;
HashMap<PAL::SessionID, RefPtr<WebIDBServer>> m_webIDBServers;
#endif
-
- Deque<CrossThreadTask> m_storageTasks;
- Lock m_storageTaskMutex;
#if ENABLE(SERVICE_WORKER)
struct ServiceWorkerInfo {