void IDBServer::performCloseAndDeleteDatabasesModifiedSince(std::chrono::system_clock::time_point modifiedSince, uint64_t callbackID) { if (!m_databaseDirectoryPath.isEmpty()) { Vector<String> originPaths = listDirectory(m_databaseDirectoryPath, "*"); for (auto& originPath : originPaths) removeAllDatabasesForOriginPath(originPath, modifiedSince); } postDatabaseTaskReply(createCrossThreadTask(*this, &IDBServer::didPerformCloseAndDeleteDatabases, callbackID)); }
void IDBServer::performCloseAndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>& origins, uint64_t callbackID) { if (!m_databaseDirectoryPath.isEmpty()) { for (const auto& origin : origins) { String originPath = pathByAppendingComponent(m_databaseDirectoryPath, origin.securityOrigin()->databaseIdentifier()); removeAllDatabasesForOriginPath(originPath, std::chrono::system_clock::time_point::min()); } } postDatabaseTaskReply(createCrossThreadTask(*this, &IDBServer::didPerformCloseAndDeleteDatabases, callbackID)); }
void IDBServer::performGetAllDatabaseNames(uint64_t serverConnectionIdentifier, const SecurityOriginData& mainFrameOrigin, const SecurityOriginData& openingOrigin, uint64_t callbackID) { String directory = IDBDatabaseIdentifier::databaseDirectoryRelativeToRoot(mainFrameOrigin, openingOrigin, m_databaseDirectoryPath); Vector<String> entries = listDirectory(directory, ASCIILiteral("*")); Vector<String> databases; databases.reserveInitialCapacity(entries.size()); for (auto& entry : entries) { String encodedName = lastComponentOfPathIgnoringTrailingSlash(entry); databases.uncheckedAppend(SQLiteIDBBackingStore::databaseNameFromEncodedFilename(encodedName)); } postDatabaseTaskReply(createCrossThreadTask(*this, &IDBServer::didGetAllDatabaseNames, serverConnectionIdentifier, callbackID, databases)); }
void IDBServer::performCloseAndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>& origins, uint64_t callbackID) { if (!m_databaseDirectoryPath.isEmpty()) { for (const auto& origin : origins) { String originPath = FileSystem::pathByAppendingComponent(m_databaseDirectoryPath, origin.databaseIdentifier()); removeAllDatabasesForOriginPath(originPath, -WallTime::infinity()); for (const auto& topOriginPath : FileSystem::listDirectory(m_databaseDirectoryPath, "*")) { originPath = FileSystem::pathByAppendingComponent(topOriginPath, origin.databaseIdentifier()); removeAllDatabasesForOriginPath(originPath, -WallTime::infinity()); } } } postDatabaseTaskReply(createCrossThreadTask(*this, &IDBServer::didPerformCloseAndDeleteDatabases, callbackID)); }
void IDBServer::closeAndDeleteDatabasesModifiedSince(std::chrono::system_clock::time_point modificationTime, std::function<void ()> completionHandler) { uint64_t callbackID = generateDeleteCallbackID(); auto addResult = m_deleteDatabaseCompletionHandlers.add(callbackID, WTFMove(completionHandler)); ASSERT_UNUSED(addResult, addResult.isNewEntry); // If the modification time is in the future, don't both doing anything. if (modificationTime > std::chrono::system_clock::now()) { postDatabaseTaskReply(createCrossThreadTask(*this, &IDBServer::didPerformCloseAndDeleteDatabases, callbackID)); return; } HashSet<UniqueIDBDatabase*> openDatabases; for (auto* connection : m_databaseConnections.values()) openDatabases.add(&connection->database()); for (auto* database : openDatabases) database->immediateCloseForUserDelete(); postDatabaseTask(createCrossThreadTask(*this, &IDBServer::performCloseAndDeleteDatabasesModifiedSince, modificationTime, callbackID)); }
void IDBServer::closeAndDeleteDatabasesModifiedSince(WallTime modificationTime, Function<void ()>&& completionHandler) { uint64_t callbackID = generateDeleteCallbackID(); auto addResult = m_deleteDatabaseCompletionHandlers.add(callbackID, WTFMove(completionHandler)); ASSERT_UNUSED(addResult, addResult.isNewEntry); // If the modification time is in the future, don't both doing anything. if (modificationTime > WallTime::now()) { postDatabaseTaskReply(createCrossThreadTask(*this, &IDBServer::didPerformCloseAndDeleteDatabases, callbackID)); return; } HashSet<UniqueIDBDatabase*> openDatabases; for (auto& database : m_uniqueIDBDatabaseMap.values()) openDatabases.add(database.get()); for (auto& database : openDatabases) database->immediateCloseForUserDelete(); postDatabaseTask(createCrossThreadTask(*this, &IDBServer::performCloseAndDeleteDatabasesModifiedSince, modificationTime, callbackID)); }