Changeset 289474 in webkit
- Timestamp:
- Feb 9, 2022, 8:55:15 AM (5 years ago)
- Location:
- trunk
- Files:
-
- 9 added
- 57 edited
- 1 copied
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Headers.cmake (modified) (1 diff)
-
Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.h (modified) (1 diff)
-
Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h (modified) (1 diff)
-
Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (modified) (7 diffs)
-
Source/WebCore/Modules/indexeddb/server/IDBServer.h (modified) (5 diffs)
-
Source/WebCore/Modules/indexeddb/server/MemoryIDBBackingStore.cpp (modified) (2 diffs)
-
Source/WebCore/Modules/indexeddb/server/MemoryIDBBackingStore.h (modified) (3 diffs)
-
Source/WebCore/Modules/indexeddb/server/MemoryObjectStore.cpp (modified) (2 diffs)
-
Source/WebCore/Modules/indexeddb/server/MemoryObjectStore.h (modified) (3 diffs)
-
Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp (modified) (6 diffs)
-
Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h (modified) (4 diffs)
-
Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (modified) (29 diffs)
-
Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (modified) (4 diffs)
-
Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp (modified) (3 diffs)
-
Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h (modified) (6 diffs)
-
Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseManager.h (added)
-
Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp (modified) (2 diffs)
-
Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h (modified) (2 diffs)
-
Source/WebCore/Modules/indexeddb/shared/IDBError.h (modified) (1 diff)
-
Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h (modified) (1 diff)
-
Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.h (modified) (2 diffs)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (9 diffs)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (modified) (4 diffs)
-
Source/WebKit/NetworkProcess/NetworkProcess.cpp (modified) (15 diffs)
-
Source/WebKit/NetworkProcess/NetworkProcess.h (modified) (6 diffs)
-
Source/WebKit/NetworkProcess/NetworkProcess.messages.in (modified) (1 diff)
-
Source/WebKit/NetworkProcess/NetworkSession.cpp (modified) (3 diffs)
-
Source/WebKit/NetworkProcess/NetworkSession.h (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h (modified) (2 diffs)
-
Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp (modified) (1 diff)
-
Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm (modified) (1 diff)
-
Source/WebKit/NetworkProcess/storage/IDBStorageConnectionToClient.cpp (added)
-
Source/WebKit/NetworkProcess/storage/IDBStorageConnectionToClient.h (added)
-
Source/WebKit/NetworkProcess/storage/IDBStorageManager.cpp (added)
-
Source/WebKit/NetworkProcess/storage/IDBStorageManager.h (added)
-
Source/WebKit/NetworkProcess/storage/IDBStorageRegistry.cpp (added)
-
Source/WebKit/NetworkProcess/storage/IDBStorageRegistry.h (copied) (copied from trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h ) (1 diff)
-
Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp (modified) (12 diffs)
-
Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h (modified) (7 diffs)
-
Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in (modified) (1 diff)
-
Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp (modified) (18 diffs)
-
Source/WebKit/NetworkProcess/storage/OriginStorageManager.h (modified) (6 diffs)
-
Source/WebKit/NetworkProcess/storage/QuotaManager.cpp (added)
-
Source/WebKit/NetworkProcess/storage/QuotaManager.h (added)
-
Source/WebKit/Scripts/webkit/messages.py (modified) (1 diff)
-
Source/WebKit/Shared/WebsiteData/QuotaIncreaseRequestIdentifier.h (added)
-
Source/WebKit/Shared/WebsiteDataStoreParameters.h (modified) (1 diff)
-
Source/WebKit/Sources.txt (modified) (1 diff)
-
Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (modified) (2 diffs)
-
Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in (modified) (1 diff)
-
Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h (modified) (1 diff)
-
Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp (modified) (1 diff)
-
Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h (modified) (2 diffs)
-
Source/WebKit/WebKit.xcodeproj/project.pbxproj (modified) (7 diffs)
-
Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp (modified) (2 diffs)
-
Source/WebKitLegacy/ChangeLog (modified) (1 diff)
-
Source/WebKitLegacy/Storage/InProcessIDBServer.cpp (modified) (2 diffs)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBFileName.mm (modified) (3 diffs)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBPersistence.mm (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBSuspendImminently.mm (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/StoreBlobThenDelete.mm (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r289471 r289474 1 2022-02-09 Sihui Liu <sihui_liu@apple.com> 2 3 Manage IndexedDB storage by origin 4 https://bugs.webkit.org/show_bug.cgi?id=234925 5 <rdar://problem/87555014> 6 7 Reviewed by Chris Dumez. 8 9 Both WebKit and WebKitLegacy used IDBServer to manage UniqueIDBDatabases, and UniqueIDBDatabase pointed to 10 IDBServer. Now that WebKit uses WebKit::IDBStorageManager to manage UniqueIDBDatabases. We untie the 11 knot between IDBServer and UniqueIDBDatabase by adding a new abstract class UniqueIDBDatabaseManager and make 12 UniqueIDBDatabase point to UniqueIDBDatabaseManager. 13 14 Also, as quota check is no longer async according to changes in WebKit, we need to update operations in 15 UniqueIDBDatabase to adopt the change. 16 17 Covered by existing tests. 18 19 * Headers.cmake: 20 * Modules/indexeddb/IDBDatabaseIdentifier.h: 21 * Modules/indexeddb/server/IDBConnectionToClient.h: 22 * Modules/indexeddb/server/IDBServer.cpp: 23 (WebCore::IDBServer::IDBServer::registerConnection): 24 (WebCore::IDBServer::IDBServer::unregisterConnection): 25 (WebCore::IDBServer::IDBServer::createBackingStore): 26 (WebCore::IDBServer::IDBServer::upgradedDatabaseDirectory): 27 (WebCore::IDBServer::IDBServer::registerDatabaseConnection): Deleted. 28 (WebCore::IDBServer::IDBServer::unregisterDatabaseConnection): Deleted. 29 (WebCore::IDBServer::IDBServer::closeAndTakeUniqueIDBDatabase): Deleted. 30 * Modules/indexeddb/server/IDBServer.h: 31 * Modules/indexeddb/server/MemoryIDBBackingStore.cpp: 32 (WebCore::IDBServer::MemoryIDBBackingStore::MemoryIDBBackingStore): 33 (WebCore::IDBServer::MemoryIDBBackingStore::createObjectStore): 34 * Modules/indexeddb/server/MemoryIDBBackingStore.h: 35 * Modules/indexeddb/server/MemoryObjectStore.cpp: 36 (WebCore::IDBServer::MemoryObjectStore::create): 37 (WebCore::IDBServer::MemoryObjectStore::MemoryObjectStore): 38 * Modules/indexeddb/server/MemoryObjectStore.h: 39 * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp: 40 (WebCore::IDBServer::SQLiteIDBBackingStore::SQLiteIDBBackingStore): 41 (WebCore::IDBServer::SQLiteIDBBackingStore::encodeDatabaseName): 42 (WebCore::IDBServer::SQLiteIDBBackingStore::decodeDatabaseName): 43 (WebCore::IDBServer::SQLiteIDBBackingStore::getOrEstablishDatabaseInfo): 44 (WebCore::IDBServer::SQLiteIDBBackingStore::deleteBackingStore): 45 (WebCore::IDBServer::SQLiteIDBBackingStore::filenameForDatabaseName const): Deleted. 46 (WebCore::IDBServer::SQLiteIDBBackingStore::fullDatabaseDirectoryWithUpgrade): Deleted. 47 * Modules/indexeddb/server/SQLiteIDBBackingStore.h: 48 * Modules/indexeddb/server/UniqueIDBDatabase.cpp: 49 (WebCore::IDBServer::UniqueIDBDatabase::UniqueIDBDatabase): 50 (WebCore::IDBServer::UniqueIDBDatabase::manager): 51 (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperation): 52 (WebCore::IDBServer::UniqueIDBDatabase::performCurrentOpenOperationAfterSpaceCheck): 53 (WebCore::IDBServer::UniqueIDBDatabase::deleteBackingStore): 54 (WebCore::IDBServer::UniqueIDBDatabase::createObjectStore): 55 (WebCore::IDBServer::UniqueIDBDatabase::deleteObjectStore): 56 (WebCore::IDBServer::UniqueIDBDatabase::renameObjectStore): 57 (WebCore::IDBServer::UniqueIDBDatabase::clearObjectStore): 58 (WebCore::IDBServer::UniqueIDBDatabase::createIndex): 59 (WebCore::IDBServer::UniqueIDBDatabase::deleteIndex): 60 (WebCore::IDBServer::UniqueIDBDatabase::renameIndex): 61 (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd): 62 (WebCore::IDBServer::UniqueIDBDatabase::putOrAddAfterSpaceCheck): 63 (WebCore::IDBServer::UniqueIDBDatabase::getRecord): 64 (WebCore::IDBServer::UniqueIDBDatabase::getAllRecords): 65 (WebCore::IDBServer::UniqueIDBDatabase::getCount): 66 (WebCore::IDBServer::UniqueIDBDatabase::deleteRecord): 67 (WebCore::IDBServer::UniqueIDBDatabase::openCursor): 68 (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor): 69 (WebCore::IDBServer::UniqueIDBDatabase::commitTransaction): 70 (WebCore::IDBServer::UniqueIDBDatabase::abortTransaction): 71 (WebCore::IDBServer::UniqueIDBDatabase::hasDataInMemory const): 72 * Modules/indexeddb/server/UniqueIDBDatabase.h: 73 (WebCore::IDBServer::UniqueIDBDatabase::server): Deleted. 74 * Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp: 75 (WebCore::IDBServer::UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection): 76 (WebCore::IDBServer::UniqueIDBDatabaseConnection::~UniqueIDBDatabaseConnection): 77 (WebCore::IDBServer::UniqueIDBDatabaseConnection::manager): 78 * Modules/indexeddb/server/UniqueIDBDatabaseConnection.h: 79 (WebCore::IDBServer::UniqueIDBDatabaseConnection::server): Deleted. 80 * Modules/indexeddb/server/UniqueIDBDatabaseManager.h: Added. 81 (WebCore::IDBServer::UniqueIDBDatabaseManager::~UniqueIDBDatabaseManager): 82 * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp: 83 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::UniqueIDBDatabaseTransaction): 84 (WebCore::IDBServer::UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction): 85 * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h: 86 * Modules/indexeddb/shared/IDBError.h: 87 (WebCore::IDBError::operator bool const): 88 * Modules/indexeddb/shared/IDBRequestData.h: 89 * Modules/indexeddb/shared/IDBResourceIdentifier.h: 90 (WebCore::IDBResourceIdentifier::operator!= const): 91 * WebCore.xcodeproj/project.pbxproj: 92 1 93 2022-02-09 Alan Bujtas <zalan@apple.com> 2 94 -
trunk/Source/WebCore/Headers.cmake
r289247 r289474 225 225 Modules/indexeddb/server/IDBConnectionToClientDelegate.h 226 226 Modules/indexeddb/server/IDBServer.h 227 Modules/indexeddb/server/IndexValueEntry.h 228 Modules/indexeddb/server/IndexValueStore.h 229 Modules/indexeddb/server/MemoryBackingStoreTransaction.h 227 230 Modules/indexeddb/server/MemoryIDBBackingStore.h 228 231 Modules/indexeddb/server/SQLiteIDBBackingStore.h 232 Modules/indexeddb/server/SQLiteIDBTransaction.h 229 233 Modules/indexeddb/server/ServerOpenDBRequest.h 230 234 Modules/indexeddb/server/UniqueIDBDatabase.h 231 235 Modules/indexeddb/server/UniqueIDBDatabaseConnection.h 236 Modules/indexeddb/server/UniqueIDBDatabaseManager.h 232 237 Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h 233 238 -
trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.h
r289247 r289474 71 71 72 72 String databaseDirectoryRelativeToRoot(const String& rootDirectory, const String& versionString="v1") const; 73 static String databaseDirectoryRelativeToRoot(const SecurityOriginData& topLevelOrigin, const SecurityOriginData& openingOrigin, const String& rootDirectory, const String& versionString);73 WEBCORE_EXPORT static String databaseDirectoryRelativeToRoot(const SecurityOriginData& topLevelOrigin, const SecurityOriginData& openingOrigin, const String& rootDirectory, const String& versionString); 74 74 75 75 template<class Encoder> void encode(Encoder&) const; -
trunk/Source/WebCore/Modules/indexeddb/server/IDBConnectionToClient.h
r275151 r289474 75 75 void notifyOpenDBRequestBlocked(const IDBResourceIdentifier& requestIdentifier, uint64_t oldVersion, uint64_t newVersion); 76 76 77 void didGetAllDatabaseNamesAndVersions(const IDBResourceIdentifier&, Vector<IDBDatabaseNameAndVersion>&&);77 WEBCORE_EXPORT void didGetAllDatabaseNamesAndVersions(const IDBResourceIdentifier&, Vector<IDBDatabaseNameAndVersion>&&); 78 78 79 79 void registerDatabaseConnection(UniqueIDBDatabaseConnection&); 80 80 void unregisterDatabaseConnection(UniqueIDBDatabaseConnection&); 81 void connectionToClientClosed();81 WEBCORE_EXPORT void connectionToClientClosed(); 82 82 bool isClosed() { return m_isClosed; } 83 83 void clearDelegate() { m_delegate = nullptr; } -
trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp
r288078 r289474 102 102 } 103 103 104 void IDBServer::register DatabaseConnection(UniqueIDBDatabaseConnection& connection)104 void IDBServer::registerConnection(UniqueIDBDatabaseConnection& connection) 105 105 { 106 106 ASSERT(!m_databaseConnections.contains(connection.identifier())); … … 108 108 } 109 109 110 void IDBServer::unregister DatabaseConnection(UniqueIDBDatabaseConnection& connection)110 void IDBServer::unregisterConnection(UniqueIDBDatabaseConnection& connection) 111 111 { 112 112 ASSERT(m_databaseConnections.contains(connection.identifier())); … … 129 129 ASSERT(!isMainThread()); 130 130 if (m_databaseDirectoryPath.isEmpty()) 131 return makeUnique<MemoryIDBBackingStore>( m_sessionID,identifier);131 return makeUnique<MemoryIDBBackingStore>(identifier); 132 132 133 133 ASSERT(!m_sessionID.isEphemeral()); 134 134 if (identifier.isTransient()) 135 return makeUnique<MemoryIDBBackingStore>( m_sessionID,identifier);136 137 return makeUnique<SQLiteIDBBackingStore>( m_sessionID, identifier, m_databaseDirectoryPath);135 return makeUnique<MemoryIDBBackingStore>(identifier); 136 137 return makeUnique<SQLiteIDBBackingStore>(identifier, upgradedDatabaseDirectory(identifier)); 138 138 } 139 139 … … 176 176 if (database->tryClose()) 177 177 m_uniqueIDBDatabaseMap.remove(database->identifier()); 178 }179 180 std::unique_ptr<UniqueIDBDatabase> IDBServer::closeAndTakeUniqueIDBDatabase(UniqueIDBDatabase& database)181 {182 LOG(IndexedDB, "IDBServer::closeUniqueIDBDatabase");183 ASSERT(isMainThread());184 185 auto uniquePointer = m_uniqueIDBDatabaseMap.take(database.identifier());186 ASSERT(uniquePointer);187 188 return uniquePointer;189 178 } 190 179 … … 751 740 } 752 741 753 StorageQuotaManager::Decision IDBServer::requestSpace(const ClientOrigin& origin, uint64_t taskSize) WTF_IGNORES_THREAD_SAFETY_ANALYSIS742 void IDBServer::requestSpace(const ClientOrigin& origin, uint64_t taskSize, CompletionHandler<void(bool)>&& completionHandler) WTF_IGNORES_THREAD_SAFETY_ANALYSIS 754 743 { 755 744 ASSERT(!isMainThread()); … … 763 752 m_lock.lock(); 764 753 765 return result;754 completionHandler(result == StorageQuotaManager::Decision::Grant); 766 755 } 767 756 … … 783 772 if (!FileSystem::fileExists(newVersionDirectory)) 784 773 FileSystem::makeAllDirectories(newVersionDirectory); 774 } 775 776 String IDBServer::upgradedDatabaseDirectory(const WebCore::IDBDatabaseIdentifier& identifier) 777 { 778 String oldOriginDirectory = identifier.databaseDirectoryRelativeToRoot(m_databaseDirectoryPath, "v0"); 779 String oldDatabaseDirectory = FileSystem::pathByAppendingComponent(oldOriginDirectory, SQLiteIDBBackingStore::encodeDatabaseName(identifier.databaseName())); 780 String newOriginDirectory = identifier.databaseDirectoryRelativeToRoot(m_databaseDirectoryPath, "v1"); 781 String fileNameHash = SQLiteFileSystem::computeHashForFileName(identifier.databaseName()); 782 String newDatabaseDirectory = FileSystem::pathByAppendingComponent(newOriginDirectory, fileNameHash); 783 FileSystem::makeAllDirectories(newDatabaseDirectory); 784 785 if (FileSystem::fileExists(oldDatabaseDirectory)) { 786 FileSystem::moveFile(oldDatabaseDirectory, newDatabaseDirectory); 787 FileSystem::deleteEmptyDirectory(oldOriginDirectory); 788 } 789 790 return newDatabaseDirectory; 785 791 } 786 792 -
trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h
r280053 r289474 31 31 #include "UniqueIDBDatabase.h" 32 32 #include "UniqueIDBDatabaseConnection.h" 33 #include "UniqueIDBDatabaseManager.h" 33 34 #include <pal/HysteresisActivity.h> 34 35 #include <pal/SessionID.h> … … 49 50 namespace IDBServer { 50 51 51 class IDBServer { 52 WTF_MAKE_FAST_ALLOCATED; 52 class IDBServer : public UniqueIDBDatabaseManager { 53 53 public: 54 54 using StorageQuotaManagerSpaceRequester = Function<StorageQuotaManager::Decision(const ClientOrigin&, uint64_t spaceRequested)>; … … 89 89 WEBCORE_EXPORT void getAllDatabaseNamesAndVersions(IDBConnectionIdentifier, const IDBResourceIdentifier&, const ClientOrigin&); 90 90 91 92 void registerDatabaseConnection(UniqueIDBDatabaseConnection&); 93 void unregisterDatabaseConnection(UniqueIDBDatabaseConnection&); 94 void registerTransaction(UniqueIDBDatabaseTransaction&); 95 void unregisterTransaction(UniqueIDBDatabaseTransaction&); 96 97 std::unique_ptr<UniqueIDBDatabase> closeAndTakeUniqueIDBDatabase(UniqueIDBDatabase&); 98 99 std::unique_ptr<IDBBackingStore> createBackingStore(const IDBDatabaseIdentifier&); 91 // UniqueIDBDatabaseManager 92 void registerConnection(UniqueIDBDatabaseConnection&) final; 93 void unregisterConnection(UniqueIDBDatabaseConnection&) final; 94 void registerTransaction(UniqueIDBDatabaseTransaction&) final; 95 void unregisterTransaction(UniqueIDBDatabaseTransaction&) final; 96 std::unique_ptr<IDBBackingStore> createBackingStore(const IDBDatabaseIdentifier&) final; 97 void requestSpace(const ClientOrigin&, uint64_t size, CompletionHandler<void(bool)>&&) final; 100 98 101 99 WEBCORE_EXPORT HashSet<SecurityOriginData> getOrigins() const; … … 105 103 WEBCORE_EXPORT void renameOrigin(const WebCore::SecurityOriginData&, const WebCore::SecurityOriginData&); 106 104 107 StorageQuotaManager::Decision requestSpace(const ClientOrigin&, uint64_t taskSize);108 105 WEBCORE_EXPORT static uint64_t diskUsage(const String& rootDirectory, const ClientOrigin&); 109 106 … … 115 112 116 113 void upgradeFilesIfNecessary(); 114 String upgradedDatabaseDirectory(const WebCore::IDBDatabaseIdentifier&); 117 115 void removeDatabasesModifiedSinceForVersion(WallTime, const String&); 118 116 void removeDatabasesWithOriginsForVersion(const Vector<SecurityOriginData>&, const String&); -
trunk/Source/WebCore/Modules/indexeddb/server/MemoryIDBBackingStore.cpp
r279956 r289474 45 45 constexpr uint64_t maxGeneratedKeyValue = 0x20000000000000; 46 46 47 MemoryIDBBackingStore::MemoryIDBBackingStore( PAL::SessionID sessionID,const IDBDatabaseIdentifier& identifier)47 MemoryIDBBackingStore::MemoryIDBBackingStore(const IDBDatabaseIdentifier& identifier) 48 48 : m_identifier(identifier) 49 , m_sessionID(sessionID)50 49 { 51 50 } … … 135 134 136 135 ASSERT(!m_objectStoresByIdentifier.contains(info.identifier())); 137 auto objectStore = MemoryObjectStore::create( m_sessionID,info);136 auto objectStore = MemoryObjectStore::create(info); 138 137 139 138 m_databaseInfo->addExistingObjectStore(info); -
trunk/Source/WebCore/Modules/indexeddb/server/MemoryIDBBackingStore.h
r280410 r289474 31 31 #include "IndexKey.h" 32 32 #include "MemoryBackingStoreTransaction.h" 33 #include <pal/SessionID.h>34 33 #include <wtf/HashMap.h> 35 34 … … 42 41 WTF_MAKE_FAST_ALLOCATED; 43 42 public: 44 MemoryIDBBackingStore(PAL::SessionID,const IDBDatabaseIdentifier&);45 ~MemoryIDBBackingStore();43 WEBCORE_EXPORT explicit MemoryIDBBackingStore(const IDBDatabaseIdentifier&); 44 WEBCORE_EXPORT ~MemoryIDBBackingStore(); 46 45 47 46 IDBError getOrEstablishDatabaseInfo(IDBDatabaseInfo&) final; … … 93 92 94 93 IDBDatabaseIdentifier m_identifier; 95 PAL::SessionID m_sessionID;96 94 std::unique_ptr<IDBDatabaseInfo> m_databaseInfo; 97 95 -
trunk/Source/WebCore/Modules/indexeddb/server/MemoryObjectStore.cpp
r289128 r289474 39 39 #include <JavaScriptCore/JSCJSValueInlines.h> 40 40 #include <JavaScriptCore/JSLock.h> 41 #include <pal/SessionID.h>42 41 43 42 namespace WebCore { … … 45 44 namespace IDBServer { 46 45 47 Ref<MemoryObjectStore> MemoryObjectStore::create( PAL::SessionID sessionID,const IDBObjectStoreInfo& info)48 { 49 return adoptRef(*new MemoryObjectStore( sessionID,info));50 } 51 52 MemoryObjectStore::MemoryObjectStore( PAL::SessionID,const IDBObjectStoreInfo& info)46 Ref<MemoryObjectStore> MemoryObjectStore::create(const IDBObjectStoreInfo& info) 47 { 48 return adoptRef(*new MemoryObjectStore(info)); 49 } 50 51 MemoryObjectStore::MemoryObjectStore(const IDBObjectStoreInfo& info) 53 52 : m_info(info) 54 53 { -
trunk/Source/WebCore/Modules/indexeddb/server/MemoryObjectStore.h
r278393 r289474 35 35 #include <wtf/RefCounted.h> 36 36 37 namespace PAL {38 class SessionID;39 }40 41 37 namespace WebCore { 42 38 … … 62 58 class MemoryObjectStore : public RefCounted<MemoryObjectStore> { 63 59 public: 64 static Ref<MemoryObjectStore> create( PAL::SessionID,const IDBObjectStoreInfo&);60 static Ref<MemoryObjectStore> create(const IDBObjectStoreInfo&); 65 61 66 62 ~MemoryObjectStore(); … … 109 105 110 106 private: 111 MemoryObjectStore( PAL::SessionID,const IDBObjectStoreInfo&);107 MemoryObjectStore(const IDBObjectStoreInfo&); 112 108 113 109 IDBKeyDataSet::iterator lowestIteratorInRange(const IDBKeyRangeData&, bool reverse) const; -
trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp
r289128 r289474 237 237 } 238 238 239 SQLiteIDBBackingStore::SQLiteIDBBackingStore(PAL::SessionID sessionID, const IDBDatabaseIdentifier& identifier, const String& databaseRootDirectory) 240 : m_sessionID(sessionID) 241 , m_identifier(identifier) 242 , m_databaseRootDirectory(databaseRootDirectory) 243 { 244 m_databaseDirectory = fullDatabaseDirectoryWithUpgrade(); 239 SQLiteIDBBackingStore::SQLiteIDBBackingStore(const IDBDatabaseIdentifier& identifier, const String& databaseDirectory) 240 : m_identifier(identifier) 241 , m_databaseDirectory(databaseDirectory) 242 { 245 243 } 246 244 … … 913 911 } 914 912 915 String SQLiteIDBBackingStore::filenameForDatabaseName() const 916 { 917 ASSERT(!m_identifier.databaseName().isNull()); 918 919 if (m_identifier.databaseName().isEmpty()) 913 String SQLiteIDBBackingStore::encodeDatabaseName(const String& databaseName) 914 { 915 ASSERT(!databaseName.isEmpty()); 916 if (databaseName.isEmpty()) 920 917 return "%00"; 921 918 922 String filename = FileSystem::encodeForFileName( m_identifier.databaseName());923 filename.replace ('.', "%2E");919 String filename = FileSystem::encodeForFileName(databaseName); 920 filename.replaceWithLiteral('.', "%2E"); 924 921 925 922 return filename; 923 } 924 925 String SQLiteIDBBackingStore::decodeDatabaseName(const String& encodedName) 926 { 927 if (encodedName == "%00"_s) 928 return emptyString(); 929 930 String name = encodedName; 931 name.replace("%2E"_s, "."_s); 932 933 return FileSystem::decodeFromFilename(name); 926 934 } 927 935 … … 966 974 } 967 975 968 String SQLiteIDBBackingStore::fullDatabaseDirectoryWithUpgrade()969 {970 String oldOriginDirectory = m_identifier.databaseDirectoryRelativeToRoot(m_databaseRootDirectory, "v0");971 String oldDatabaseDirectory = FileSystem::pathByAppendingComponent(oldOriginDirectory, filenameForDatabaseName());972 String newOriginDirectory = m_identifier.databaseDirectoryRelativeToRoot(m_databaseRootDirectory, "v1");973 String fileNameHash = SQLiteFileSystem::computeHashForFileName(m_identifier.databaseName());974 String newDatabaseDirectory = FileSystem::pathByAppendingComponent(newOriginDirectory, fileNameHash);975 FileSystem::makeAllDirectories(newDatabaseDirectory);976 977 if (FileSystem::fileExists(oldDatabaseDirectory)) {978 FileSystem::moveFile(oldDatabaseDirectory, newDatabaseDirectory);979 FileSystem::deleteEmptyDirectory(oldOriginDirectory);980 }981 982 return newDatabaseDirectory;983 }984 985 976 IDBError SQLiteIDBBackingStore::getOrEstablishDatabaseInfo(IDBDatabaseInfo& info) 986 977 { … … 992 983 } 993 984 994 String d bFilename= fullDatabasePath();995 985 String databasePath = fullDatabasePath(); 986 FileSystem::makeAllDirectories(FileSystem::parentPath(databasePath)); 996 987 m_sqliteDB = makeUnique<SQLiteDatabase>(); 997 if (!m_sqliteDB->open(d bFilename)) {998 LOG_ERROR("Failed to open SQLite database at path '%s'", d bFilename.utf8().data());988 if (!m_sqliteDB->open(databasePath)) { 989 LOG_ERROR("Failed to open SQLite database at path '%s'", databasePath.utf8().data()); 999 990 closeSQLiteDB(); 1000 991 } … … 1045 1036 1046 1037 if (!databaseInfo) { 1047 LOG_ERROR("Unable to establish IDB database at path '%s'", d bFilename.utf8().data());1038 LOG_ERROR("Unable to establish IDB database at path '%s'", databasePath.utf8().data()); 1048 1039 closeSQLiteDB(); 1049 1040 return IDBError { UnknownError, "Unable to establish IDB database file"_s }; … … 2799 2790 SQLiteFileSystem::deleteDatabaseFile(databasePath); 2800 2791 SQLiteFileSystem::deleteEmptyDatabaseDirectory(m_databaseDirectory); 2801 SQLiteFileSystem::deleteEmptyDatabaseDirectory(m_identifier.databaseDirectoryRelativeToRoot(m_databaseRootDirectory));2802 2792 } 2803 2793 -
trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h
r280410 r289474 52 52 WTF_MAKE_FAST_ALLOCATED; 53 53 public: 54 SQLiteIDBBackingStore(PAL::SessionID, const IDBDatabaseIdentifier&, const String& databaseRootDirectory); 55 56 ~SQLiteIDBBackingStore() final; 54 WEBCORE_EXPORT SQLiteIDBBackingStore(const IDBDatabaseIdentifier&, const String& databaseDirectory); 55 WEBCORE_EXPORT ~SQLiteIDBBackingStore() final; 57 56 58 57 IDBError getOrEstablishDatabaseInfo(IDBDatabaseInfo&) final; … … 95 94 IDBError getBlobRecordsForObjectStoreRecord(int64_t objectStoreRecord, Vector<String>& blobURLs, Vector<String>& blobFilePaths); 96 95 97 static uint64_t databasesSizeForDirectory(const String& directory); 98 96 WEBCORE_EXPORT static uint64_t databasesSizeForDirectory(const String& directory); 99 97 String databaseDirectory() const { return m_databaseDirectory; }; 100 static String fullDatabasePathForDirectory(const String&); 101 static std::optional<IDBDatabaseNameAndVersion> databaseNameAndVersionFromFile(const String&); 102 103 PAL::SessionID sessionID() const { return m_sessionID; } 98 WEBCORE_EXPORT static String fullDatabasePathForDirectory(const String&); 99 WEBCORE_EXPORT static String encodeDatabaseName(const String& databaseName); 100 WEBCORE_EXPORT static String decodeDatabaseName(const String& encodedDatabaseName); 101 102 WEBCORE_EXPORT static std::optional<IDBDatabaseNameAndVersion> databaseNameAndVersionFromFile(const String&); 104 103 105 104 private: 106 String filenameForDatabaseName() const;107 String fullDatabaseDirectoryWithUpgrade();108 109 105 IDBError ensureValidRecordsTable(); 110 106 IDBError ensureValidIndexRecordsTable(); … … 207 203 std::unique_ptr<SQLiteStatement> m_cachedStatements[static_cast<int>(SQL::Invalid)]; 208 204 209 PAL::SessionID m_sessionID;210 205 IDBDatabaseIdentifier m_identifier; 211 206 std::unique_ptr<IDBDatabaseInfo> m_databaseInfo; … … 217 212 HashMap<IDBResourceIdentifier, SQLiteIDBCursor*> m_cursors; 218 213 219 String m_databaseRootDirectory;220 214 String m_databaseDirectory; 221 215 }; -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp
r284857 r289474 43 43 #include "StorageQuotaManager.h" 44 44 #include "UniqueIDBDatabaseConnection.h" 45 #include "UniqueIDBDatabaseManager.h" 45 46 #include <wtf/Scope.h> 46 47 … … 135 136 } 136 137 137 UniqueIDBDatabase::UniqueIDBDatabase( IDBServer& server, const IDBDatabaseIdentifier& identifier)138 : m_ server(server)138 UniqueIDBDatabase::UniqueIDBDatabase(UniqueIDBDatabaseManager& manager, const IDBDatabaseIdentifier& identifier) 139 : m_manager(manager) 139 140 , m_identifier(identifier) 140 141 { … … 164 165 } 165 166 167 UniqueIDBDatabaseManager* UniqueIDBDatabase::manager() 168 { 169 return m_manager.get(); 170 } 171 166 172 void UniqueIDBDatabase::openDatabaseConnection(IDBConnectionToClient& connection, const IDBRequestData& requestData) 167 173 { … … 186 192 ASSERT(m_currentOpenDBRequest->isOpenRequest()); 187 193 194 // We don't need to create the file so no need to do space check. 195 if (m_backingStore) 196 return performCurrentOpenOperationAfterSpaceCheck(true); 197 198 if (!m_manager) 199 return performCurrentOpenOperationAfterSpaceCheck(false); 200 201 auto requestIdentifier = m_currentOpenDBRequest->requestData().requestIdentifier(); 202 if (m_openDBRequestsForSpaceCheck.contains(requestIdentifier)) 203 return; 204 205 m_openDBRequestsForSpaceCheck.add(requestIdentifier); 206 m_manager->requestSpace(m_identifier.origin(), defaultWriteOperationCost, [this, weakThis = WeakPtr { *this }, requestIdentifier](bool granted) mutable { 207 if (!weakThis) 208 return; 209 210 m_openDBRequestsForSpaceCheck.remove(requestIdentifier); 211 if (m_currentOpenDBRequest->requestData().requestIdentifier() != requestIdentifier) 212 return; 213 214 performCurrentOpenOperationAfterSpaceCheck(granted); 215 }); 216 } 217 218 void UniqueIDBDatabase::performCurrentOpenOperationAfterSpaceCheck(bool isGranted) 219 { 220 LOG(IndexedDB, "UniqueIDBDatabase::performCurrentOpenOperationAfterSpaceRequest (%p)", this); 221 188 222 IDBError backingStoreOpenError; 189 223 if (!m_backingStore) { 190 // Quota check.191 auto decision = m_server.requestSpace(m_identifier.origin(), defaultWriteOperationCost);192 if (decision == StorageQuotaManager::Decision::Deny)224 if (!m_manager) 225 backingStoreOpenError = IDBError { InvalidStateError }; 226 else if (!isGranted) 193 227 backingStoreOpenError = IDBError { QuotaExceededError, quotaErrorMessageName("OpenBackingStore") }; 194 228 else { 195 m_backingStore = m_ server.createBackingStore(m_identifier);229 m_backingStore = m_manager->createBackingStore(m_identifier); 196 230 IDBDatabaseInfo databaseInfo; 197 231 backingStoreOpenError = m_backingStore->getOrEstablishDatabaseInfo(databaseInfo); 198 if ( backingStoreOpenError.isNull())232 if (!backingStoreOpenError) 199 233 m_databaseInfo = makeUnique<IDBDatabaseInfo>(databaseInfo); 200 234 else { … … 205 239 } 206 240 207 if ( !backingStoreOpenError.isNull()) {241 if (backingStoreOpenError) { 208 242 auto result = IDBResultData::error(m_currentOpenDBRequest->requestData().requestIdentifier(), backingStoreOpenError); 209 243 m_currentOpenDBRequest->connection().didOpenDatabase(result); … … 295 329 LOG(IndexedDB, "UniqueIDBDatabase::deleteBackingStore"); 296 330 297 auto backingStore = m_backingStore ? std::exchange(m_backingStore, nullptr) : m_ server.createBackingStore(m_identifier);331 auto backingStore = m_backingStore ? std::exchange(m_backingStore, nullptr) : m_manager->createBackingStore(m_identifier); 298 332 uint64_t deletedVersion = backingStore->databaseVersion(); 299 333 backingStore->deleteBackingStore(); … … 543 577 } 544 578 545 void UniqueIDBDatabase::createObjectStore(UniqueIDBDatabaseTransaction& transaction, const IDBObjectStoreInfo& info, ErrorCallback callback )579 void UniqueIDBDatabase::createObjectStore(UniqueIDBDatabaseTransaction& transaction, const IDBObjectStoreInfo& info, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 546 580 { 547 581 ASSERT(!isMainThread()); 548 582 LOG(IndexedDB, "UniqueIDBDatabase::createObjectStore"); 549 583 550 ASSERT(m_backingStore); 551 552 // Quota check. 553 auto taskSize = defaultWriteOperationCost + estimateSize(info); 554 if (m_server.requestSpace(m_identifier.origin(), taskSize) == StorageQuotaManager::Decision::Deny) { 584 if (spaceCheckResult == SpaceCheckResult::Unknown) { 585 if (!m_manager) 586 return callback(IDBError { InvalidStateError }); 587 588 auto taskSize = defaultWriteOperationCost + estimateSize(info); 589 m_manager->requestSpace(m_identifier.origin(), taskSize, [this, weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, info, callback = WTFMove(callback)](bool granted) mutable { 590 if (!weakThis || !weakTransaction) 591 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }); 592 createObjectStore(*weakTransaction, info, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 593 }); 594 return; 595 } 596 597 if (spaceCheckResult != SpaceCheckResult::Pass) { 555 598 callback(IDBError { QuotaExceededError, quotaErrorMessageName("CreateObjectStore") }); 556 599 return; 557 600 } 601 602 if (!m_backingStore) 603 return callback(IDBError { InvalidStateError, "Backing store has closed" }); 558 604 559 605 auto error = m_backingStore->createObjectStore(transaction.info().identifier(), info); … … 564 610 } 565 611 566 void UniqueIDBDatabase::deleteObjectStore(UniqueIDBDatabaseTransaction& transaction, const String& objectStoreName, ErrorCallback callback )612 void UniqueIDBDatabase::deleteObjectStore(UniqueIDBDatabaseTransaction& transaction, const String& objectStoreName, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 567 613 { 568 614 ASSERT(!isMainThread()); 569 615 LOG(IndexedDB, "UniqueIDBDatabase::deleteObjectStore"); 570 616 617 if (spaceCheckResult == SpaceCheckResult::Unknown) { 618 if (!m_manager) 619 return callback(IDBError { InvalidStateError }); 620 621 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, objectStoreName, callback = WTFMove(callback)](bool granted) mutable { 622 if (!weakThis || !weakTransaction) 623 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }); 624 625 deleteObjectStore(*weakTransaction, objectStoreName, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 626 }); 627 return; 628 } 629 630 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 571 631 auto* info = m_databaseInfo->infoForExistingObjectStore(objectStoreName); 572 632 if (!info) { … … 575 635 } 576 636 577 ASSERT(m_backingStore); 637 if (!m_backingStore) 638 return callback(IDBError { InvalidStateError, "Backing store is closed" }); 639 578 640 auto error = m_backingStore->deleteObjectStore(transaction.info().identifier(), info->identifier()); 579 641 if (error.isNull()) … … 583 645 } 584 646 585 void UniqueIDBDatabase::renameObjectStore(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, const String& newName, ErrorCallback callback )647 void UniqueIDBDatabase::renameObjectStore(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, const String& newName, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 586 648 { 587 649 ASSERT(!isMainThread()); 588 650 LOG(IndexedDB, "UniqueIDBDatabase::renameObjectStore"); 589 651 590 // Quota check. 591 auto taskSize = defaultWriteOperationCost + newName.sizeInBytes(); 592 if (m_server.requestSpace(m_identifier.origin(), taskSize) == StorageQuotaManager::Decision::Deny) { 652 if (spaceCheckResult == SpaceCheckResult::Unknown) { 653 if (!m_manager) 654 return callback(IDBError { InvalidStateError }); 655 656 auto taskSize = defaultWriteOperationCost + newName.sizeInBytes(); 657 m_manager->requestSpace(m_identifier.origin(), taskSize, [this, weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, objectStoreIdentifier, newName, callback = WTFMove(callback)](bool granted) mutable { 658 if (!weakThis || !weakTransaction) 659 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }); 660 661 renameObjectStore(*weakTransaction, objectStoreIdentifier, newName, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 662 }); 663 return; 664 } 665 666 if (spaceCheckResult != SpaceCheckResult::Pass) { 593 667 callback(IDBError(QuotaExceededError, quotaErrorMessageName("RenameObjectStore"))); 594 668 return; … … 601 675 } 602 676 603 ASSERT(m_backingStore); 677 if (!m_backingStore) 678 return callback(IDBError { InvalidStateError, "Backing store is closed" }); 679 604 680 auto error = m_backingStore->renameObjectStore(transaction.info().identifier(), objectStoreIdentifier, newName); 605 681 if (error.isNull()) … … 609 685 } 610 686 611 void UniqueIDBDatabase::clearObjectStore(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, ErrorCallback callback )687 void UniqueIDBDatabase::clearObjectStore(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 612 688 { 613 689 ASSERT(!isMainThread()); 614 690 LOG(IndexedDB, "UniqueIDBDatabase::clearObjectStore"); 615 691 616 ASSERT(m_backingStore); 692 if (spaceCheckResult == SpaceCheckResult::Unknown) { 693 if (!m_manager) 694 return callback(IDBError { InvalidStateError }); 695 696 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, objectStoreIdentifier, callback = WTFMove(callback)](bool granted) mutable { 697 if (!weakThis || !weakTransaction) 698 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }); 699 700 clearObjectStore(*weakTransaction, objectStoreIdentifier, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 701 }); 702 return; 703 } 704 705 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 706 if (!m_backingStore) 707 return callback(IDBError { InvalidStateError, "Backing store is closed" }); 708 617 709 auto error = m_backingStore->clearObjectStore(transaction.info().identifier(), objectStoreIdentifier); 618 619 710 callback(error); 620 711 } 621 712 622 void UniqueIDBDatabase::createIndex(UniqueIDBDatabaseTransaction& transaction, const IDBIndexInfo& info, ErrorCallback callback )713 void UniqueIDBDatabase::createIndex(UniqueIDBDatabaseTransaction& transaction, const IDBIndexInfo& info, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 623 714 { 624 715 ASSERT(!isMainThread()); 625 716 LOG(IndexedDB, "UniqueIDBDatabase::createIndex"); 626 717 627 // Quota check. 628 auto taskSize = defaultWriteOperationCost + estimateSize(info); 629 if (m_server.requestSpace(m_identifier.origin(), taskSize) == StorageQuotaManager::Decision::Deny) { 718 if (spaceCheckResult == SpaceCheckResult::Unknown) { 719 if (!m_manager) 720 return callback(IDBError { InvalidStateError }); 721 722 auto taskSize = defaultWriteOperationCost + estimateSize(info); 723 m_manager->requestSpace(m_identifier.origin(), taskSize, [this, weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, info, callback = WTFMove(callback)](bool granted) mutable { 724 if (!weakThis || !weakTransaction) 725 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }); 726 727 createIndex(*weakTransaction, info, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 728 }); 729 return; 730 } 731 732 if (spaceCheckResult != SpaceCheckResult::Pass) { 630 733 callback(IDBError { QuotaExceededError, quotaErrorMessageName("CreateIndex") }); 631 734 return; 632 735 } 633 736 634 ASSERT(m_backingStore); 737 if (!m_backingStore) 738 return callback(IDBError { InvalidStateError, "Backing store is closed" }); 739 635 740 auto error = m_backingStore->createIndex(transaction.info().identifier(), info); 636 741 if (error.isNull()) { … … 645 750 } 646 751 647 void UniqueIDBDatabase::deleteIndex(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, const String& indexName, ErrorCallback callback )752 void UniqueIDBDatabase::deleteIndex(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, const String& indexName, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 648 753 { 649 754 ASSERT(!isMainThread()); 650 755 LOG(IndexedDB, "UniqueIDBDatabase::deleteIndex"); 756 757 if (spaceCheckResult == SpaceCheckResult::Unknown) { 758 if (!m_manager) 759 return callback(IDBError { InvalidStateError }); 760 761 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, objectStoreIdentifier, indexName, callback = WTFMove(callback)](bool granted) mutable { 762 if (!weakThis || !weakTransaction) 763 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }); 764 765 deleteIndex(*weakTransaction, objectStoreIdentifier, indexName, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 766 }); 767 return; 768 } 769 770 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 771 if (!m_backingStore) 772 return callback(IDBError { InvalidStateError, "Backing store is closed" }); 651 773 652 774 auto* objectStoreInfo = m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier); … … 661 783 return; 662 784 } 785 663 786 auto indexIdentifier = indexInfo->identifier(); 664 665 ASSERT(m_backingStore);666 787 auto error = m_backingStore->deleteIndex(transaction.info().identifier(), objectStoreIdentifier, indexIdentifier); 667 788 if (error.isNull()) … … 671 792 } 672 793 673 void UniqueIDBDatabase::renameIndex(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, ErrorCallback callback )794 void UniqueIDBDatabase::renameIndex(UniqueIDBDatabaseTransaction& transaction, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 674 795 { 675 796 ASSERT(!isMainThread()); 676 797 LOG(IndexedDB, "UniqueIDBDatabase::renameIndex"); 677 798 678 // Quota check. 679 auto taskSize = defaultWriteOperationCost + newName.sizeInBytes(); 680 if (m_server.requestSpace(m_identifier.origin(), taskSize) == StorageQuotaManager::Decision::Deny) { 799 if (spaceCheckResult == SpaceCheckResult::Unknown) { 800 if (!m_manager) 801 return callback(IDBError { InvalidStateError }); 802 803 auto taskSize = defaultWriteOperationCost + newName.sizeInBytes(); 804 m_manager->requestSpace(m_identifier.origin(), taskSize, [this, weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, objectStoreIdentifier, indexIdentifier, newName, callback = WTFMove(callback)](bool granted) mutable { 805 if (!weakThis || !weakTransaction) 806 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }); 807 808 renameIndex(*weakTransaction, objectStoreIdentifier, indexIdentifier, newName, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 809 }); 810 return; 811 } 812 813 if (spaceCheckResult != SpaceCheckResult::Pass) { 681 814 callback(IDBError { QuotaExceededError, quotaErrorMessageName("RenameIndex") }); 682 815 return; 683 816 } 817 818 if (!m_backingStore) 819 return callback(IDBError { InvalidStateError, "Backing store is closed" }); 684 820 685 821 auto* objectStoreInfo = m_databaseInfo->infoForExistingObjectStore(objectStoreIdentifier); … … 695 831 } 696 832 697 ASSERT(m_backingStore);698 833 auto error = m_backingStore->renameIndex(transaction.info().identifier(), objectStoreIdentifier, indexIdentifier, newName); 699 834 if (error.isNull()) … … 710 845 ASSERT(m_databaseInfo); 711 846 847 if (!m_backingStore) 848 return callback(IDBError { InvalidStateError, "Backing store is closed" }, keyData); 849 850 auto objectStoreIdentifier = requestData.objectStoreIdentifier(); 851 auto* objectStoreInfo = m_backingStore->infoForObjectStore(objectStoreIdentifier); 852 if (!objectStoreInfo) 853 return callback(IDBError { InvalidStateError, "Object store cannot be found in the backing store"_s }, keyData); 854 855 if (!m_manager) 856 return callback(IDBError { InvalidStateError }, keyData); 857 712 858 IDBKeyData usedKey; 713 859 IDBError error; 714 715 ASSERT(m_backingStore);716 auto objectStoreIdentifier = requestData.objectStoreIdentifier();717 auto* objectStoreInfo = m_backingStore->infoForObjectStore(objectStoreIdentifier);718 if (!objectStoreInfo) {719 callback(IDBError { InvalidStateError, "Object store cannot be found in the backing store"_s }, usedKey);720 return;721 }722 723 860 bool usedKeyIsGenerated = false; 724 861 uint64_t keyNumber; … … 731 868 if (objectStoreInfo->autoIncrement() && !keyData.isValid()) { 732 869 error = m_backingStore->generateKeyNumber(transactionIdentifier, objectStoreIdentifier, keyNumber); 733 if (!error.isNull()) { 734 callback(error, usedKey); 735 return; 736 } 870 if (!error.isNull()) 871 return callback(error, usedKey); 872 737 873 usedKey.setNumberValue(keyNumber); 738 874 usedKeyIsGenerated = true; 739 875 } else 740 876 usedKey = keyData; 877 878 if (overwriteMode == IndexedDB::ObjectStoreOverwriteMode::NoOverwrite) { 879 bool keyExists; 880 error = m_backingStore->keyExistsInObjectStore(transactionIdentifier, objectStoreIdentifier, usedKey, keyExists); 881 if (!error && keyExists) 882 error = IDBError { ConstraintError, "Key already exists in the object store"_s }; 883 884 if (!!error) 885 return callback(error, usedKey); 886 } 741 887 742 888 // Generate index keys up front for more accurate quota check. … … 746 892 }); 747 893 748 if (overwriteMode == IndexedDB::ObjectStoreOverwriteMode::NoOverwrite) { 749 bool keyExists; 750 error = m_backingStore->keyExistsInObjectStore(transactionIdentifier, objectStoreIdentifier, usedKey, keyExists); 751 if (error.isNull() && keyExists) 752 error = IDBError { ConstraintError, "Key already exists in the object store"_s }; 753 754 if (!error.isNull()) { 755 callback(error, usedKey); 756 return; 757 } 758 } 759 760 // Quota check. 894 generatedKeyResetter.release(); 761 895 auto keySize = estimateSize(usedKey); 762 896 auto valueSize = estimateSize(value); … … 765 899 766 900 LOG(IndexedDB, "UniqueIDBDatabase::putOrAdd quota check with task size: %" PRIu64 " key size: %" PRIu64 " value size: %" PRIu64 " index size: %" PRIu64, taskSize, keySize, valueSize, indexSize); 767 768 if (m_server.requestSpace(m_identifier.origin(), taskSize) == StorageQuotaManager::Decision::Deny) { 769 callback(IDBError { QuotaExceededError, quotaErrorMessageName("PutOrAdd") }, usedKey); 770 return; 771 } 772 901 m_manager->requestSpace(m_identifier.origin(), taskSize, [this, weakThis = WeakPtr { *this }, requestData, usedKey, value, overwriteMode, callback = WTFMove(callback), usedKeyIsGenerated, indexKeys, objectStoreInfo = *objectStoreInfo](bool granted) mutable { 902 if (!weakThis) 903 return callback(IDBError { InvalidStateError, "Database is closed" }, usedKey); 904 905 putOrAddAfterSpaceCheck(requestData, usedKey, value, overwriteMode, WTFMove(callback), usedKeyIsGenerated, indexKeys, objectStoreInfo, granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 906 }); 907 } 908 909 void UniqueIDBDatabase::putOrAddAfterSpaceCheck(const IDBRequestData& requestData, const IDBKeyData& keyData, const IDBValue& value, IndexedDB::ObjectStoreOverwriteMode overwriteMode, KeyDataCallback callback, bool isKeyGenerated, const IndexIDToIndexKeyMap& indexKeys, const IDBObjectStoreInfo& objectStoreInfo, SpaceCheckResult spaceCheckResult) 910 { 911 ASSERT(!isMainThread()); 912 ASSERT(m_databaseInfo); 913 914 if (!m_backingStore) 915 return callback(IDBError { InvalidStateError, "Backing store is closed" }, keyData); 916 917 uint64_t keyNumber = isKeyGenerated ? keyData.number() : 0; 918 auto objectStoreIdentifier = objectStoreInfo.identifier(); 919 auto transactionIdentifier = requestData.transactionIdentifier(); 920 auto generatedKeyResetter = makeScopeExit([this, transactionIdentifier, objectStoreIdentifier, &keyNumber, &isKeyGenerated]() { 921 if (isKeyGenerated) 922 m_backingStore->revertGeneratedKeyNumber(transactionIdentifier, objectStoreIdentifier, keyNumber); 923 }); 924 925 if (spaceCheckResult != SpaceCheckResult::Pass) 926 return callback(IDBError { QuotaExceededError, quotaErrorMessageName("PutOrAdd") }, keyData); 773 927 // If a record already exists in store, then remove the record from store using the steps for deleting records from an object store. 774 // This is important because formally deleting it from from the object store also removes it from the appropriate indexes. 775 error = m_backingStore->deleteRange(transactionIdentifier, objectStoreIdentifier, usedKey); 776 if (!error.isNull()) { 777 callback(error, usedKey); 778 return; 779 } 780 781 error = m_backingStore->addRecord(transactionIdentifier, *objectStoreInfo, usedKey, indexKeys, value); 782 if (!error.isNull()) { 783 callback(error, usedKey); 784 return; 785 } 786 787 if (overwriteMode != IndexedDB::ObjectStoreOverwriteMode::OverwriteForCursor && objectStoreInfo->autoIncrement() && keyData.type() == IndexedDB::KeyType::Number) 928 // This is important because formally deleting it from the object store also removes it from the appropriate indexes. 929 IDBError error = m_backingStore->deleteRange(transactionIdentifier, objectStoreIdentifier, keyData); 930 if (!error.isNull()) 931 return callback(error, keyData); 932 933 error = m_backingStore->addRecord(transactionIdentifier, objectStoreInfo, keyData, indexKeys, value); 934 if (!error.isNull()) 935 return callback(error, keyData); 936 937 if (overwriteMode != IndexedDB::ObjectStoreOverwriteMode::OverwriteForCursor && objectStoreInfo.autoIncrement() && keyData.type() == IndexedDB::KeyType::Number) 788 938 error = m_backingStore->maybeUpdateKeyGeneratorNumber(transactionIdentifier, objectStoreIdentifier, keyData.number()); 789 939 790 940 generatedKeyResetter.release(); 791 callback(error, usedKey);792 } 793 794 void UniqueIDBDatabase::getRecord(const IDBRequestData& requestData, const IDBGetRecordData& getRecordData, GetResultCallback callback )941 callback(error, keyData); 942 } 943 944 void UniqueIDBDatabase::getRecord(const IDBRequestData& requestData, const IDBGetRecordData& getRecordData, GetResultCallback callback, SpaceCheckResult spaceCheckResult) 795 945 { 796 946 ASSERT(!isMainThread()); 797 947 LOG(IndexedDB, "UniqueIDBDatabase::getRecord"); 948 949 if (spaceCheckResult == SpaceCheckResult::Unknown) { 950 if (!m_manager) 951 return callback(IDBError { InvalidStateError }, IDBGetResult { }); 952 953 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, requestData, getRecordData, callback = WTFMove(callback)](bool granted) mutable { 954 if (!weakThis) 955 return callback(IDBError { InvalidStateError, "Database is closed" }, IDBGetResult { }); 956 957 getRecord(requestData, getRecordData, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 958 }); 959 return; 960 } 961 962 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 963 if (!m_backingStore) 964 return callback(IDBError { InvalidStateError, "Backing store is closed" }, IDBGetResult { }); 798 965 799 966 IDBGetResult result; 800 967 IDBError error; 801 968 802 ASSERT(m_backingStore);803 969 if (uint64_t indexIdentifier = requestData.indexIdentifier()) 804 970 error = m_backingStore->getIndexRecord(requestData.transactionIdentifier(), requestData.objectStoreIdentifier(), indexIdentifier, requestData.indexRecordType(), getRecordData.keyRangeData, result); … … 809 975 } 810 976 811 void UniqueIDBDatabase::getAllRecords(const IDBRequestData& requestData, const IDBGetAllRecordsData& getAllRecordsData, GetAllResultsCallback callback )977 void UniqueIDBDatabase::getAllRecords(const IDBRequestData& requestData, const IDBGetAllRecordsData& getAllRecordsData, GetAllResultsCallback callback, SpaceCheckResult spaceCheckResult) 812 978 { 813 979 ASSERT(!isMainThread()); 814 980 LOG(IndexedDB, "UniqueIDBDatabase::getAllRecords"); 815 981 816 ASSERT(m_backingStore); 982 if (spaceCheckResult == SpaceCheckResult::Unknown) { 983 if (!m_manager) 984 return callback(IDBError { InvalidStateError }, IDBGetAllResult { }); 985 986 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, requestData, getAllRecordsData, callback = WTFMove(callback)](bool granted) mutable { 987 if (!weakThis) 988 return callback(IDBError { InvalidStateError, "Database is closed" }, IDBGetAllResult { }); 989 990 getAllRecords(requestData, getAllRecordsData, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 991 }); 992 return; 993 } 994 995 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 996 if (!m_backingStore) 997 return callback(IDBError { InvalidStateError, "Backing store is closed" }, IDBGetAllResult { }); 998 817 999 IDBGetAllResult result; 818 1000 auto error = m_backingStore->getAllRecords(requestData.transactionIdentifier(), getAllRecordsData, result); … … 821 1003 } 822 1004 823 void UniqueIDBDatabase::getCount(const IDBRequestData& requestData, const IDBKeyRangeData& range, CountCallback callback )1005 void UniqueIDBDatabase::getCount(const IDBRequestData& requestData, const IDBKeyRangeData& range, CountCallback callback, SpaceCheckResult spaceCheckResult) 824 1006 { 825 1007 ASSERT(!isMainThread()); 826 1008 LOG(IndexedDB, "UniqueIDBDatabase::getCount"); 827 1009 828 ASSERT(m_backingStore); 1010 if (spaceCheckResult == SpaceCheckResult::Unknown) { 1011 if (!m_manager) 1012 return callback(IDBError { InvalidStateError }, 0); 1013 1014 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, requestData, range, callback = WTFMove(callback)](bool granted) mutable { 1015 if (!weakThis) 1016 return callback(IDBError { InvalidStateError, "Database is closed" }, 0); 1017 1018 getCount(requestData, range, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 1019 }); 1020 return; 1021 } 1022 1023 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 1024 if (!m_backingStore) 1025 return callback(IDBError { InvalidStateError, "Backing store is closed" }, 0); 1026 829 1027 uint64_t count = 0; 830 1028 auto error = m_backingStore->getCount(requestData.transactionIdentifier(), requestData.objectStoreIdentifier(), requestData.indexIdentifier(), range, count); … … 833 1031 } 834 1032 835 void UniqueIDBDatabase::deleteRecord(const IDBRequestData& requestData, const IDBKeyRangeData& keyRangeData, ErrorCallback callback )1033 void UniqueIDBDatabase::deleteRecord(const IDBRequestData& requestData, const IDBKeyRangeData& keyRangeData, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 836 1034 { 837 1035 ASSERT(!isMainThread()); 838 1036 LOG(IndexedDB, "UniqueIDBDatabase::deleteRecord"); 839 1037 840 ASSERT(m_backingStore); 1038 if (spaceCheckResult == SpaceCheckResult::Unknown) { 1039 if (!m_manager) 1040 return callback(IDBError { InvalidStateError }); 1041 1042 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, requestData, keyRangeData, callback = WTFMove(callback)](bool granted) mutable { 1043 if (!weakThis) 1044 return callback(IDBError { InvalidStateError, "Database is closed" }); 1045 1046 deleteRecord(requestData, keyRangeData, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 1047 }); 1048 return; 1049 } 1050 1051 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 1052 if (!m_backingStore) 1053 return callback(IDBError { InvalidStateError, "Backing store is closed" }); 1054 841 1055 auto error = m_backingStore->deleteRange(requestData.transactionIdentifier(), requestData.objectStoreIdentifier(), keyRangeData); 842 1056 … … 844 1058 } 845 1059 846 void UniqueIDBDatabase::openCursor(const IDBRequestData& requestData, const IDBCursorInfo& info, GetResultCallback callback )1060 void UniqueIDBDatabase::openCursor(const IDBRequestData& requestData, const IDBCursorInfo& info, GetResultCallback callback, SpaceCheckResult spaceCheckResult) 847 1061 { 848 1062 ASSERT(!isMainThread()); 849 1063 LOG(IndexedDB, "UniqueIDBDatabase::openCursor"); 850 1064 851 ASSERT(m_backingStore); 1065 if (spaceCheckResult == SpaceCheckResult::Unknown) { 1066 if (!m_manager) 1067 return callback(IDBError { InvalidStateError }, IDBGetResult { }); 1068 1069 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, requestData, info, callback = WTFMove(callback)](bool granted) mutable { 1070 if (!weakThis) 1071 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }, IDBGetResult { }); 1072 1073 openCursor(requestData, info, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 1074 }); 1075 return; 1076 } 1077 1078 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 1079 if (!m_backingStore) 1080 return callback(IDBError { InvalidStateError, "Backing store is closed" }, IDBGetResult { }); 852 1081 853 1082 IDBGetResult result; … … 857 1086 } 858 1087 859 void UniqueIDBDatabase::iterateCursor(const IDBRequestData& requestData, const IDBIterateCursorData& data, GetResultCallback callback )1088 void UniqueIDBDatabase::iterateCursor(const IDBRequestData& requestData, const IDBIterateCursorData& data, GetResultCallback callback, SpaceCheckResult spaceCheckResult) 860 1089 { 861 1090 ASSERT(!isMainThread()); 862 1091 LOG(IndexedDB, "UniqueIDBDatabase::iterateCursor"); 863 1092 864 ASSERT(m_backingStore); 1093 if (spaceCheckResult == SpaceCheckResult::Unknown) { 1094 if (!m_manager) 1095 return callback(IDBError { InvalidStateError }, IDBGetResult { }); 1096 1097 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, requestData, data, callback = WTFMove(callback)](bool granted) mutable { 1098 if (!weakThis) 1099 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }, IDBGetResult { }); 1100 1101 iterateCursor(requestData, data, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 1102 }); 1103 return; 1104 } 1105 1106 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 1107 if (!m_backingStore) 1108 return callback(IDBError { InvalidStateError, "Backing store is closed" }, IDBGetResult { }); 865 1109 866 1110 IDBGetResult result; … … 872 1116 } 873 1117 874 void UniqueIDBDatabase::commitTransaction(UniqueIDBDatabaseTransaction& transaction, ErrorCallback callback )1118 void UniqueIDBDatabase::commitTransaction(UniqueIDBDatabaseTransaction& transaction, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 875 1119 { 876 1120 ASSERT(!isMainThread()); 877 1121 LOG(IndexedDB, "UniqueIDBDatabase::commitTransaction - %s", transaction.info().identifier().loggingString().utf8().data()); 878 1122 1123 if (spaceCheckResult == SpaceCheckResult::Unknown) { 1124 if (!m_manager) 1125 return callback(IDBError { InvalidStateError }); 1126 1127 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, callback = WTFMove(callback)](bool granted) mutable { 1128 if (!weakThis || !weakTransaction) 1129 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }); 1130 1131 commitTransaction(*weakTransaction, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 1132 }); 1133 return; 1134 } 1135 1136 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 879 1137 ASSERT(transaction.databaseConnection().database() == this); 880 ASSERT(m_backingStore); 1138 1139 if (!m_backingStore) 1140 return callback(IDBError { InvalidStateError, "Backing store is closed" }); 1141 881 1142 auto takenTransaction = m_inProgressTransactions.take(transaction.info().identifier()); 882 1143 if (!takenTransaction) { … … 894 1155 } 895 1156 896 void UniqueIDBDatabase::abortTransaction(UniqueIDBDatabaseTransaction& transaction, ErrorCallback callback )1157 void UniqueIDBDatabase::abortTransaction(UniqueIDBDatabaseTransaction& transaction, ErrorCallback callback, SpaceCheckResult spaceCheckResult) 897 1158 { 898 1159 ASSERT(!isMainThread()); 899 1160 LOG(IndexedDB, "UniqueIDBDatabase::abortTransaction - %s", transaction.info().identifier().loggingString().utf8().data()); 900 1161 1162 if (spaceCheckResult == SpaceCheckResult::Unknown) { 1163 if (!m_manager) 1164 return callback(IDBError { InvalidStateError }); 1165 1166 m_manager->requestSpace(m_identifier.origin(), 0, [this, weakThis = WeakPtr { *this }, weakTransaction = WeakPtr { transaction }, callback = WTFMove(callback)](bool granted) mutable { 1167 if (!weakThis || !weakTransaction) 1168 return callback(IDBError { InvalidStateError, "Database or transaction is closed" }); 1169 1170 abortTransaction(*weakTransaction, WTFMove(callback), granted ? SpaceCheckResult::Pass : SpaceCheckResult::Fail); 1171 }); 1172 return; 1173 } 1174 1175 ASSERT(spaceCheckResult == SpaceCheckResult::Pass); 901 1176 ASSERT(transaction.databaseConnection().database() == this); 902 1177 … … 926 1201 } 927 1202 928 auto error = m_backingStore->abortTransaction(transactionIdentifier); 1203 IDBError error; 1204 if (!m_backingStore) 1205 error = IDBError { InvalidStateError, "Backing store is closed" }; 1206 else 1207 error = m_backingStore->abortTransaction(transactionIdentifier); 929 1208 930 1209 callback(error); … … 1226 1505 return true; 1227 1506 } 1507 1508 bool UniqueIDBDatabase::hasDataInMemory() const 1509 { 1510 return m_backingStore ? m_backingStore->isEphemeral() : false; 1511 } 1228 1512 1229 1513 RefPtr<ServerOpenDBRequest> UniqueIDBDatabase::takeNextRunnableRequest(RequestType requestType) -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h
r280410 r289474 60 60 61 61 class IDBConnectionToClient; 62 class IDBServer;63 62 class UniqueIDBDatabaseConnection; 63 class UniqueIDBDatabaseManager; 64 64 65 65 typedef Function<void(const IDBError&)> ErrorCallback; … … 72 72 WTF_MAKE_FAST_ALLOCATED; 73 73 public: 74 UniqueIDBDatabase(IDBServer&, const IDBDatabaseIdentifier&);74 WEBCORE_EXPORT UniqueIDBDatabase(UniqueIDBDatabaseManager&, const IDBDatabaseIdentifier&); 75 75 UniqueIDBDatabase(UniqueIDBDatabase&) = delete; 76 76 WEBCORE_EXPORT ~UniqueIDBDatabase(); 77 77 78 void openDatabaseConnection(IDBConnectionToClient&, const IDBRequestData&);78 WEBCORE_EXPORT void openDatabaseConnection(IDBConnectionToClient&, const IDBRequestData&); 79 79 80 80 const IDBDatabaseInfo& info() const; 81 IDBServer& server() { return m_server; }81 UniqueIDBDatabaseManager* manager(); 82 82 const IDBDatabaseIdentifier& identifier() const { return m_identifier; } 83 83 84 void createObjectStore(UniqueIDBDatabaseTransaction&, const IDBObjectStoreInfo&, ErrorCallback); 85 void deleteObjectStore(UniqueIDBDatabaseTransaction&, const String& objectStoreName, ErrorCallback); 86 void renameObjectStore(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, const String& newName, ErrorCallback); 87 void clearObjectStore(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, ErrorCallback); 88 void createIndex(UniqueIDBDatabaseTransaction&, const IDBIndexInfo&, ErrorCallback); 89 void deleteIndex(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, const String& indexName, ErrorCallback); 90 void renameIndex(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, ErrorCallback); 84 enum class SpaceCheckResult : uint8_t { 85 Unknown, 86 Pass, 87 Fail 88 }; 89 void createObjectStore(UniqueIDBDatabaseTransaction&, const IDBObjectStoreInfo&, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 90 void deleteObjectStore(UniqueIDBDatabaseTransaction&, const String& objectStoreName, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 91 void renameObjectStore(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, const String& newName, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 92 void clearObjectStore(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 93 void createIndex(UniqueIDBDatabaseTransaction&, const IDBIndexInfo&, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 94 void deleteIndex(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, const String& indexName, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 95 void renameIndex(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 91 96 void putOrAdd(const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode, KeyDataCallback); 92 void getRecord(const IDBRequestData&, const IDBGetRecordData&, GetResultCallback); 93 void getAllRecords(const IDBRequestData&, const IDBGetAllRecordsData&, GetAllResultsCallback); 94 void getCount(const IDBRequestData&, const IDBKeyRangeData&, CountCallback); 95 void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&, ErrorCallback); 96 void openCursor(const IDBRequestData&, const IDBCursorInfo&, GetResultCallback); 97 void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&, GetResultCallback); 98 void commitTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback); 99 void abortTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback); 97 void putOrAddAfterSpaceCheck(const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode, KeyDataCallback, bool isKeyGenerated, const IndexIDToIndexKeyMap&, const IDBObjectStoreInfo&, SpaceCheckResult); 98 void getRecord(const IDBRequestData&, const IDBGetRecordData&, GetResultCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 99 void getAllRecords(const IDBRequestData&, const IDBGetAllRecordsData&, GetAllResultsCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 100 void getCount(const IDBRequestData&, const IDBKeyRangeData&, CountCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 101 void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 102 void openCursor(const IDBRequestData&, const IDBCursorInfo&, GetResultCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 103 void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&, GetResultCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 104 void commitTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 105 void abortTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback, SpaceCheckResult = SpaceCheckResult::Unknown); 100 106 101 107 void didFinishHandlingVersionChange(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& transactionIdentifier); 102 108 void connectionClosedFromClient(UniqueIDBDatabaseConnection&); 103 109 void didFireVersionChangeEvent(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer); 104 void openDBRequestCancelled(const IDBResourceIdentifier& requestIdentifier);110 WEBCORE_EXPORT void openDBRequestCancelled(const IDBResourceIdentifier& requestIdentifier); 105 111 106 112 void enqueueTransaction(Ref<UniqueIDBDatabaseTransaction>&&); 107 113 108 void handleDelete(IDBConnectionToClient&, const IDBRequestData&);109 void immediateClose();114 WEBCORE_EXPORT void handleDelete(IDBConnectionToClient&, const IDBRequestData&); 115 WEBCORE_EXPORT void immediateClose(); 110 116 111 117 bool hasActiveTransactions() const; 112 void abortActiveTransactions();113 bool tryClose();118 WEBCORE_EXPORT void abortActiveTransactions(); 119 WEBCORE_EXPORT bool tryClose(); 114 120 115 String filePath() const; 116 std::optional<IDBDatabaseNameAndVersion> nameAndVersion() const; 121 WEBCORE_EXPORT String filePath() const; 122 WEBCORE_EXPORT std::optional<IDBDatabaseNameAndVersion> nameAndVersion() const; 123 WEBCORE_EXPORT bool hasDataInMemory() const; 117 124 118 125 private: … … 120 127 void handleCurrentOperation(); 121 128 void performCurrentOpenOperation(); 129 void performCurrentOpenOperationAfterSpaceCheck(bool isGranted); 122 130 void performCurrentDeleteOperation(); 123 131 enum class RequestType { Delete, Any }; … … 147 155 void clearTransactionsOnConnection(UniqueIDBDatabaseConnection&); 148 156 149 IDBServer& m_server; 157 IDBServer* m_server; 158 WeakPtr<UniqueIDBDatabaseManager> m_manager; 150 159 IDBDatabaseIdentifier m_identifier; 151 160 152 161 ListHashSet<RefPtr<ServerOpenDBRequest>> m_pendingOpenDBRequests; 153 162 RefPtr<ServerOpenDBRequest> m_currentOpenDBRequest; 163 HashSet<IDBResourceIdentifier> m_openDBRequestsForSpaceCheck; 154 164 155 165 ListHashSet<RefPtr<UniqueIDBDatabaseConnection>> m_openDatabaseConnections; -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.cpp
r284057 r289474 32 32 #include "ServerOpenDBRequest.h" 33 33 #include "UniqueIDBDatabase.h" 34 #include "UniqueIDBDatabaseManager.h" 34 35 35 36 namespace WebCore { … … 43 44 UniqueIDBDatabaseConnection::UniqueIDBDatabaseConnection(UniqueIDBDatabase& database, ServerOpenDBRequest& request) 44 45 : m_database(database) 45 , m_ server(database.server())46 , m_manager(database.manager()) 46 47 , m_connectionToClient(request.connection()) 47 48 , m_openRequestIdentifier(request.requestData().requestIdentifier()) 48 49 { 49 m_server.registerDatabaseConnection(*this); 50 if (auto* manager = database.manager()) { 51 m_manager = *manager; 52 m_manager->registerConnection(*this); 53 } 50 54 m_connectionToClient->registerDatabaseConnection(*this); 51 55 } … … 55 59 ASSERT(m_transactionMap.isEmpty()); 56 60 57 m_server.unregisterDatabaseConnection(*this); 61 if (m_manager) 62 m_manager->unregisterConnection(*this); 58 63 m_connectionToClient->unregisterDatabaseConnection(*this); 64 } 65 66 UniqueIDBDatabaseManager* UniqueIDBDatabaseConnection::manager() 67 { 68 return m_manager.get(); 59 69 } 60 70 -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseConnection.h
r279960 r289474 26 26 #pragma once 27 27 28 #include "IDBServer.h"29 28 #include "UniqueIDBDatabase.h" 30 29 #include <wtf/HashMap.h> … … 37 36 class IDBError; 38 37 class IDBResultData; 38 class UniqueIDBDatabaseManager; 39 39 40 40 namespace IDBServer { … … 53 53 const IDBResourceIdentifier& openRequestIdentifier() { return m_openRequestIdentifier; } 54 54 UniqueIDBDatabase* database() { return m_database.get(); } 55 IDBServer* server() { return &m_server; }55 UniqueIDBDatabaseManager* manager(); 56 56 IDBConnectionToClient& connectionToClient() { return m_connectionToClient; } 57 57 58 void connectionPendingCloseFromClient();59 void connectionClosedFromClient();58 WEBCORE_EXPORT void connectionPendingCloseFromClient(); 59 WEBCORE_EXPORT void connectionClosedFromClient(); 60 60 61 61 bool closePending() const { return m_closePending; } … … 66 66 UniqueIDBDatabaseTransaction& createVersionChangeTransaction(uint64_t newVersion); 67 67 68 void establishTransaction(const IDBTransactionInfo&);68 WEBCORE_EXPORT void establishTransaction(const IDBTransactionInfo&); 69 69 void didAbortTransaction(UniqueIDBDatabaseTransaction&, const IDBError&); 70 70 void didCommitTransaction(UniqueIDBDatabaseTransaction&, const IDBError&); … … 76 76 void didDeleteIndex(const IDBResultData&); 77 77 void didRenameIndex(const IDBResultData&); 78 void didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer);79 void didFinishHandlingVersionChange(const IDBResourceIdentifier& transactionIdentifier);78 WEBCORE_EXPORT void didFireVersionChangeEvent(const IDBResourceIdentifier& requestIdentifier, IndexedDB::ConnectionClosedOnBehalfOfServer); 79 WEBCORE_EXPORT void didFinishHandlingVersionChange(const IDBResourceIdentifier& transactionIdentifier); 80 80 81 81 void abortTransactionWithoutCallback(UniqueIDBDatabaseTransaction&); … … 89 89 90 90 WeakPtr<UniqueIDBDatabase> m_database; 91 IDBServer& m_server;91 WeakPtr<UniqueIDBDatabaseManager> m_manager; 92 92 Ref<IDBConnectionToClient> m_connectionToClient; 93 93 IDBResourceIdentifier m_openRequestIdentifier; -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp
r284057 r289474 29 29 #include "IDBIterateCursorData.h" 30 30 #include "IDBResultData.h" 31 #include "IDBServer.h"32 31 #include "Logging.h" 33 32 #include "UniqueIDBDatabase.h" … … 51 50 m_originalDatabaseInfo = makeUnique<IDBDatabaseInfo>(database->info()); 52 51 53 databaseConnection().server()->registerTransaction(*this); 52 if (auto* manager = databaseConnection().manager()) 53 manager->registerTransaction(*this); 54 54 } 55 55 56 56 UniqueIDBDatabaseTransaction::~UniqueIDBDatabaseTransaction() 57 57 { 58 databaseConnection().server()->unregisterTransaction(*this); 58 if (auto* manager = databaseConnection().manager()) 59 manager->unregisterTransaction(*this); 59 60 } 60 61 -
trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h
r280053 r289474 52 52 class UniqueIDBDatabaseConnection; 53 53 54 class UniqueIDBDatabaseTransaction : public RefCounted<UniqueIDBDatabaseTransaction> {54 class UniqueIDBDatabaseTransaction : public CanMakeWeakPtr<UniqueIDBDatabaseTransaction>, public RefCounted<UniqueIDBDatabaseTransaction> { 55 55 public: 56 56 static Ref<UniqueIDBDatabaseTransaction> create(UniqueIDBDatabaseConnection&, const IDBTransactionInfo&); … … 60 60 UniqueIDBDatabaseConnection& databaseConnection(); 61 61 const IDBTransactionInfo& info() const { return m_transactionInfo; } 62 bool isVersionChange() const;62 WEBCORE_EXPORT bool isVersionChange() const; 63 63 bool isReadOnly() const; 64 64 65 65 IDBDatabaseInfo* originalDatabaseInfo() const; 66 66 67 void abort();68 void abortWithoutCallback();69 void commit(uint64_t pendingRequestCount);67 WEBCORE_EXPORT void abort(); 68 WEBCORE_EXPORT void abortWithoutCallback(); 69 WEBCORE_EXPORT void commit(uint64_t pendingRequestCount); 70 70 71 void createObjectStore(const IDBRequestData&, const IDBObjectStoreInfo&);72 void deleteObjectStore(const IDBRequestData&, const String& objectStoreName);73 void renameObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& newName);74 void clearObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier);75 void createIndex(const IDBRequestData&, const IDBIndexInfo&);76 void deleteIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName);77 void renameIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName);78 void putOrAdd(const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode);79 void getRecord(const IDBRequestData&, const IDBGetRecordData&);80 void getAllRecords(const IDBRequestData&, const IDBGetAllRecordsData&);81 void getCount(const IDBRequestData&, const IDBKeyRangeData&);82 void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&);83 void openCursor(const IDBRequestData&, const IDBCursorInfo&);84 void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&);71 WEBCORE_EXPORT void createObjectStore(const IDBRequestData&, const IDBObjectStoreInfo&); 72 WEBCORE_EXPORT void deleteObjectStore(const IDBRequestData&, const String& objectStoreName); 73 WEBCORE_EXPORT void renameObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& newName); 74 WEBCORE_EXPORT void clearObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier); 75 WEBCORE_EXPORT void createIndex(const IDBRequestData&, const IDBIndexInfo&); 76 WEBCORE_EXPORT void deleteIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName); 77 WEBCORE_EXPORT void renameIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName); 78 WEBCORE_EXPORT void putOrAdd(const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode); 79 WEBCORE_EXPORT void getRecord(const IDBRequestData&, const IDBGetRecordData&); 80 WEBCORE_EXPORT void getAllRecords(const IDBRequestData&, const IDBGetAllRecordsData&); 81 WEBCORE_EXPORT void getCount(const IDBRequestData&, const IDBKeyRangeData&); 82 WEBCORE_EXPORT void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&); 83 WEBCORE_EXPORT void openCursor(const IDBRequestData&, const IDBCursorInfo&); 84 WEBCORE_EXPORT void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&); 85 85 86 86 void didActivateInBackingStore(const IDBError&); -
trunk/Source/WebCore/Modules/indexeddb/shared/IDBError.h
r278253 r289474 53 53 54 54 bool isNull() const { return !m_code; } 55 operator bool() const { return !isNull(); } 55 56 56 57 WEBCORE_EXPORT IDBError isolatedCopy() const; -
trunk/Source/WebCore/Modules/indexeddb/shared/IDBRequestData.h
r278253 r289474 57 57 58 58 IDBConnectionIdentifier serverConnectionIdentifier() const; 59 IDBResourceIdentifier requestIdentifier() const;60 IDBResourceIdentifier transactionIdentifier() const;59 WEBCORE_EXPORT IDBResourceIdentifier requestIdentifier() const; 60 WEBCORE_EXPORT IDBResourceIdentifier transactionIdentifier() const; 61 61 uint64_t objectStoreIdentifier() const; 62 62 uint64_t indexIdentifier() const; -
trunk/Source/WebCore/Modules/indexeddb/shared/IDBResourceIdentifier.h
r276502 r289474 50 50 explicit IDBResourceIdentifier(const IDBServer::IDBConnectionToClient&); 51 51 52 static IDBResourceIdentifier emptyValue();52 WEBCORE_EXPORT static IDBResourceIdentifier emptyValue(); 53 53 bool isEmpty() const 54 54 { … … 61 61 return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes); 62 62 } 63 63 64 bool operator!=(const IDBResourceIdentifier& other) const { return !(*this == other); } 64 65 bool operator==(const IDBResourceIdentifier& other) const 65 66 { -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r289356 r289474 1545 1545 5117F30E25E61020002A9F1E /* RemoteCommandListenerCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 5117F30C25E6101F002A9F1E /* RemoteCommandListenerCocoa.h */; }; 1546 1546 511EC1281C50AACA0032F983 /* IDBSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 511EC1261C50AA570032F983 /* IDBSerialization.h */; }; 1547 511EC12C1C50ABBF0032F983 /* SQLiteIDBTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 511EC12A1C50ABBA0032F983 /* SQLiteIDBTransaction.h */; };1547 511EC12C1C50ABBF0032F983 /* SQLiteIDBTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 511EC12A1C50ABBA0032F983 /* SQLiteIDBTransaction.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1548 1548 511EC1301C50ABF50032F983 /* SQLiteIDBCursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 511EC12E1C50ABEC0032F983 /* SQLiteIDBCursor.h */; }; 1549 1549 5120BBAF1F1CECE700EFEBF1 /* CookieStorageObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 5120BBAD1F1CE77000EFEBF1 /* CookieStorageObserver.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1550 512BDB4B1C456FFA006494DF /* SQLiteIDBBackingStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 512BDB491C456FAB006494DF /* SQLiteIDBBackingStore.h */; };1550 512BDB4B1C456FFA006494DF /* SQLiteIDBBackingStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 512BDB491C456FAB006494DF /* SQLiteIDBBackingStore.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1551 1551 512DD8F50D91E6AF000F89EE /* LegacyWebArchive.h in Headers */ = {isa = PBXBuildFile; fileRef = 512DD8EB0D91E6AF000F89EE /* LegacyWebArchive.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1552 1552 512DD8F60D91E6AF000F89EE /* Archive.h in Headers */ = {isa = PBXBuildFile; fileRef = 512DD8EC0D91E6AF000F89EE /* Archive.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 1594 1594 516F7F6D1C31E39A00F111DC /* ServerOpenDBRequest.h in Headers */ = {isa = PBXBuildFile; fileRef = 516F7F6C1C31C79D00F111DC /* ServerOpenDBRequest.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1595 1595 517138F01BED1D1A000D5F01 /* IndexKey.h in Headers */ = {isa = PBXBuildFile; fileRef = 517138EE1BED1D17000D5F01 /* IndexKey.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1596 517138F81BF128BB000D5F01 /* IndexValueStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 517138F61BF12262000D5F01 /* IndexValueStore.h */; };1596 517138F81BF128BB000D5F01 /* IndexValueStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 517138F61BF12262000D5F01 /* IndexValueStore.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1597 1597 517138FC1BF3ADF4000D5F01 /* IDBCursorInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 517138FA1BF3ADAC000D5F01 /* IDBCursorInfo.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1598 1598 517139061BF64DEC000D5F01 /* MemoryObjectStoreCursor.h in Headers */ = {isa = PBXBuildFile; fileRef = 517139041BF64DE3000D5F01 /* MemoryObjectStoreCursor.h */; }; … … 1670 1670 51B914111FD2782D00EE2859 /* RegistrationStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 51B9140B1FD2782500EE2859 /* RegistrationStore.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1671 1671 51BA4AC41BBB5CD800DF3D6D /* IDBDatabaseInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BA4AC21BBB5CBF00DF3D6D /* IDBDatabaseInfo.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1672 51BA4ACB1BBC5BD900DF3D6D /* MemoryIDBBackingStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BA4AC91BBC5B9E00DF3D6D /* MemoryIDBBackingStore.h */; };1672 51BA4ACB1BBC5BD900DF3D6D /* MemoryIDBBackingStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BA4AC91BBC5B9E00DF3D6D /* MemoryIDBBackingStore.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1673 1673 51BA4ACC1BBC5BDD00DF3D6D /* IDBBackingStore.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BA4AC71BBC5AD600DF3D6D /* IDBBackingStore.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1674 1674 51BA947123AC305300444846 /* RunJavaScriptParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BA946F23AC305000444846 /* RunJavaScriptParameters.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 1686 1686 51E0BAEB0DA55D4A00A9E417 /* JSStorageEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E0BAE90DA55D4A00A9E417 /* JSStorageEvent.h */; }; 1687 1687 51E0BB380DA5ACB600A9E417 /* StorageMap.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E0BB360DA5ACB600A9E417 /* StorageMap.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1688 51E1BAC31BD8064E0055D81F /* MemoryBackingStoreTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E1BAC11BD806470055D81F /* MemoryBackingStoreTransaction.h */; };1688 51E1BAC31BD8064E0055D81F /* MemoryBackingStoreTransaction.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E1BAC11BD806470055D81F /* MemoryBackingStoreTransaction.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1689 1689 51E269371DD3BD9B006B6A58 /* IDBIterateCursorData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E269351DD3BD91006B6A58 /* IDBIterateCursorData.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1690 1690 51E399001D6E4750009C8831 /* GameControllerGamepad.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E398FC1D6E474B009C8831 /* GameControllerGamepad.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 1696 1696 51ECC3FD2005930D00483EAE /* MessagePortChannelProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 51ECC3FB2005930100483EAE /* MessagePortChannelProvider.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1697 1697 51EE7B381AA50B0500F92B21 /* ResourceLoadInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 51EE7B371AA50B0500F92B21 /* ResourceLoadInfo.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1698 51EEAA741BEFFAB100218008 /* IndexValueEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = 51EEAA721BEFFA7900218008 /* IndexValueEntry.h */; };1698 51EEAA741BEFFAB100218008 /* IndexValueEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = 51EEAA721BEFFA7900218008 /* IndexValueEntry.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1699 1699 51F174FE1F35899200C74950 /* WorkerType.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F174FC1F35898800C74950 /* WorkerType.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1700 1700 51F175031F358B3B00C74950 /* JSServiceWorkerUpdateViaCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 51F175011F358B3600C74950 /* JSServiceWorkerUpdateViaCache.h */; }; … … 2996 2996 93B38EC325821DB400198E63 /* WebSpeechRecognizerTask.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B38EBA2582193B00198E63 /* WebSpeechRecognizerTask.h */; }; 2997 2997 93B38EC425821DB700198E63 /* WebSpeechRecognizerTaskMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B38EBB2582193D00198E63 /* WebSpeechRecognizerTaskMock.h */; }; 2998 93B631E227ABA1E600443A44 /* UniqueIDBDatabaseManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B631E027ABA1E200443A44 /* UniqueIDBDatabaseManager.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2998 2999 93B6A0E60B0BCA5C00F5027A /* ContextMenu.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B6A0E50B0BCA5C00F5027A /* ContextMenu.h */; settings = {ATTRIBUTES = (Private, ); }; }; 2999 3000 93B70D6409EB0C7C009D8468 /* JSDOMBinding.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B70D4809EB0C7C009D8468 /* JSDOMBinding.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 12829 12830 93B38EBB2582193D00198E63 /* WebSpeechRecognizerTaskMock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSpeechRecognizerTaskMock.h; sourceTree = "<group>"; }; 12830 12831 93B38EBC2582193E00198E63 /* WebSpeechRecognizerTask.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebSpeechRecognizerTask.mm; sourceTree = "<group>"; }; 12832 93B631E027ABA1E200443A44 /* UniqueIDBDatabaseManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UniqueIDBDatabaseManager.h; sourceTree = "<group>"; }; 12831 12833 93B6A0E50B0BCA5C00F5027A /* ContextMenu.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = ContextMenu.h; sourceTree = "<group>"; }; 12832 12834 93B70D4809EB0C7C009D8468 /* JSDOMBinding.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JSDOMBinding.h; sourceTree = "<group>"; }; … … 22152 22154 5198F7A21BBDAA2900E2CC5F /* UniqueIDBDatabaseConnection.cpp */, 22153 22155 5198F7A31BBDAA2900E2CC5F /* UniqueIDBDatabaseConnection.h */, 22156 93B631E027ABA1E200443A44 /* UniqueIDBDatabaseManager.h */, 22154 22157 5198F7A61BBDD38100E2CC5F /* UniqueIDBDatabaseTransaction.cpp */, 22155 22158 5198F7A71BBDD38100E2CC5F /* UniqueIDBDatabaseTransaction.h */, … … 37772 37775 518864E11BBAF57400E540C9 /* UniqueIDBDatabase.h in Headers */, 37773 37776 5198F7A51BBDB79300E2CC5F /* UniqueIDBDatabaseConnection.h in Headers */, 37777 93B631E227ABA1E600443A44 /* UniqueIDBDatabaseManager.h in Headers */, 37774 37778 5198F7A91BBDD38500E2CC5F /* UniqueIDBDatabaseTransaction.h in Headers */, 37775 37779 E4AFCFA50DAF29A300F5F55C /* UnitBezier.h in Headers */, -
trunk/Source/WebKit/ChangeLog
r289469 r289474 1 2022-02-09 Sihui Liu <sihui_liu@apple.com> 2 3 Manage IndexedDB storage by origin 4 https://bugs.webkit.org/show_bug.cgi?id=234925 5 <rdar://problem/87555014> 6 7 Reviewed by Chris Dumez. 8 9 In network process, IndexedDB data is managed by WebKit::WebIDBServer. Each session owns a WebIDBServer 10 (IDBServer) and each IDBServer owns one or more UniqueIDBDatabases (resprenting one actual database that 11 IDBDatabase connects to, can be identified by {session, origin, name}). Now that we have NetworkStorageManager, 12 which manages session storage by origin, we can merge WebIDBServer with NetworkStorageManager, since IndexedDB 13 storage is not shared across origins. 14 15 The old structure is: 16 NetworkSession - WebIDBServer - IDBServer - UniqueIDBDatabases 17 The new structure is: 18 NetworkSession - NetworkStorageManager - OriginStorageManager - IDBStorageManager - UniqueIDBDatabase 19 20 To complete this transition, we need to make a few changes: 21 1. Web process now sends IndexedDB related messages to NetworkStorageManager instead of WebIDBServer. 22 2. Some messages are sent to operate on UniqueIDBDatabaseConnection or UniqueIDBDatabaseTransaction, and they 23 use identifiers to specify the target. Therefore, NetworkStorageManagers needs to know the mapping between 24 identifiers and target objects. A new clas IDBStorageRegistry is added record this mapping. Each 25 NetworkStorageManager owns a IDBStorageRegistry and it passes IDBStorageRegistry to IDBStorageManager, 26 IDBStorageManager will register objects to IDBStorageRegistry and NetworkStorageManager can do search via 27 IDBStorageRegistry. 28 3. Quota check for IndexedDB operations becomes async by adding new QuotaManager class, which is similar to 29 WebCore::StorageQuotaManager but provides async interfaces. 30 We used to block the IDBServer thread when it is waiting for quota check result from UI process, this is fine 31 because IDBServer runs on its own thread. Now that IDBStorageManager runs on the same thread as the other 32 storage types, we cannot block the thread on quota check. 33 4. Rename WebIDBConnectionToClient to IDBStorageConnectionToClient to reflect the change on the structure. Also, 34 IDBStorageConnectionToClient does not keep reference to the IPC::Connection now, it only records 35 IPC::Connection::UniqueID. 36 5. IndexedDB data may be put in different version dirctories. We used to migrate database to new version 37 diretory when the database is accessed. As IDBStorageManager now manages IndexedDB data of one origin, it's 38 simpler if it only keeps track of one directory. Therefore, we now migrate all databases of one origin 39 when the origin is accessed (see IDBStorageManager::idbStorageOriginDirectory). 40 41 * NetworkProcess/NetworkConnectionToWebProcess.cpp: 42 (WebKit::NetworkConnectionToWebProcess::updateQuotaBasedOnSpaceUsageForTesting): 43 (WebKit::NetworkConnectionToWebProcess::writeBlobsToTemporaryFilesForIndexedDB): 44 * NetworkProcess/NetworkProcess.cpp: 45 (WebKit::NetworkProcess::didClose): 46 (WebKit::NetworkProcess::createNetworkConnectionToWebProcess): 47 (WebKit::NetworkProcess::addWebsiteDataStore): 48 (WebKit::NetworkProcess::fetchWebsiteData): 49 (WebKit::NetworkProcess::deleteWebsiteData): 50 (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): 51 (WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains): 52 (WebKit::NetworkProcess::registrableDomainsWithWebsiteData): 53 (WebKit::NetworkProcess::prepareToSuspend): 54 (WebKit::NetworkProcess::resume): 55 (WebKit::NetworkProcess::resetQuota): 56 (WebKit::NetworkProcess::didIncreaseQuota): 57 (WebKit::NetworkProcess::renameOriginInWebsiteData): 58 (WebKit::NetworkProcess::storageQuotaManager): 59 (WebKit::NetworkProcess::connectionToWebProcessClosed): 60 (WebKit::NetworkProcess::suspendIDBServers): Deleted. 61 * NetworkProcess/NetworkProcess.h: 62 (WebKit::NetworkProcess::shouldSuspendIDBServers const): Deleted. 63 * NetworkProcess/NetworkProcess.messages.in: 64 * NetworkProcess/NetworkSession.cpp: 65 (WebKit::NetworkSession::invalidateAndCancel): 66 (WebKit::NetworkSession::addStorageManagerSession): 67 (WebKit::NetworkSession::ensureWebIDBServer): Deleted. 68 (WebKit::NetworkSession::closeIDBServer): Deleted. 69 (WebKit::NetworkSession::addIndexedDatabaseSession): Deleted. 70 * NetworkProcess/NetworkSession.h: 71 (WebKit::NetworkSession::webIDBServer): Deleted. 72 (WebKit::NetworkSession::hasIDBDatabasePath const): Deleted. 73 * NetworkProcess/cache/CacheStorageEngine.cpp: 74 (WebKit::CacheStorage::Engine::storagePath): 75 (WebKit::CacheStorage::Engine::diskUsage): 76 (WebKit::CacheStorage::Engine::requestSpace): 77 * NetworkProcess/cache/CacheStorageEngine.h: 78 * NetworkProcess/cache/CacheStorageEngineCaches.cpp: 79 (WebKit::CacheStorage::Caches::requestSpace): 80 * NetworkProcess/ios/NetworkProcessIOS.mm: 81 (WebKit::NetworkProcess::setIsHoldingLockedFiles): 82 * NetworkProcess/storage/IDBStorageConnectionToClient.cpp: Added. 83 (WebKit::IDBStorageConnectionToClient::IDBStorageConnectionToClient): 84 (WebKit::IDBStorageConnectionToClient::~IDBStorageConnectionToClient): 85 (WebKit::IDBStorageConnectionToClient::connectionToClient): 86 (WebKit::IDBStorageConnectionToClient::didGetResult): 87 (WebKit::IDBStorageConnectionToClient::didDeleteDatabase): 88 (WebKit::IDBStorageConnectionToClient::didOpenDatabase): 89 (WebKit::IDBStorageConnectionToClient::didStartTransaction): 90 (WebKit::IDBStorageConnectionToClient::didAbortTransaction): 91 (WebKit::IDBStorageConnectionToClient::didCommitTransaction): 92 (WebKit::IDBStorageConnectionToClient::didCreateObjectStore): 93 (WebKit::IDBStorageConnectionToClient::didDeleteObjectStore): 94 (WebKit::IDBStorageConnectionToClient::didRenameObjectStore): 95 (WebKit::IDBStorageConnectionToClient::didClearObjectStore): 96 (WebKit::IDBStorageConnectionToClient::didCreateIndex): 97 (WebKit::IDBStorageConnectionToClient::didDeleteIndex): 98 (WebKit::IDBStorageConnectionToClient::didRenameIndex): 99 (WebKit::IDBStorageConnectionToClient::didPutOrAdd): 100 (WebKit::IDBStorageConnectionToClient::didGetRecord): 101 (WebKit::IDBStorageConnectionToClient::didGetAllRecords): 102 (WebKit::IDBStorageConnectionToClient::didGetCount): 103 (WebKit::IDBStorageConnectionToClient::didDeleteRecord): 104 (WebKit::IDBStorageConnectionToClient::didOpenCursor): 105 (WebKit::IDBStorageConnectionToClient::didIterateCursor): 106 (WebKit::IDBStorageConnectionToClient::didGetAllDatabaseNamesAndVersions): 107 (WebKit::IDBStorageConnectionToClient::fireVersionChangeEvent): 108 (WebKit::IDBStorageConnectionToClient::didCloseFromServer): 109 (WebKit::IDBStorageConnectionToClient::notifyOpenDBRequestBlocked): 110 * NetworkProcess/storage/IDBStorageConnectionToClient.h: Added. 111 * NetworkProcess/storage/IDBStorageManager.cpp: Added. 112 (WebKit::migrateOriginData): 113 (WebKit::IDBStorageManager::idbStorageOriginDirectory): 114 (WebKit::IDBStorageManager::idbStorageSize): 115 (WebKit::getOriginsForVersion): 116 (WebKit::IDBStorageManager::originsOfIDBStorageData): 117 (WebKit::IDBStorageManager::IDBStorageManager): 118 (WebKit::IDBStorageManager::isActive const): 119 (WebKit::IDBStorageManager::hasDataInMemory const): 120 (WebKit::IDBStorageManager::closeDatabasesForDeletion): 121 (WebKit::IDBStorageManager::stopDatabaseActivitiesForSuspend): 122 (WebKit::IDBStorageManager::getOrCreateUniqueIDBDatabase): 123 (WebKit::IDBStorageManager::openDatabase): 124 (WebKit::IDBStorageManager::deleteDatabase): 125 (WebKit::IDBStorageManager::getAllDatabaseNamesAndVersions): 126 (WebKit::IDBStorageManager::openDBRequestCancelled): 127 (WebKit::IDBStorageManager::registerConnection): 128 (WebKit::IDBStorageManager::unregisterConnection): 129 (WebKit::IDBStorageManager::registerTransaction): 130 (WebKit::IDBStorageManager::unregisterTransaction): 131 (WebKit::IDBStorageManager::createBackingStore): 132 (WebKit::IDBStorageManager::requestSpace): 133 * NetworkProcess/storage/IDBStorageManager.h: Added. 134 * NetworkProcess/storage/IDBStorageRegistry.cpp: Added. 135 (WebKit::IDBStorageRegistry::ensureConnectionToClient): 136 (WebKit::IDBStorageRegistry::removeConnectionToClient): 137 (WebKit::IDBStorageRegistry::registerConnection): 138 (WebKit::IDBStorageRegistry::unregisterConnection): 139 (WebKit::IDBStorageRegistry::registerTransaction): 140 (WebKit::IDBStorageRegistry::unregisterTransaction): 141 (WebKit::IDBStorageRegistry::connection): 142 (WebKit::IDBStorageRegistry::transaction): 143 * NetworkProcess/storage/IDBStorageRegistry.h: Added. 144 * NetworkProcess/storage/NetworkStorageManager.cpp: 145 (WebKit::NetworkStorageManager::create): 146 (WebKit::NetworkStorageManager::NetworkStorageManager): 147 (WebKit::NetworkStorageManager::canHandleTypes): 148 (WebKit::NetworkStorageManager::stopReceivingMessageFromConnection): 149 (WebKit::NetworkStorageManager::localOriginStorageManager): 150 (WebKit::NetworkStorageManager::didIncreaseQuota): 151 (WebKit::NetworkStorageManager::getAllOrigins): 152 (WebKit::NetworkStorageManager::moveData): 153 (WebKit::NetworkStorageManager::suspend): 154 (WebKit::NetworkStorageManager::registerTemporaryBlobFilePaths): 155 (WebKit::NetworkStorageManager::requestSpace): 156 (WebKit::NetworkStorageManager::resetQuotaForTesting): 157 (WebKit::NetworkStorageManager::resetQuotaUpdatedBasedOnUsageForTesting): 158 (WebKit::NetworkStorageManager::openDatabase): 159 (WebKit::NetworkStorageManager::openDBRequestCancelled): 160 (WebKit::NetworkStorageManager::deleteDatabase): 161 (WebKit::NetworkStorageManager::establishTransaction): 162 (WebKit::NetworkStorageManager::databaseConnectionPendingClose): 163 (WebKit::NetworkStorageManager::databaseConnectionClosed): 164 (WebKit::NetworkStorageManager::abortOpenAndUpgradeNeeded): 165 (WebKit::NetworkStorageManager::didFireVersionChangeEvent): 166 (WebKit::NetworkStorageManager::abortTransaction): 167 (WebKit::NetworkStorageManager::commitTransaction): 168 (WebKit::NetworkStorageManager::didFinishHandlingVersionChangeTransaction): 169 (WebKit::NetworkStorageManager::createObjectStore): 170 (WebKit::NetworkStorageManager::deleteObjectStore): 171 (WebKit::NetworkStorageManager::renameObjectStore): 172 (WebKit::NetworkStorageManager::clearObjectStore): 173 (WebKit::NetworkStorageManager::createIndex): 174 (WebKit::NetworkStorageManager::deleteIndex): 175 (WebKit::NetworkStorageManager::renameIndex): 176 (WebKit::NetworkStorageManager::putOrAdd): 177 (WebKit::NetworkStorageManager::getRecord): 178 (WebKit::NetworkStorageManager::getAllRecords): 179 (WebKit::NetworkStorageManager::getCount): 180 (WebKit::NetworkStorageManager::deleteRecord): 181 (WebKit::NetworkStorageManager::openCursor): 182 (WebKit::NetworkStorageManager::iterateCursor): 183 (WebKit::NetworkStorageManager::getAllDatabaseNamesAndVersions): 184 * NetworkProcess/storage/NetworkStorageManager.h: 185 * NetworkProcess/storage/NetworkStorageManager.messages.in: 186 * NetworkProcess/storage/OriginStorageManager.cpp: 187 (WebKit::OriginStorageManager::StorageBucket::StorageBucket): 188 (WebKit::OriginStorageManager::StorageBucket::toWebsiteDataType): 189 (WebKit::OriginStorageManager::StorageBucket::toStorageIdentifier): 190 (WebKit::OriginStorageManager::StorageBucket::idbStorageManager): 191 (WebKit::OriginStorageManager::StorageBucket::existingIDBStorageManager): 192 (WebKit::OriginStorageManager::StorageBucket::isActive const): 193 (WebKit::OriginStorageManager::StorageBucket::isEmpty const): 194 (WebKit::OriginStorageManager::StorageBucket::deleteData): 195 (WebKit::OriginStorageManager::StorageBucket::moveData): 196 (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromMemory): 197 (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromDisk): 198 (WebKit::OriginStorageManager::StorageBucket::deleteIDBStorageData): 199 (WebKit::createQuotaManager): 200 (WebKit::OriginStorageManager::OriginStorageManager): 201 (WebKit::OriginStorageManager::defaultBucket): 202 (WebKit::OriginStorageManager::quotaManager): 203 (WebKit::OriginStorageManager::idbStorageManager): 204 (WebKit::OriginStorageManager::existingIDBStorageManager): 205 (WebKit::OriginStorageManager::moveData): 206 * NetworkProcess/storage/OriginStorageManager.h: 207 * NetworkProcess/storage/QuotaManager.cpp: Added. 208 (WebKit::QuotaManager::create): 209 (WebKit::QuotaManager::QuotaManager): 210 (WebKit::QuotaManager::requestSpace): 211 (WebKit::QuotaManager::handleRequests): 212 (WebKit::QuotaManager::grantWithCurrentQuota): 213 (WebKit::QuotaManager::grantFastPath): 214 (WebKit::QuotaManager::didIncreaseQuota): 215 (WebKit::QuotaManager::resetQuotaUpdatedBasedOnUsageForTesting): 216 (WebKit::QuotaManager::resetQuotaForTesting): 217 * NetworkProcess/storage/QuotaManager.h: Added. 218 * Scripts/webkit/messages.py: 219 (types_that_cannot_be_forward_declared): 220 * Shared/WebsiteData/QuotaIncreaseRequestIdentifier.h: Added. 221 * Shared/WebsiteDataStoreParameters.h: 222 * Sources.txt: 223 * UIProcess/Network/NetworkProcessProxy.cpp: 224 (WebKit::NetworkProcessProxy::increaseQuota): 225 * UIProcess/Network/NetworkProcessProxy.h: 226 * UIProcess/Network/NetworkProcessProxy.messages.in: 227 * UIProcess/WebsiteData/WebsiteDataStore.cpp: 228 (WebKit::WebsiteDataStore::perThirdPartyOriginStorageQuota const): 229 * UIProcess/WebsiteData/WebsiteDataStore.h: 230 (WebKit::WebsiteDataStore::defaultPerOriginQuota): 231 * UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp: 232 (WebKit::WebsiteDataStoreConfiguration::WebsiteDataStoreConfiguration): 233 * UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h: 234 * WebKit.xcodeproj/project.pbxproj: 235 * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp: 236 (WebKit::WebIDBConnectionToServer::deleteDatabase): 237 (WebKit::WebIDBConnectionToServer::openDatabase): 238 (WebKit::WebIDBConnectionToServer::abortTransaction): 239 (WebKit::WebIDBConnectionToServer::commitTransaction): 240 (WebKit::WebIDBConnectionToServer::didFinishHandlingVersionChangeTransaction): 241 (WebKit::WebIDBConnectionToServer::createObjectStore): 242 (WebKit::WebIDBConnectionToServer::deleteObjectStore): 243 (WebKit::WebIDBConnectionToServer::renameObjectStore): 244 (WebKit::WebIDBConnectionToServer::clearObjectStore): 245 (WebKit::WebIDBConnectionToServer::createIndex): 246 (WebKit::WebIDBConnectionToServer::deleteIndex): 247 (WebKit::WebIDBConnectionToServer::renameIndex): 248 (WebKit::WebIDBConnectionToServer::putOrAdd): 249 (WebKit::WebIDBConnectionToServer::getRecord): 250 (WebKit::WebIDBConnectionToServer::getAllRecords): 251 (WebKit::WebIDBConnectionToServer::getCount): 252 (WebKit::WebIDBConnectionToServer::deleteRecord): 253 (WebKit::WebIDBConnectionToServer::openCursor): 254 (WebKit::WebIDBConnectionToServer::iterateCursor): 255 (WebKit::WebIDBConnectionToServer::establishTransaction): 256 (WebKit::WebIDBConnectionToServer::databaseConnectionPendingClose): 257 (WebKit::WebIDBConnectionToServer::databaseConnectionClosed): 258 (WebKit::WebIDBConnectionToServer::abortOpenAndUpgradeNeeded): 259 (WebKit::WebIDBConnectionToServer::didFireVersionChangeEvent): 260 (WebKit::WebIDBConnectionToServer::openDBRequestCancelled): 261 (WebKit::WebIDBConnectionToServer::getAllDatabaseNamesAndVersions): 262 1 263 2022-02-09 Lauro Moura <lmoura@igalia.com> 2 264 -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp
r289247 r289474 53 53 #include "NetworkSocketStream.h" 54 54 #include "NetworkSocketStreamMessages.h" 55 #include "NetworkStorageManager.h" 55 56 #include "PingLoad.h" 56 57 #include "PreconnectTask.h" … … 59 60 #include "WebCoreArgumentCoders.h" 60 61 #include "WebErrors.h" 61 #include "WebIDBServer.h"62 62 #include "WebProcessMessages.h" 63 63 #include "WebProcessPoolMessages.h" … … 409 409 void NetworkConnectionToWebProcess::updateQuotaBasedOnSpaceUsageForTesting(const ClientOrigin& origin) 410 410 { 411 auto storageQuotaManager = m_networkProcess->storageQuotaManager(sessionID(), origin); 412 storageQuotaManager->resetQuotaUpdatedBasedOnUsageForTesting(); 411 auto* session = m_networkProcess->networkSession(sessionID()); 412 if (!session) 413 return; 414 415 if (auto* storageManager = session->storageManager()) 416 storageManager->resetQuotaUpdatedBasedOnUsageForTesting(origin); 413 417 } 414 418 … … 1002 1006 file->revokeFileAccess(); 1003 1007 1004 if (auto* session = networkSession()) 1005 session->ensureWebIDBServer().registerTemporaryBlobFilePaths(m_connection, filePaths); 1008 if (auto* session = networkSession()) { 1009 if (auto* storageManager = session->storageManager()) 1010 storageManager->registerTemporaryBlobFilePaths(m_connection, filePaths); 1011 } 1006 1012 completionHandler(WTFMove(filePaths)); 1007 1013 }); -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r288950 r289474 265 265 forEachNetworkSession([&] (auto& session) { 266 266 platformFlushCookies(session.sessionID(), [callbackAggregator] { }); 267 // Make sure reference to NetworkProcess in spaceRequester is removed.268 session.closeIDBServer([callbackAggregator] { });269 267 }); 270 268 } … … 383 381 384 382 if (auto* session = networkSession(sessionID)) { 385 session->ensureWebIDBServer().addConnection(connection.connection(), identifier);386 383 if (auto* manager = session->storageManager()) 387 384 manager->startReceivingMessageFromConnection(connection.connection()); … … 407 404 408 405 if (auto* session = networkSession(sessionID)) { 409 session->addStorageManagerSession(parameters.generalStorageDirectory, parameters.generalStorageDirectoryHandle, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle); 410 session->addIndexedDatabaseSession(parameters.indexedDatabaseDirectory, parameters.indexedDatabaseDirectoryExtensionHandle); 406 session->addStorageManagerSession(parameters.generalStorageDirectory, parameters.generalStorageDirectoryHandle, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle, parameters.indexedDatabaseDirectory, parameters.indexedDatabaseDirectoryExtensionHandle, parameters.cacheStorageDirectory, parameters.perOriginStorageQuota, parameters.perThirdPartyOriginStorageQuota); 411 407 #if ENABLE(SERVICE_WORKER) 412 408 session->addServiceWorkerSession(parameters.serviceWorkerProcessTerminationDelayEnabled, WTFMove(parameters.serviceWorkerRegistrationDirectory), parameters.serviceWorkerRegistrationDirectoryExtensionHandle); … … 1453 1449 #endif 1454 1450 1455 if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && session && session->hasIDBDatabasePath()) {1456 session->ensureWebIDBServer().getOrigins([callbackAggregator](auto&& origins) {1457 while (!origins.isEmpty())1458 callbackAggregator->m_websiteData.entries.append({ origins.takeAny(), WebsiteDataType::IndexedDBDatabases, 0 });1459 });1460 }1461 1462 1451 #if ENABLE(SERVICE_WORKER) 1463 1452 if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && session && session->hasServiceWorkerDatabasePath()) { … … 1526 1515 CacheStorage::Engine::clearAllCaches(*session, [clearTasksHandler] { }); 1527 1516 1528 if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && !sessionID.isEphemeral() && session)1529 session->ensureWebIDBServer().closeAndDeleteDatabasesModifiedSince(modifiedSince, [clearTasksHandler] { });1530 1531 1517 #if ENABLE(SERVICE_WORKER) 1532 1518 bool clearServiceWorkers = websiteDataTypes.contains(WebsiteDataType::DOMCache) || websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations); … … 1620 1606 CacheStorage::Engine::clearCachesForOrigin(*session, SecurityOriginData { originData }, [clearTasksHandler] { }); 1621 1607 } 1622 1623 if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && !sessionID.isEphemeral() && session)1624 session->ensureWebIDBServer().closeAndDeleteDatabasesForOrigins(originDatas, [clearTasksHandler] { });1625 1608 1626 1609 #if ENABLE(SERVICE_WORKER) … … 1812 1795 }); 1813 1796 } 1814 1815 if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && session && session->hasIDBDatabasePath()) {1816 session->ensureWebIDBServer().getOrigins([this, protectedThis = Ref { *this }, sessionID, callbackAggregator, domainsToDeleteAllNonCookieWebsiteDataFor](auto&& origins) {1817 auto* session = networkSession(sessionID);1818 if (!session || !session->webIDBServer())1819 return;1820 1821 auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator->m_domains);1822 session->webIDBServer()->closeAndDeleteDatabasesForOrigins(originsToDelete, [callbackAggregator] { });1823 });1824 }1825 1797 1826 1798 #if ENABLE(SERVICE_WORKER) … … 1959 1931 } 1960 1932 1961 if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && session && session->hasIDBDatabasePath()) {1962 session->ensureWebIDBServer().getOrigins([callbackAggregator](auto&& origins) {1963 while (!origins.isEmpty())1964 callbackAggregator->m_websiteData.entries.append({ origins.takeAny(), WebsiteDataType::IndexedDBDatabases, 0 });1965 });1966 }1967 1968 1933 #if ENABLE(SERVICE_WORKER) 1969 1934 if (websiteDataTypes.contains(WebsiteDataType::ServiceWorkerRegistrations) && session && session->hasServiceWorkerDatabasePath()) { … … 2130 2095 } 2131 2096 2132 void NetworkProcess::suspendIDBServers(bool isSuspensionImminent)2133 {2134 m_shouldSuspendIDBServers = true;2135 ++m_suspensionIdentifier;2136 2137 bool allSuspended = true;2138 auto condition = isSuspensionImminent ? WebIDBServer::SuspensionCondition::Always : WebIDBServer::SuspensionCondition::IfIdle;2139 forEachNetworkSession([&](auto& session) {2140 if (auto* server = session.webIDBServer())2141 allSuspended &= server->suspend(condition);2142 });2143 2144 if (allSuspended)2145 return;2146 2147 RunLoop::main().dispatchAfter(5_s, [this, weakThis = WeakPtr { *this }, suspensionIdentifier = m_suspensionIdentifier] {2148 if (!weakThis)2149 return;2150 2151 if (!m_shouldSuspendIDBServers || suspensionIdentifier != m_suspensionIdentifier)2152 return;2153 2154 forEachNetworkSession([](auto& session) {2155 if (auto* server = session.webIDBServer())2156 server->suspend(WebIDBServer::SuspensionCondition::Always);2157 });2158 });2159 }2160 2161 2097 void NetworkProcess::prepareToSuspend(bool isSuspensionImminent, CompletionHandler<void()>&& completionHandler) 2162 2098 { 2163 2099 RELEASE_LOG(ProcessSuspension, "%p - NetworkProcess::prepareToSuspend(), isSuspensionImminent=%d", this, isSuspensionImminent); 2164 2165 #if PLATFORM(IOS_FAMILY)2166 suspendIDBServers(isSuspensionImminent);2167 #endif2168 2100 2169 2101 lowMemoryHandler(Critical::Yes); … … 2225 2157 swServer->endSuspension(); 2226 2158 #endif 2227 #if PLATFORM(IOS_FAMILY)2228 if (auto* server = session.webIDBServer())2229 server->resume();2230 #endif2231 2159 if (auto* manager = session.storageManager()) 2232 2160 manager->resume(); 2233 2161 }); 2234 2235 #if PLATFORM(IOS_FAMILY)2236 m_shouldSuspendIDBServers = false;2237 #endif2238 2162 } 2239 2163 … … 2282 2206 void NetworkProcess::resetQuota(PAL::SessionID sessionID, CompletionHandler<void()>&& completionHandler) 2283 2207 { 2284 Locker locker { m_sessionStorageQuotaManagersLock }; 2285 if (auto* sessionStorageQuotaManager = m_sessionStorageQuotaManagers.get(sessionID)) { 2286 for (auto storageQuotaManager : sessionStorageQuotaManager->existingStorageQuotaManagers()) 2287 storageQuotaManager->resetQuotaForTesting(); 2288 } 2289 completionHandler(); 2208 auto* session = networkSession(sessionID); 2209 if (!session) 2210 return completionHandler(); 2211 2212 auto* storageManager = session->storageManager(); 2213 if (!storageManager) 2214 return completionHandler(); 2215 2216 storageManager->resetQuotaForTesting(WTFMove(completionHandler)); 2290 2217 } 2291 2218 … … 2299 2226 } 2300 2227 2228 void NetworkProcess::didIncreaseQuota(PAL::SessionID sessionID, const ClientOrigin& origin, QuotaIncreaseRequestIdentifier identifier, std::optional<uint64_t> newQuota) 2229 { 2230 auto* session = networkSession(sessionID); 2231 if (!session) 2232 return; 2233 2234 if (auto* manager = session->storageManager()) 2235 manager->didIncreaseQuota(origin, identifier, newQuota); 2236 } 2237 2301 2238 void NetworkProcess::renameOriginInWebsiteData(PAL::SessionID sessionID, const URL& oldName, const URL& newName, OptionSet<WebsiteDataType> dataTypes, CompletionHandler<void()>&& completionHandler) 2302 2239 { … … 2311 2248 if (auto* manager = session ? session->storageManager() : nullptr) 2312 2249 manager->moveData(oldOrigin, newOrigin, [aggregator] { }); 2313 2314 if (dataTypes.contains(WebsiteDataType::IndexedDBDatabases) && session && session->hasIDBDatabasePath())2315 session->ensureWebIDBServer().renameOrigin(oldOrigin, newOrigin, [aggregator] { });2316 2250 } 2317 2251 … … 2373 2307 ASSERT(!isMainRunLoop()); 2374 2308 2375 return CacheStorage::Engine::diskUsage(cacheRootPath, origin) + IDBServer::IDBServer::diskUsage(idbRootPath, origin); 2309 auto cacheStoragePath = CacheStorage::Engine::storagePath(cacheRootPath, origin); 2310 return CacheStorage::Engine::diskUsage(cacheStoragePath) + IDBServer::IDBServer::diskUsage(idbRootPath, origin); 2376 2311 }; 2377 2312 StorageQuotaManager::QuotaIncreaseRequester quotaIncreaseRequester = [this, weakThis = WeakPtr { *this }, sessionID, origin] (uint64_t currentQuota, uint64_t currentSpace, uint64_t requestedIncrease, auto&& callback) { … … 2587 2522 { 2588 2523 if (auto* session = networkSession(sessionID)) { 2589 if (auto* server = session->webIDBServer())2590 server->removeConnection(connection);2591 2524 if (auto* manager = session->storageManager()) 2592 2525 manager->stopReceivingMessageFromConnection(connection); -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.h
r287371 r289474 34 34 #include "NetworkContentRuleListManager.h" 35 35 #include "NetworkResourceLoadIdentifier.h" 36 #include "QuotaIncreaseRequestIdentifier.h" 36 37 #include "RTCDataChannelRemoteManagerProxy.h" 37 38 #include "SandboxExtension.h" … … 289 290 #endif 290 291 291 bool shouldSuspendIDBServers() const { return m_shouldSuspendIDBServers; }292 293 292 void syncLocalStorage(CompletionHandler<void()>&&); 294 293 295 294 void resetQuota(PAL::SessionID, CompletionHandler<void()>&&); 296 295 void clearStorage(PAL::SessionID, CompletionHandler<void()>&&); 296 void didIncreaseQuota(PAL::SessionID, const WebCore::ClientOrigin&, QuotaIncreaseRequestIdentifier, std::optional<uint64_t> newQuota); 297 297 void renameOriginInWebsiteData(PAL::SessionID, const URL&, const URL&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&); 298 298 … … 474 474 void registerURLSchemeAsCORSEnabled(const String&) const; 475 475 476 void suspendIDBServers(bool isSuspensionImminent);477 478 476 #if PLATFORM(IOS_FAMILY) 479 477 void setIsHoldingLockedFiles(bool); … … 483 481 WTF_MAKE_FAST_ALLOCATED; 484 482 public: 483 SessionStorageQuotaManager() = delete; 485 484 SessionStorageQuotaManager(const String& cacheRootPath, uint64_t defaultQuota, uint64_t defaultThirdPartyQuota) 486 485 : m_cacheRootPath(cacheRootPath) … … 509 508 String m_cacheRootPath; 510 509 String m_idbRootPath; 511 uint64_t m_defaultQuota { WebCore::StorageQuotaManager::defaultQuota() };512 uint64_t m_defaultThirdPartyQuota { WebCore::StorageQuotaManager::defaultThirdPartyQuota() };510 uint64_t m_defaultQuota; 511 uint64_t m_defaultThirdPartyQuota; 513 512 HashMap<WebCore::ClientOrigin, RefPtr<WebCore::StorageQuotaManager>> m_storageQuotaManagers; 514 513 }; … … 550 549 RefPtr<ProcessAssertion> m_holdingLockedFileAssertion; 551 550 #endif 552 553 bool m_shouldSuspendIDBServers { false };554 uint64_t m_suspensionIdentifier { 0 };555 551 556 552 #if ENABLE(WEB_RTC) -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in
r287371 r289474 180 180 ResetQuota(PAL::SessionID sessionID) -> () Async 181 181 ClearStorage(PAL::SessionID sessionID) -> () Async 182 DidIncreaseQuota(PAL::SessionID sessionID, struct WebCore::ClientOrigin origin, WebKit::QuotaIncreaseRequestIdentifier identifier, std::optional<uint64_t> newQuota) 182 183 183 184 #if ENABLE(APP_BOUND_DOMAINS) -
trunk/Source/WebKit/NetworkProcess/NetworkSession.cpp
r289247 r289474 206 206 m_resourceLoadStatistics->invalidateAndCancel(); 207 207 #endif 208 if (auto server = std::exchange(m_webIDBServer, nullptr))209 server->close();210 208 if (auto manager = std::exchange(m_storageManager, nullptr)) 211 209 manager->close(); … … 662 660 } 663 661 664 WebIDBServer& NetworkSession::ensureWebIDBServer() 665 { 666 if (!m_webIDBServer) { 667 String path; 668 if (!sessionID().isEphemeral()) { 669 ASSERT(!m_idbDatabasePath.isNull()); 670 path = m_idbDatabasePath; 671 } 672 673 auto spaceRequester = [networkProcess = Ref { networkProcess() }, sessionID = sessionID()](const auto& origin, uint64_t spaceRequested) { 674 return networkProcess->storageQuotaManager(sessionID, origin)->requestSpaceOnBackgroundThread(spaceRequested); 675 }; 676 677 m_webIDBServer = WebIDBServer::create(sessionID(), path, WTFMove(spaceRequester)); 678 if (networkProcess().shouldSuspendIDBServers()) 679 m_webIDBServer->suspend(WebIDBServer::SuspensionCondition::Always); 680 } 681 return *m_webIDBServer; 682 } 683 684 void NetworkSession::closeIDBServer(CompletionHandler<void()>&& completionHandler) 685 { 686 if (!m_webIDBServer) 687 return completionHandler(); 688 689 std::exchange(m_webIDBServer, nullptr)->close(WTFMove(completionHandler)); 690 } 691 692 void NetworkSession::addIndexedDatabaseSession(const String& indexedDatabaseDirectory, SandboxExtension::Handle& handle) 693 { 694 // ********* 695 // IMPORTANT: Do not change the directory structure for indexed databases on disk without first consulting a reviewer from Apple (<rdar://problem/17454712>) 696 // ********* 697 auto isNew = m_idbDatabasePath.isNull(); 698 m_idbDatabasePath = indexedDatabaseDirectory; 699 if (isNew) { 700 SandboxExtension::consumePermanently(handle); 701 networkProcess().setSessionStorageQuotaManagerIDBRootPath(sessionID(), indexedDatabaseDirectory); 702 } 703 } 704 705 void NetworkSession::addStorageManagerSession(const String& generalStoragePath, SandboxExtension::Handle& generalStoragePathHandle, const String& localStoragePath, SandboxExtension::Handle& localStoragePathHandle) 662 void NetworkSession::addStorageManagerSession(const String& generalStoragePath, SandboxExtension::Handle& generalStoragePathHandle, const String& localStoragePath, SandboxExtension::Handle& localStoragePathHandle, const String& idbStoragePath, SandboxExtension::Handle& idbStoragePathHandle, const String& cacheStoragePath, uint64_t defaultOriginQuota, uint64_t defaultThirdPartyQuota) 706 663 { 707 664 if (m_storageManager) … … 710 667 SandboxExtension::consumePermanently(generalStoragePathHandle); 711 668 SandboxExtension::consumePermanently(localStoragePathHandle); 712 m_storageManager = NetworkStorageManager::create(sessionID(), generalStoragePath, localStoragePath); 669 SandboxExtension::consumePermanently(idbStoragePathHandle); 670 IPC::Connection::UniqueID connectionID; 671 if (auto* connection = networkProcess().parentProcessConnection()) 672 connectionID = connection->uniqueID(); 673 m_storageManager = NetworkStorageManager::create(sessionID(), connectionID, generalStoragePath, localStoragePath, idbStoragePath, cacheStoragePath, defaultOriginQuota, defaultThirdPartyQuota); 713 674 } 714 675 -
trunk/Source/WebKit/NetworkProcess/NetworkSession.h
r289247 r289474 215 215 WebSharedWorkerServer& ensureSharedWorkerServer(); 216 216 217 WebIDBServer* webIDBServer() { return m_webIDBServer.get(); }218 WebIDBServer& ensureWebIDBServer();219 void closeIDBServer(CompletionHandler<void()>&&);220 void addIndexedDatabaseSession(const String& indexedDatabaseDirectory, SandboxExtension::Handle&);221 bool hasIDBDatabasePath() const { return !m_idbDatabasePath.isEmpty(); }222 223 217 NetworkStorageManager* storageManager() { return m_storageManager.get(); } 224 void addStorageManagerSession(const String& generalStoragePath, SandboxExtension::Handle& generalStoragePathHandle, const String& localStoragePath, SandboxExtension::Handle& localStoragePathHandle );218 void addStorageManagerSession(const String& generalStoragePath, SandboxExtension::Handle& generalStoragePathHandle, const String& localStoragePath, SandboxExtension::Handle& localStoragePathHandle, const String& idbStoragePath, SandboxExtension::Handle& idbStoragePathHandle, const String& cacheStoragePath, uint64_t defaultOriginQuota, uint64_t defaultThirdPartyQuota); 225 219 226 220 CacheStorage::Engine* cacheEngine() { return m_cacheEngine.get(); } … … 325 319 std::unique_ptr<WebSharedWorkerServer> m_sharedWorkerServer; 326 320 327 String m_idbDatabasePath;328 RefPtr<WebIDBServer> m_webIDBServer;329 330 321 RefPtr<NetworkStorageManager> m_storageManager; 331 322 RefPtr<CacheStorage::Engine> m_cacheEngine; -
trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.cpp
r289419 r289474 32 32 #include "NetworkProcess.h" 33 33 #include "NetworkSession.h" 34 #include "NetworkStorageManager.h" 34 35 #include "WebsiteDataType.h" 35 36 #include <WebCore/CacheQueryOptions.h> … … 204 205 } 205 206 206 uint64_t Engine::diskUsage(const String& rootPath, const WebCore::ClientOrigin& origin)207 String Engine::storagePath(const String& rootDirectory, const WebCore::ClientOrigin& origin) 207 208 { 208 209 ASSERT(!isMainRunLoop()); 209 210 if (root Path.isEmpty())211 return 0;212 213 String saltPath = FileSystem::pathByAppendingComponent(root Path, "salt"_s);210 211 if (rootDirectory.isEmpty()) 212 return emptyString(); 213 214 String saltPath = FileSystem::pathByAppendingComponent(rootDirectory, "salt"_s); 214 215 auto salt = FileSystem::readOrMakeSalt(saltPath); 215 216 if (!salt) 217 return emptyString(); 218 219 Key key(origin.topOrigin.toString(), origin.clientOrigin.toString(), { }, { }, *salt); 220 return FileSystem::pathByAppendingComponent(rootDirectory, key.hashAsString()); 221 } 222 223 uint64_t Engine::diskUsage(const String& originDirectory) 224 { 225 ASSERT(!isMainRunLoop()); 226 227 if (originDirectory.isEmpty()) 216 228 return 0; 217 229 218 Key key(origin.topOrigin.toString(), origin.clientOrigin.toString(), { }, { }, *salt); 219 String directoryPath = FileSystem::pathByAppendingComponent(rootPath, key.hashAsString()); 220 221 String sizeFilePath = Caches::cachesSizeFilename(directoryPath); 230 String sizeFilePath = Caches::cachesSizeFilename(originDirectory); 222 231 if (auto recordedSize = readSizeFile(sizeFilePath)) 223 232 return *recordedSize; 224 233 225 return getDirectorySize( directoryPath);226 } 227 228 void Engine::requestSpace(const WebCore::ClientOrigin& origin, uint64_t spaceRequested, CompletionHandler<void( WebCore::StorageQuotaManager::Decision)>&& callback)234 return getDirectorySize(originDirectory); 235 } 236 237 void Engine::requestSpace(const WebCore::ClientOrigin& origin, uint64_t spaceRequested, CompletionHandler<void(bool)>&& callback) 229 238 { 230 239 ASSERT(isMainThread()); 231 240 232 241 if (!m_networkProcess) 233 callback(WebCore::StorageQuotaManager::Decision::Deny); 234 235 RefPtr<WebCore::StorageQuotaManager> storageQuotaManager = m_networkProcess->storageQuotaManager(m_sessionID, origin); 236 if (!storageQuotaManager) 237 callback(WebCore::StorageQuotaManager::Decision::Deny); 238 239 storageQuotaManager->requestSpaceOnMainThread(spaceRequested, WTFMove(callback)); 242 callback(false); 243 244 auto* session = m_networkProcess->networkSession(m_sessionID); 245 if (!session) 246 callback(false); 247 248 auto* storageManager = session->storageManager(); 249 if (!storageManager) 250 callback(false); 251 252 storageManager->requestSpace(origin, spaceRequested, WTFMove(callback)); 240 253 } 241 254 -
trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngine.h
r287229 r289474 30 30 #include "WebsiteData.h" 31 31 #include <WebCore/ClientOrigin.h> 32 #include <WebCore/StorageQuotaManager.h>33 32 #include <pal/SessionID.h> 34 33 #include <wtf/HashMap.h> … … 85 84 static void initializeQuotaUser(NetworkSession&, const WebCore::ClientOrigin&, CompletionHandler<void()>&&); 86 85 87 static uint64_t diskUsage(const String& rootPath, const WebCore::ClientOrigin&); 88 void requestSpace(const WebCore::ClientOrigin&, uint64_t spaceRequested, CompletionHandler<void(WebCore::StorageQuotaManager::Decision)>&&); 86 static String storagePath(const String& rootDirectory, const WebCore::ClientOrigin&); 87 static uint64_t diskUsage(const String& originDirectory); 88 void requestSpace(const WebCore::ClientOrigin&, uint64_t spaceRequested, CompletionHandler<void(bool)>&&); 89 89 90 90 bool shouldPersist() const { return !!m_ioQueue;} -
trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCaches.cpp
r288950 r289474 525 525 } 526 526 527 m_engine->requestSpace(m_origin, spaceRequired, [callback = WTFMove(callback)](auto decision) mutable { 528 switch (decision) { 529 case WebCore::StorageQuotaManager::Decision::Deny: 530 callback(Error::QuotaExceeded); 531 return; 532 case WebCore::StorageQuotaManager::Decision::Grant: 533 callback({ }); 534 }; 527 m_engine->requestSpace(m_origin, spaceRequired, [callback = WTFMove(callback)](bool granted) mutable { 528 if (!granted) 529 return callback(Error::QuotaExceeded); 530 callback({ }); 535 531 }); 536 532 } -
trunk/Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm
r287159 r289474 110 110 // while holding a locked file. We would get killed if suspended while holding locked files. 111 111 m_holdingLockedFileAssertion = ProcessAssertion::create(getCurrentProcessID(), "Network Process is holding locked files"_s, ProcessAssertionType::FinishTaskInterruptable, ProcessAssertion::Mode::Sync); 112 m_holdingLockedFileAssertion->setPrepareForInvalidationHandler([this, weakThis = WeakPtr { *this }]() mutable {113 ASSERT(isMainRunLoop());114 if (!weakThis)115 return;116 117 if (!m_shouldSuspendIDBServers)118 return;119 120 forEachNetworkSession([](auto& session) {121 if (auto* server = session.webIDBServer())122 server->suspend();123 });124 });125 112 } 126 113 -
trunk/Source/WebKit/NetworkProcess/storage/IDBStorageRegistry.h
r289473 r289474 27 27 28 28 #include "Connection.h" 29 #include <wtf/text/WTFString.h> 29 #include <WebCore/IDBResourceIdentifier.h> 30 #include <wtf/WeakPtr.h> 30 31 31 32 namespace WebCore { 32 struct ClientOrigin; 33 namespace IDBServer { 34 class UniqueIDBDatabaseConnection; 35 class UniqueIDBDatabaseTransaction; 36 } 33 37 } 34 38 35 39 namespace WebKit { 36 40 37 class FileSystemStorageHandleRegistry; 38 class FileSystemStorageManager; 39 class LocalStorageManager; 40 class SessionStorageManager; 41 class StorageAreaRegistry; 42 enum class WebsiteDataType : uint32_t; 41 class IDBStorageConnectionToClient; 43 42 44 class OriginStorageManager{43 class IDBStorageRegistry { 45 44 WTF_MAKE_FAST_ALLOCATED; 46 45 public: 47 OriginStorageManager(String&& path, String&& localStoragePath); 48 ~OriginStorageManager(); 49 50 void connectionClosed(IPC::Connection::UniqueID); 51 bool persisted() const { return m_persisted; } 52 void setPersisted(bool value); 53 FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&); 54 LocalStorageManager& localStorageManager(StorageAreaRegistry&); 55 LocalStorageManager* existingLocalStorageManager(); 56 SessionStorageManager& sessionStorageManager(StorageAreaRegistry&); 57 SessionStorageManager* existingSessionStorageManager(); 58 bool isActive(); 59 bool isEmpty(); 60 OptionSet<WebsiteDataType> fetchDataTypesInList(OptionSet<WebsiteDataType>); 61 void deleteData(OptionSet<WebsiteDataType>, WallTime); 62 void moveData(const String& newPath, const String& localStoragePath); 46 IDBStorageRegistry(); 47 WebCore::IDBServer::IDBConnectionToClient& ensureConnectionToClient(IPC::Connection::UniqueID, WebCore::IDBConnectionIdentifier); 48 void removeConnectionToClient(IPC::Connection::UniqueID); 49 void registerConnection(WebCore::IDBServer::UniqueIDBDatabaseConnection&); 50 void unregisterConnection(WebCore::IDBServer::UniqueIDBDatabaseConnection&); 51 WebCore::IDBServer::UniqueIDBDatabaseConnection* connection(uint64_t identifier); 52 void registerTransaction(WebCore::IDBServer::UniqueIDBDatabaseTransaction&); 53 void unregisterTransaction(WebCore::IDBServer::UniqueIDBDatabaseTransaction&); 54 WebCore::IDBServer::UniqueIDBDatabaseTransaction* transaction(WebCore::IDBResourceIdentifier); 63 55 64 56 private: 65 enum class StorageBucketMode : bool; 66 class StorageBucket; 67 StorageBucket& defaultBucket(); 68 69 void createOriginFileIfNecessary(const WebCore::ClientOrigin&); 70 void deleteOriginFileIfNecessary(); 71 72 std::unique_ptr<StorageBucket> m_defaultBucket; 73 String m_path; 74 bool m_persisted { false }; 75 String m_localStoragePath; 57 HashMap<WebCore::IDBConnectionIdentifier, std::unique_ptr<IDBStorageConnectionToClient>> m_connectionsToClient; 58 HashMap<uint64_t, WeakPtr<WebCore::IDBServer::UniqueIDBDatabaseConnection>> m_connections; 59 HashMap<WebCore::IDBResourceIdentifier, WeakPtr<WebCore::IDBServer::UniqueIDBDatabaseTransaction>> m_transactions; 76 60 }; 77 61 78 62 } // namespace WebKit 79 -
trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp
r289081 r289474 27 27 #include "NetworkStorageManager.h" 28 28 29 #include "CacheStorageEngine.h" 29 30 #include "FileSystemStorageHandleRegistry.h" 30 31 #include "FileSystemStorageManager.h" 32 #include "IDBStorageConnectionToClient.h" 33 #include "IDBStorageManager.h" 34 #include "IDBStorageRegistry.h" 31 35 #include "LocalStorageManager.h" 32 36 #include "Logging.h" 37 #include "NetworkProcessProxyMessages.h" 33 38 #include "NetworkStorageManagerMessages.h" 34 39 #include "OriginStorageManager.h" 40 #include "QuotaManager.h" 35 41 #include "SessionStorageManager.h" 36 42 #include "StorageAreaBase.h" … … 39 45 #include "WebsiteDataType.h" 40 46 #include <WebCore/SecurityOriginData.h> 47 #include <WebCore/UniqueIDBDatabaseConnection.h> 48 #include <WebCore/UniqueIDBDatabaseTransaction.h> 41 49 #include <pal/crypto/CryptoDigest.h> 42 50 #include <wtf/Scope.h> … … 101 109 } 102 110 103 Ref<NetworkStorageManager> NetworkStorageManager::create(PAL::SessionID sessionID, const String& path, const String& customLocalStoragePath)104 { 105 return adoptRef(*new NetworkStorageManager(sessionID, path, customLocalStoragePath));106 } 107 108 NetworkStorageManager::NetworkStorageManager(PAL::SessionID sessionID, const String& path, const String& customLocalStoragePath)111 Ref<NetworkStorageManager> NetworkStorageManager::create(PAL::SessionID sessionID, IPC::Connection::UniqueID connection, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, uint64_t defaultOriginQuota, uint64_t defaultThirdPartyOriginQuota) 112 { 113 return adoptRef(*new NetworkStorageManager(sessionID, connection, path, customLocalStoragePath, customIDBStoragePath, customCacheStoragePath, defaultOriginQuota, defaultThirdPartyOriginQuota)); 114 } 115 116 NetworkStorageManager::NetworkStorageManager(PAL::SessionID sessionID, IPC::Connection::UniqueID connection, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, uint64_t defaultOriginQuota, uint64_t defaultThirdPartyOriginQuota) 109 117 : m_sessionID(sessionID) 110 118 , m_queue(SuspendableWorkQueue::create("com.apple.WebKit.Storage")) 111 { 112 ASSERT(RunLoop::isMain()); 113 114 m_queue->dispatch([this, protectedThis = Ref { *this }, path = path.isolatedCopy(), customLocalStoragePath = crossThreadCopy(customLocalStoragePath)]() mutable { 119 , m_defaultOriginQuota(defaultOriginQuota) 120 , m_defaultThirdPartyOriginQuota(defaultThirdPartyOriginQuota) 121 , m_parentConnection(connection) 122 { 123 ASSERT(RunLoop::isMain()); 124 125 m_queue->dispatch([this, protectedThis = Ref { *this }, path = path.isolatedCopy(), customLocalStoragePath = crossThreadCopy(customLocalStoragePath), customIDBStoragePath = crossThreadCopy(customIDBStoragePath), customCacheStoragePath = crossThreadCopy(customCacheStoragePath)]() mutable { 115 126 m_fileSystemStorageHandleRegistry = makeUnique<FileSystemStorageHandleRegistry>(); 116 127 m_storageAreaRegistry = makeUnique<StorageAreaRegistry>(); 128 m_idbStorageRegistry = makeUnique<IDBStorageRegistry>(); 117 129 m_path = path; 118 130 m_customLocalStoragePath = customLocalStoragePath; 131 m_customIDBStoragePath = customIDBStoragePath; 132 m_customCacheStoragePath = customCacheStoragePath; 119 133 if (!m_path.isEmpty()) { 120 134 auto saltPath = FileSystem::pathByAppendingComponent(m_path, "salt"); … … 132 146 bool NetworkStorageManager::canHandleTypes(OptionSet<WebsiteDataType> types) 133 147 { 134 return types.contains(WebsiteDataType::LocalStorage) || types.contains(WebsiteDataType::SessionStorage) || types.contains(WebsiteDataType::FileSystem); 148 return types.contains(WebsiteDataType::LocalStorage) 149 || types.contains(WebsiteDataType::SessionStorage) 150 || types.contains(WebsiteDataType::FileSystem) 151 || types.contains(WebsiteDataType::IndexedDBDatabases); 135 152 } 136 153 … … 171 188 connection.removeWorkQueueMessageReceiver(Messages::NetworkStorageManager::messageReceiverName()); 172 189 m_queue->dispatch([this, protectedThis = Ref { *this }, connection = connection.uniqueID()]() mutable { 190 m_idbStorageRegistry->removeConnectionToClient(connection); 173 191 m_localOriginStorageManagers.removeIf([&](auto& entry) { 174 192 auto& manager = entry.value; … … 223 241 }); 224 242 } 225 return makeUnique<OriginStorageManager>(WTFMove(originDirectory), LocalStorageManager::localStorageFilePath(m_customLocalStoragePath, origin)); 243 auto localStoragePath = LocalStorageManager::localStorageFilePath(m_customLocalStoragePath, origin); 244 auto idbStoragePath = IDBStorageManager::idbStorageOriginDirectory(m_customIDBStoragePath, origin); 245 auto cacheStoragePath = CacheStorage::Engine::storagePath(m_customCacheStoragePath, origin); 246 uint64_t quota = origin.topOrigin == origin.clientOrigin ? m_defaultOriginQuota : m_defaultThirdPartyOriginQuota; 247 QuotaManager::IncreaseQuotaFunction increaseQuotaFunction = [sessionID = m_sessionID, origin, connection = m_parentConnection] (auto identifier, auto currentQuota, auto currentUsage, auto requestedIncrease) mutable { 248 IPC::Connection::send(connection, Messages::NetworkProcessProxy::IncreaseQuota(sessionID, origin, identifier, currentQuota, currentUsage, requestedIncrease), 0); 249 }; 250 return makeUnique<OriginStorageManager>(quota, WTFMove(increaseQuotaFunction), WTFMove(originDirectory), WTFMove(localStoragePath), WTFMove(idbStoragePath), WTFMove(cacheStoragePath)); 226 251 }).iterator->value; 227 252 } … … 280 305 completionHandler(); 281 306 }); 307 }); 308 } 309 310 void NetworkStorageManager::didIncreaseQuota(const WebCore::ClientOrigin& origin, QuotaIncreaseRequestIdentifier identifier, std::optional<uint64_t> newQuota) 311 { 312 ASSERT(RunLoop::isMain()); 313 314 m_queue->dispatch([this, protectedThis = Ref { *this }, origin = crossThreadCopy(origin), identifier, newQuota]() mutable { 315 if (auto manager = m_localOriginStorageManagers.get(origin)) 316 manager->quotaManager().didIncreaseQuota(identifier, newQuota); 282 317 }); 283 318 } … … 453 488 allOrigins.add(WebCore::ClientOrigin { origin, origin }); 454 489 490 for (auto& origin : IDBStorageManager::originsOfIDBStorageData(m_customIDBStoragePath)) 491 allOrigins.add(origin); 492 455 493 return allOrigins; 456 494 } … … 580 618 581 619 // Clear existing data of target origin. 582 OptionSet<WebsiteDataType> types = { WebsiteDataType::FileSystem, WebsiteDataType::LocalStorage, WebsiteDataType::SessionStorage }; 620 OptionSet<WebsiteDataType> types = { 621 WebsiteDataType::FileSystem, 622 WebsiteDataType::LocalStorage, 623 WebsiteDataType::SessionStorage, 624 WebsiteDataType::IndexedDBDatabases 625 }; 583 626 localOriginStorageManager(targetOrigin).deleteData(types, -WallTime::infinity()); 584 627 removeOriginStorageManagerIfPossible(targetOrigin); 585 628 586 629 // Move data from source origin to target origin. 587 localOriginStorageManager(sourceOrigin).moveData(originDirectoryPath(m_path, targetOrigin, m_salt), LocalStorageManager::localStorageFilePath(m_customLocalStoragePath, targetOrigin) );630 localOriginStorageManager(sourceOrigin).moveData(originDirectoryPath(m_path, targetOrigin, m_salt), LocalStorageManager::localStorageFilePath(m_customLocalStoragePath, targetOrigin), IDBStorageManager::idbStorageOriginDirectory(m_customIDBStoragePath, targetOrigin)); 588 631 removeOriginStorageManagerIfPossible(sourceOrigin); 589 632 … … 600 643 if (auto localStorageManager = manager->existingLocalStorageManager()) 601 644 localStorageManager->syncLocalStorage(); 645 if (auto idbStorageManager = manager->existingIDBStorageManager()) 646 idbStorageManager->stopDatabaseActivitiesForSuspend(); 602 647 } 603 648 }, WTFMove(completionHandler)); … … 634 679 635 680 RunLoop::main().dispatch(WTFMove(completionHandler)); 681 }); 682 } 683 684 void NetworkStorageManager::registerTemporaryBlobFilePaths(IPC::Connection& connection, const Vector<String>& filePaths) 685 { 686 ASSERT(RunLoop::isMain()); 687 688 m_queue->dispatch([this, protectedThis = Ref { *this }, connectionID = connection.uniqueID(), filePaths = crossThreadCopy(filePaths)] { 689 auto& temporaryBlobPaths = m_temporaryBlobPathsByConnection.ensure(connectionID, [] { 690 return HashSet<String> { }; 691 }).iterator->value; 692 temporaryBlobPaths.add(filePaths.begin(), filePaths.end()); 693 }); 694 } 695 696 void NetworkStorageManager::requestSpace(const WebCore::ClientOrigin& origin, uint64_t size, CompletionHandler<void(bool)>&& completionHandler) 697 { 698 ASSERT(RunLoop::isMain()); 699 700 m_queue->dispatch([this, protectedThis = Ref { *this }, origin = crossThreadCopy(origin), size, completionHandler = WTFMove(completionHandler)]() mutable { 701 localOriginStorageManager(origin).quotaManager().requestSpace(size, [completionHandler = WTFMove(completionHandler)](auto decision) mutable { 702 RunLoop::main().dispatch([completionHandler = WTFMove(completionHandler), decision]() mutable { 703 completionHandler(decision == QuotaManager::Decision::Grant); 704 }); 705 }); 706 }); 707 } 708 709 void NetworkStorageManager::resetQuotaForTesting(CompletionHandler<void()>&& completionHandler) 710 { 711 ASSERT(RunLoop::isMain()); 712 713 m_queue->dispatch([this, protectedThis = Ref { *this }, completionHandler = WTFMove(completionHandler)]() mutable { 714 for (auto& manager : m_localOriginStorageManagers.values()) 715 manager->quotaManager().resetQuotaForTesting(); 716 RunLoop::main().dispatch(WTFMove(completionHandler)); 717 }); 718 } 719 720 void NetworkStorageManager::resetQuotaUpdatedBasedOnUsageForTesting(const WebCore::ClientOrigin& origin) 721 { 722 ASSERT(RunLoop::isMain()); 723 724 m_queue->dispatch([this, protectedThis = Ref { *this }, origin = crossThreadCopy(origin)]() mutable { 725 if (auto manager = m_localOriginStorageManagers.get(origin)) 726 manager->quotaManager().resetQuotaUpdatedBasedOnUsageForTesting(); 636 727 }); 637 728 } … … 724 815 } 725 816 817 void NetworkStorageManager::openDatabase(IPC::Connection& connection, const WebCore::IDBRequestData& requestData) 818 { 819 auto& connectionToClient = m_idbStorageRegistry->ensureConnectionToClient(connection.uniqueID(), requestData.requestIdentifier().connectionIdentifier()); 820 localOriginStorageManager(requestData.databaseIdentifier().origin()).idbStorageManager(*m_idbStorageRegistry).openDatabase(connectionToClient, requestData); 821 } 822 823 void NetworkStorageManager::openDBRequestCancelled(const WebCore::IDBRequestData& requestData) 824 { 825 localOriginStorageManager(requestData.databaseIdentifier().origin()).idbStorageManager(*m_idbStorageRegistry).openDBRequestCancelled(requestData); 826 } 827 828 void NetworkStorageManager::deleteDatabase(IPC::Connection& connection, const WebCore::IDBRequestData& requestData) 829 { 830 auto& connectionToClient = m_idbStorageRegistry->ensureConnectionToClient(connection.uniqueID(), requestData.requestIdentifier().connectionIdentifier()); 831 localOriginStorageManager(requestData.databaseIdentifier().origin()).idbStorageManager(*m_idbStorageRegistry).deleteDatabase(connectionToClient, requestData); 832 } 833 834 void NetworkStorageManager::establishTransaction(uint64_t databaseConnectionIdentifier, const WebCore::IDBTransactionInfo& transactionInfo) 835 { 836 if (auto connection = m_idbStorageRegistry->connection(databaseConnectionIdentifier)) 837 connection->establishTransaction(transactionInfo); 838 } 839 840 void NetworkStorageManager::databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier) 841 { 842 if (auto connection = m_idbStorageRegistry->connection(databaseConnectionIdentifier)) 843 connection->connectionPendingCloseFromClient(); 844 } 845 846 void NetworkStorageManager::databaseConnectionClosed(uint64_t databaseConnectionIdentifier) 847 { 848 if (auto connection = m_idbStorageRegistry->connection(databaseConnectionIdentifier)) 849 connection->connectionClosedFromClient(); 850 } 851 852 void NetworkStorageManager::abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& transactionIdentifier) 853 { 854 if (auto transaction = m_idbStorageRegistry->transaction(transactionIdentifier)) 855 transaction->abortWithoutCallback(); 856 857 if (auto connection = m_idbStorageRegistry->connection(databaseConnectionIdentifier)) 858 connection->connectionClosedFromClient(); 859 } 860 861 void NetworkStorageManager::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& requestIdentifier, const WebCore::IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed) 862 { 863 if (auto connection = m_idbStorageRegistry->connection(databaseConnectionIdentifier)) 864 connection->didFireVersionChangeEvent(requestIdentifier, connectionClosed); 865 } 866 867 void NetworkStorageManager::abortTransaction(const WebCore::IDBResourceIdentifier& transactionIdentifier) 868 { 869 if (auto transaction = m_idbStorageRegistry->transaction(transactionIdentifier)) 870 transaction->abort(); 871 } 872 873 void NetworkStorageManager::commitTransaction(const WebCore::IDBResourceIdentifier& transactionIdentifier, uint64_t pendingRequestCount) 874 { 875 if (auto transaction = m_idbStorageRegistry->transaction(transactionIdentifier)) 876 transaction->commit(pendingRequestCount); 877 } 878 879 void NetworkStorageManager::didFinishHandlingVersionChangeTransaction(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& transactionIdentifier) 880 { 881 if (auto connection = m_idbStorageRegistry->connection(databaseConnectionIdentifier)) 882 connection->didFinishHandlingVersionChange(transactionIdentifier); 883 } 884 885 void NetworkStorageManager::createObjectStore(const WebCore::IDBRequestData& requestData, const WebCore::IDBObjectStoreInfo& objectStoreInfo) 886 { 887 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) { 888 ASSERT(transaction->isVersionChange()); 889 transaction->createObjectStore(requestData, objectStoreInfo); 890 } 891 } 892 893 void NetworkStorageManager::deleteObjectStore(const WebCore::IDBRequestData& requestData, const String& objectStoreName) 894 { 895 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) { 896 ASSERT(transaction->isVersionChange()); 897 transaction->deleteObjectStore(requestData, objectStoreName); 898 } 899 } 900 901 void NetworkStorageManager::renameObjectStore(const WebCore::IDBRequestData& requestData, uint64_t objectStoreIdentifier, const String& newName) 902 { 903 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) { 904 ASSERT(transaction->isVersionChange()); 905 transaction->renameObjectStore(requestData, objectStoreIdentifier, newName); 906 } 907 } 908 909 void NetworkStorageManager::clearObjectStore(const WebCore::IDBRequestData& requestData, uint64_t objectStoreIdentifier) 910 { 911 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 912 transaction->clearObjectStore(requestData, objectStoreIdentifier); 913 } 914 915 void NetworkStorageManager::createIndex(const WebCore::IDBRequestData& requestData, const WebCore::IDBIndexInfo& indexInfo) 916 { 917 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 918 transaction->createIndex(requestData, indexInfo); 919 } 920 921 void NetworkStorageManager::deleteIndex(const WebCore::IDBRequestData& requestData, uint64_t objectStoreIdentifier, const String& indexName) 922 { 923 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 924 transaction->deleteIndex(requestData, objectStoreIdentifier, indexName); 925 } 926 927 void NetworkStorageManager::renameIndex(const WebCore::IDBRequestData& requestData, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName) 928 { 929 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 930 transaction->renameIndex(requestData, objectStoreIdentifier, indexIdentifier, newName); 931 } 932 933 void NetworkStorageManager::putOrAdd(IPC::Connection& connection, const WebCore::IDBRequestData& requestData, const WebCore::IDBKeyData& keyData, const WebCore::IDBValue& value, WebCore::IndexedDB::ObjectStoreOverwriteMode overwriteMode) 934 { 935 if (value.blobURLs().size() != value.blobFilePaths().size()) { 936 RELEASE_LOG_FAULT(IndexedDB, "NetworkStorageManager::putOrAdd: Number of blob URLs doesn't match the number of blob file paths."); 937 ASSERT_NOT_REACHED(); 938 return; 939 } 940 941 // Validate temporary blob paths in |value| to make sure they belong to the source process. 942 if (!value.blobFilePaths().isEmpty()) { 943 auto it = m_temporaryBlobPathsByConnection.find(connection.uniqueID()); 944 if (it == m_temporaryBlobPathsByConnection.end()) { 945 RELEASE_LOG_FAULT(IndexedDB, "NetworkStorageManager::putOrAdd: IDBValue contains blob paths but none are allowed for this process"); 946 ASSERT_NOT_REACHED(); 947 return; 948 } 949 950 auto& temporaryBlobPathsForConnection = it->value; 951 for (auto& blobFilePath : value.blobFilePaths()) { 952 if (!temporaryBlobPathsForConnection.remove(blobFilePath)) { 953 RELEASE_LOG_FAULT(IndexedDB, "NetworkStorageManager::putOrAdd: Blob path was not created for this WebProcess"); 954 ASSERT_NOT_REACHED(); 955 return; 956 } 957 } 958 } 959 960 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 961 transaction->putOrAdd(requestData, keyData, value, overwriteMode); 962 } 963 964 void NetworkStorageManager::getRecord(const WebCore::IDBRequestData& requestData, const WebCore::IDBGetRecordData& getRecordData) 965 { 966 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 967 transaction->getRecord(requestData, getRecordData); 968 } 969 970 void NetworkStorageManager::getAllRecords(const WebCore::IDBRequestData& requestData, const WebCore::IDBGetAllRecordsData& getAllRecordsData) 971 { 972 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 973 transaction->getAllRecords(requestData, getAllRecordsData); 974 } 975 976 void NetworkStorageManager::getCount(const WebCore::IDBRequestData& requestData, const WebCore::IDBKeyRangeData& keyRangeData) 977 { 978 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 979 transaction->getCount(requestData, keyRangeData); 980 } 981 982 void NetworkStorageManager::deleteRecord(const WebCore::IDBRequestData& requestData, const WebCore::IDBKeyRangeData& keyRangeData) 983 { 984 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 985 transaction->deleteRecord(requestData, keyRangeData); 986 } 987 988 void NetworkStorageManager::openCursor(const WebCore::IDBRequestData& requestData, const WebCore::IDBCursorInfo& cursorInfo) 989 { 990 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 991 transaction->openCursor(requestData, cursorInfo); 992 } 993 994 void NetworkStorageManager::iterateCursor(const WebCore::IDBRequestData& requestData, const WebCore::IDBIterateCursorData& cursorData) 995 { 996 if (auto transaction = m_idbStorageRegistry->transaction(requestData.transactionIdentifier())) 997 transaction->iterateCursor(requestData, cursorData); 998 } 999 1000 void NetworkStorageManager::getAllDatabaseNamesAndVersions(IPC::Connection& connection, const WebCore::IDBResourceIdentifier& requestIdentifier, const WebCore::ClientOrigin& origin) 1001 { 1002 auto& connectionToClient = m_idbStorageRegistry->ensureConnectionToClient(connection.uniqueID(), requestIdentifier.connectionIdentifier()); 1003 auto result = localOriginStorageManager(origin).idbStorageManager(*m_idbStorageRegistry).getAllDatabaseNamesAndVersions(); 1004 connectionToClient.didGetAllDatabaseNamesAndVersions(requestIdentifier, WTFMove(result)); 1005 } 1006 726 1007 } // namespace WebKit 727 1008 -
trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h
r288551 r289474 37 37 #include <WebCore/FileSystemHandleIdentifier.h> 38 38 #include <WebCore/FileSystemSyncAccessHandleIdentifier.h> 39 #include <WebCore/IDBResourceIdentifier.h> 40 #include <WebCore/IndexedDB.h> 39 41 #include <pal/SessionID.h> 40 42 #include <wtf/Forward.h> … … 45 47 46 48 namespace WebCore { 49 class IDBCursorInfo; 50 class IDBKeyData; 51 class IDBIndexInfo; 52 class IDBObjectStoreInfo; 53 class IDBRequestData; 54 class IDBTransactionInfo; 55 class IDBValue; 47 56 struct ClientOrigin; 57 struct IDBGetAllRecordsData; 58 struct IDBGetRecordData; 59 struct IDBGetAllRecordsData; 60 struct IDBIterateCursorData; 61 struct IDBKeyRangeData; 48 62 enum class StorageType : uint8_t; 49 63 } … … 52 66 53 67 class FileSystemStorageHandleRegistry; 68 class IDBStorageRegistry; 54 69 class StorageAreaRegistry; 55 70 56 71 class NetworkStorageManager final : public IPC::Connection::WorkQueueMessageReceiver { 57 72 public: 58 static Ref<NetworkStorageManager> create(PAL::SessionID, const String& path, const String& customLocalStoragePath);73 static Ref<NetworkStorageManager> create(PAL::SessionID, IPC::Connection::UniqueID, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, uint64_t defaultOriginQuota, uint64_t defaultThirdPartyOriginQuota); 59 74 static bool canHandleTypes(OptionSet<WebsiteDataType>); 60 75 … … 65 80 void close(); 66 81 void clearStorageForTesting(CompletionHandler<void()>&&); 82 void didIncreaseQuota(const WebCore::ClientOrigin&, QuotaIncreaseRequestIdentifier, std::optional<uint64_t> newQuota); 67 83 void fetchData(OptionSet<WebsiteDataType>, CompletionHandler<void(Vector<WebsiteData::Entry>&&)>&&); 68 84 void deleteData(OptionSet<WebsiteDataType>, const Vector<WebCore::SecurityOriginData>&, CompletionHandler<void()>&&); … … 74 90 void handleLowMemoryWarning(); 75 91 void syncLocalStorage(CompletionHandler<void()>&&); 92 void registerTemporaryBlobFilePaths(IPC::Connection&, const Vector<String>&); 93 void requestSpace(const WebCore::ClientOrigin&, uint64_t size, CompletionHandler<void(bool)>&&); 94 void resetQuotaForTesting(CompletionHandler<void()>&&); 95 void resetQuotaUpdatedBasedOnUsageForTesting(const WebCore::ClientOrigin&); 76 96 77 97 private: 78 98 NetworkStorageManager(PAL::SessionID, const String& path, const String& customLocalStoragePath); 99 NetworkStorageManager(PAL::SessionID, IPC::Connection::UniqueID, const String& path, const String& customLocalStoragePath, const String& customIDBStoragePath, const String& customCacheStoragePath, uint64_t defaultOriginQuota, uint64_t defaultThirdPartyOriginQuota); 79 100 ~NetworkStorageManager(); 80 101 OriginStorageManager& localOriginStorageManager(const WebCore::ClientOrigin&); 81 102 bool removeOriginStorageManagerIfPossible(const WebCore::ClientOrigin&); 82 103 void deleteOriginDirectoryIfPossible(const WebCore::ClientOrigin&); 83 FileSystemStorageHandleRegistry& fileSystemStorageHandleRegistry();84 104 85 105 void forEachOriginDirectory(const Function<void(const String&)>&); … … 119 139 void clear(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, String&& urlString, CompletionHandler<void()>&&); 120 140 141 // Message handlers for IndexedDB. 142 void openDatabase(IPC::Connection&, const WebCore::IDBRequestData&); 143 void openDBRequestCancelled(const WebCore::IDBRequestData&); 144 void deleteDatabase(IPC::Connection&, const WebCore::IDBRequestData&); 145 void establishTransaction(uint64_t databaseConnectionIdentifier, const WebCore::IDBTransactionInfo&); 146 void databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier); 147 void databaseConnectionClosed(uint64_t databaseConnectionIdentifier); 148 void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& transactionIdentifier); 149 void didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& requestIdentifier, const WebCore::IndexedDB::ConnectionClosedOnBehalfOfServer); 150 void abortTransaction(const WebCore::IDBResourceIdentifier&); 151 void commitTransaction(const WebCore::IDBResourceIdentifier&, uint64_t pendingRequestCount); 152 void didFinishHandlingVersionChangeTransaction(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier&); 153 void createObjectStore(const WebCore::IDBRequestData&, const WebCore::IDBObjectStoreInfo&); 154 void deleteObjectStore(const WebCore::IDBRequestData&, const String& objectStoreName); 155 void renameObjectStore(const WebCore::IDBRequestData&, uint64_t objectStoreIdentifier, const String& newName); 156 void clearObjectStore(const WebCore::IDBRequestData&, uint64_t objectStoreIdentifier); 157 void createIndex(const WebCore::IDBRequestData&, const WebCore::IDBIndexInfo&); 158 void deleteIndex(const WebCore::IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName); 159 void renameIndex(const WebCore::IDBRequestData&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName); 160 void putOrAdd(IPC::Connection&, const WebCore::IDBRequestData&, const WebCore::IDBKeyData&, const WebCore::IDBValue&, WebCore::IndexedDB::ObjectStoreOverwriteMode); 161 void getRecord(const WebCore::IDBRequestData&, const WebCore::IDBGetRecordData&); 162 void getAllRecords(const WebCore::IDBRequestData&, const WebCore::IDBGetAllRecordsData&); 163 void getCount(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&); 164 void deleteRecord(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&); 165 void openCursor(const WebCore::IDBRequestData&, const WebCore::IDBCursorInfo&); 166 void iterateCursor(const WebCore::IDBRequestData&, const WebCore::IDBIterateCursorData&); 167 void getAllDatabaseNamesAndVersions(IPC::Connection&, const WebCore::IDBResourceIdentifier&, const WebCore::ClientOrigin&); 168 121 169 PAL::SessionID m_sessionID; 122 170 Ref<SuspendableWorkQueue> m_queue; … … 128 176 std::unique_ptr<FileSystemStorageHandleRegistry> m_fileSystemStorageHandleRegistry; 129 177 std::unique_ptr<StorageAreaRegistry> m_storageAreaRegistry; 178 std::unique_ptr<IDBStorageRegistry> m_idbStorageRegistry; 130 179 String m_customLocalStoragePath; 180 String m_customIDBStoragePath; 181 String m_customCacheStoragePath; 182 uint64_t m_defaultOriginQuota; 183 uint64_t m_defaultThirdPartyOriginQuota; 184 IPC::Connection::UniqueID m_parentConnection; 185 HashMap<IPC::Connection::UniqueID, HashSet<String>> m_temporaryBlobPathsByConnection; 131 186 }; 132 187 -
trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in
r288551 r289474 48 48 RemoveItem(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, String key, String urlString) -> () Async WantsConnection 49 49 Clear(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, String urlString) -> () Async WantsConnection 50 51 OpenDatabase(WebCore::IDBRequestData requestData) WantsConnection 52 OpenDBRequestCancelled(WebCore::IDBRequestData requestData) 53 DeleteDatabase(WebCore::IDBRequestData requestData) WantsConnection 54 EstablishTransaction(uint64_t databaseConnectionIdentifier, WebCore::IDBTransactionInfo info) 55 DatabaseConnectionPendingClose(uint64_t databaseConnectionIdentifier) 56 DatabaseConnectionClosed(uint64_t databaseConnectionIdentifier) 57 AbortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, WebCore::IDBResourceIdentifier transactionIdentifier) 58 DidFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, WebCore::IDBResourceIdentifier requestIdentifier, WebCore::IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosedOnBehalfOfServer) 59 DidFinishHandlingVersionChangeTransaction(uint64_t databaseConnectionIdentifier, WebCore::IDBResourceIdentifier transactionIdentifier) 60 AbortTransaction(WebCore::IDBResourceIdentifier transactionIdentifier) 61 CommitTransaction(WebCore::IDBResourceIdentifier transactionIdentifier, uint64_t pendingRequestCount) 62 CreateObjectStore(WebCore::IDBRequestData requestData, WebCore::IDBObjectStoreInfo info) 63 DeleteObjectStore(WebCore::IDBRequestData requestData, String objectStoreName) 64 RenameObjectStore(WebCore::IDBRequestData requestData, uint64_t objectStoreIdentifier, String newName) 65 ClearObjectStore(WebCore::IDBRequestData requestData, uint64_t objectStoreIdentifier) 66 CreateIndex(WebCore::IDBRequestData requestData, WebCore::IDBIndexInfo info) 67 DeleteIndex(WebCore::IDBRequestData requestData, uint64_t objectStoreIdentifier, String indexName) 68 RenameIndex(WebCore::IDBRequestData requestData, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, String newName) 69 PutOrAdd(WebCore::IDBRequestData requestData, WebCore::IDBKeyData key, WebCore::IDBValue value, WebCore::IndexedDB::ObjectStoreOverwriteMode overwriteMode) WantsConnection 70 GetRecord(WebCore::IDBRequestData requestData, struct WebCore::IDBGetRecordData getRecordData) 71 GetAllRecords(WebCore::IDBRequestData requestData, struct WebCore::IDBGetAllRecordsData getAllRecordsData) 72 GetCount(WebCore::IDBRequestData requestData, struct WebCore::IDBKeyRangeData range) 73 DeleteRecord(WebCore::IDBRequestData requestData, struct WebCore::IDBKeyRangeData range) 74 OpenCursor(WebCore::IDBRequestData requestData, WebCore::IDBCursorInfo info) 75 IterateCursor(WebCore::IDBRequestData requestData, struct WebCore::IDBIterateCursorData data) 76 GetAllDatabaseNamesAndVersions(WebCore::IDBResourceIdentifier requestIdentifier, struct WebCore::ClientOrigin origin) WantsConnection 50 77 } -
trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp
r289200 r289474 27 27 #include "OriginStorageManager.h" 28 28 29 #include "CacheStorageEngine.h" 29 30 #include "FileSystemStorageHandleRegistry.h" 30 31 #include "FileSystemStorageManager.h" 32 #include "IDBStorageManager.h" 33 #include "IDBStorageRegistry.h" 31 34 #include "LocalStorageManager.h" 32 35 #include "MemoryStorageArea.h" … … 45 48 WTF_MAKE_FAST_ALLOCATED; 46 49 public: 47 StorageBucket(const String& rootPath, const String& identifier, const String& localStoragePath )50 StorageBucket(const String& rootPath, const String& identifier, const String& localStoragePath, const String& idbStoragePath) 48 51 : m_rootPath(rootPath) 49 52 , m_identifier(identifier) 50 53 , m_localStoragePath(localStoragePath) 54 , m_idbStoragePath(idbStoragePath) 51 55 { 52 56 } … … 71 75 LocalStorage, 72 76 SessionStorage, 77 IndexedDB, 73 78 }; 74 79 … … 81 86 if (storageIdentifier == "SessionStorage"_s) 82 87 return WebsiteDataType::SessionStorage; 88 if (storageIdentifier == "IndexedDB"_s) 89 return WebsiteDataType::IndexedDBDatabases; 83 90 84 91 return std::nullopt; … … 94 101 case StorageType::SessionStorage: 95 102 return "SessionStorage"_s; 103 case StorageType::IndexedDB: 104 return "IndexedDB"_s; 96 105 default: 97 106 break; … … 142 151 { 143 152 return m_sessionStorageManager.get(); 153 } 154 155 IDBStorageManager& idbStorageManager(IDBStorageRegistry& registry, IDBStorageManager::QuotaCheckFunction&& quotaCheckFunction) 156 { 157 if (!m_idbStorageManager) 158 m_idbStorageManager = makeUnique<IDBStorageManager>(m_idbStoragePath, registry, WTFMove(quotaCheckFunction)); 159 160 return *m_idbStorageManager; 161 } 162 163 IDBStorageManager* existingIDBStorageManager() 164 { 165 return m_idbStorageManager.get(); 144 166 } 145 167 … … 150 172 return (m_fileSystemStorageManager && m_fileSystemStorageManager->isActive()) 151 173 || (m_localStorageManager && (m_localStorageManager->hasDataInMemory() || m_localStorageManager->isActive())) 152 || (m_sessionStorageManager && (m_sessionStorageManager->hasDataInMemory() || m_sessionStorageManager->isActive())); 174 || (m_sessionStorageManager && (m_sessionStorageManager->hasDataInMemory() || m_sessionStorageManager->isActive())) 175 || (m_idbStorageManager && (m_idbStorageManager->hasDataInMemory() || m_idbStorageManager->isActive())); 153 176 } 154 177 … … 166 189 return false; 167 190 168 return !FileSystem::fileExists(m_localStoragePath); 191 FileSystem::deleteEmptyDirectory(m_idbStoragePath); 192 return !FileSystem::fileExists(m_localStoragePath) && !FileSystem::fileExists(m_idbStoragePath); 169 193 } 170 194 … … 187 211 if (types.contains(WebsiteDataType::SessionStorage) && modifiedSinceTime < WallTime::now()) 188 212 deleteSessionStorageData(); 189 } 190 191 void moveData(const String& path, const String& localStoragePath) 213 214 if (types.contains(WebsiteDataType::IndexedDBDatabases)) 215 deleteIDBStorageData(modifiedSinceTime); 216 } 217 218 void moveData(const String& path, const String& localStoragePath, const String& idbStoragePath) 192 219 { 193 220 m_fileSystemStorageManager = nullptr; … … 195 222 m_localStorageManager->close(); 196 223 224 if (m_idbStorageManager) 225 m_idbStorageManager->closeDatabasesForDeletion(); 226 197 227 FileSystem::makeAllDirectories(FileSystem::parentPath(path)); 198 228 FileSystem::moveFile(m_rootPath, path); … … 201 231 FileSystem::makeAllDirectories(FileSystem::parentPath(localStoragePath)); 202 232 WebCore::SQLiteFileSystem::moveDatabaseFile(m_localStoragePath, localStoragePath); 233 } 234 235 if (!m_idbStoragePath.isEmpty() && !idbStoragePath.isEmpty()) { 236 FileSystem::makeAllDirectories(FileSystem::parentPath(idbStoragePath)); 237 WebCore::SQLiteFileSystem::moveDatabaseFile(m_idbStoragePath, idbStoragePath); 203 238 } 204 239 } … … 218 253 } 219 254 255 if (types.contains(WebsiteDataType::IndexedDBDatabases)) { 256 if (m_idbStorageManager && m_idbStorageManager->hasDataInMemory()) 257 result.add(WebsiteDataType::IndexedDBDatabases); 258 } 259 220 260 return result; 221 261 } … … 234 274 } 235 275 276 if (types.contains(WebsiteDataType::IndexedDBDatabases) && !result.contains(WebsiteDataType::IndexedDBDatabases)) { 277 if (auto databases = FileSystem::listDirectory(m_idbStoragePath); !databases.isEmpty()) 278 result.add(WebsiteDataType::IndexedDBDatabases); 279 } 280 236 281 return result; 237 282 } … … 269 314 if (!m_sessionStorageManager->isActive()) 270 315 m_sessionStorageManager = nullptr; 316 } 317 318 void deleteIDBStorageData(WallTime time) 319 { 320 if (m_idbStorageManager) 321 m_idbStorageManager->closeDatabasesForDeletion(); 322 323 FileSystem::deleteAllFilesModifiedSince(m_idbStoragePath, time); 271 324 } 272 325 … … 278 331 String m_localStoragePath; 279 332 std::unique_ptr<SessionStorageManager> m_sessionStorageManager; 333 std::unique_ptr<IDBStorageManager> m_idbStorageManager; 334 String m_idbStoragePath; 280 335 }; 281 336 282 OriginStorageManager::OriginStorageManager(String&& path, String&& localStoragePath) 337 static Ref<QuotaManager> createQuotaManager(uint64_t quota, const String& idbStoragePath, const String& cacheStoragePath, QuotaManager::IncreaseQuotaFunction&& increaseQuotaFunction) 338 { 339 QuotaManager::GetUsageFunction getUsageFunction = [idbStoragePath, cacheStoragePath]() { 340 return IDBStorageManager::idbStorageSize(idbStoragePath) + CacheStorage::Engine::diskUsage(cacheStoragePath); 341 }; 342 return QuotaManager::create(quota, WTFMove(getUsageFunction), WTFMove(increaseQuotaFunction)); 343 } 344 345 OriginStorageManager::OriginStorageManager(uint64_t quota, QuotaManager::IncreaseQuotaFunction&& increaseQuotaFunction, String&& path, String&& localStoragePath, String&& idbStoragePath, String&& cacheStoragePath) 283 346 : m_path(WTFMove(path)) 284 347 , m_localStoragePath(WTFMove(localStoragePath)) 348 , m_idbStoragePath(WTFMove(idbStoragePath)) 349 , m_cacheStoragePath(WTFMove(cacheStoragePath)) 350 , m_quotaManager(createQuotaManager(quota, m_idbStoragePath, m_cacheStoragePath, WTFMove(increaseQuotaFunction))) 285 351 { 286 352 ASSERT(!RunLoop::isMain()); … … 298 364 { 299 365 if (!m_defaultBucket) 300 m_defaultBucket = makeUnique<StorageBucket>(m_path, "default"_s, m_localStoragePath );366 m_defaultBucket = makeUnique<StorageBucket>(m_path, "default"_s, m_localStoragePath, m_idbStoragePath); 301 367 302 368 return *m_defaultBucket; 303 369 } 304 370 371 QuotaManager& OriginStorageManager::quotaManager() 372 { 373 return m_quotaManager.get(); 374 } 375 305 376 FileSystemStorageManager& OriginStorageManager::fileSystemStorageManager(FileSystemStorageHandleRegistry& registry) 306 377 { … … 326 397 { 327 398 return defaultBucket().existingSessionStorageManager(); 399 } 400 401 IDBStorageManager& OriginStorageManager::idbStorageManager(IDBStorageRegistry& registry) 402 { 403 return defaultBucket().idbStorageManager(registry, [quotaManager = WeakPtr { this->quotaManager() }](uint64_t spaceRequested, CompletionHandler<void(bool)>&& completionHandler) mutable { 404 if (!quotaManager) 405 return completionHandler(false); 406 407 quotaManager->requestSpace(spaceRequested, [completionHandler = WTFMove(completionHandler)](auto decision) mutable { 408 completionHandler(decision == QuotaManager::Decision::Grant); 409 }); 410 }); 411 } 412 413 IDBStorageManager* OriginStorageManager::existingIDBStorageManager() 414 { 415 return defaultBucket().existingIDBStorageManager(); 328 416 } 329 417 … … 360 448 } 361 449 362 void OriginStorageManager::moveData(const String& newPath, const String& localStoragePath )450 void OriginStorageManager::moveData(const String& newPath, const String& localStoragePath, const String& idbStoragePath) 363 451 { 364 452 ASSERT(!RunLoop::isMain()); 365 453 366 defaultBucket().moveData(newPath, localStoragePath );454 defaultBucket().moveData(newPath, localStoragePath, idbStoragePath); 367 455 } 368 456 -
trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h
r289081 r289474 27 27 28 28 #include "Connection.h" 29 #include "QuotaManager.h" 29 30 #include <wtf/text/WTFString.h> 30 31 namespace WebCore {32 struct ClientOrigin;33 }34 31 35 32 namespace WebKit { … … 37 34 class FileSystemStorageHandleRegistry; 38 35 class FileSystemStorageManager; 36 class IDBStorageManager; 37 class IDBStorageRegistry; 39 38 class LocalStorageManager; 40 39 class SessionStorageManager; … … 45 44 WTF_MAKE_FAST_ALLOCATED; 46 45 public: 47 OriginStorageManager( String&& path, String&& localStoragePath);46 OriginStorageManager(uint64_t quota, QuotaManager::IncreaseQuotaFunction&&, String&& path, String&& localStoragePath, String&& idbStoragePath, String&& cacheStoragePath); 48 47 ~OriginStorageManager(); 49 48 … … 51 50 bool persisted() const { return m_persisted; } 52 51 void setPersisted(bool value); 52 QuotaManager& quotaManager(); 53 53 FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&); 54 54 LocalStorageManager& localStorageManager(StorageAreaRegistry&); … … 56 56 SessionStorageManager& sessionStorageManager(StorageAreaRegistry&); 57 57 SessionStorageManager* existingSessionStorageManager(); 58 IDBStorageManager& idbStorageManager(IDBStorageRegistry&); 59 IDBStorageManager* existingIDBStorageManager(); 58 60 bool isActive(); 59 61 bool isEmpty(); 60 62 OptionSet<WebsiteDataType> fetchDataTypesInList(OptionSet<WebsiteDataType>); 61 63 void deleteData(OptionSet<WebsiteDataType>, WallTime); 62 void moveData(const String& newPath, const String& localStoragePath );64 void moveData(const String& newPath, const String& localStoragePath, const String& idbStoragePath); 63 65 64 66 private: … … 67 69 StorageBucket& defaultBucket(); 68 70 69 void createOriginFileIfNecessary(const WebCore::ClientOrigin&);70 void deleteOriginFileIfNecessary();71 72 71 std::unique_ptr<StorageBucket> m_defaultBucket; 73 72 String m_path; 74 73 bool m_persisted { false }; 75 74 String m_localStoragePath; 75 String m_idbStoragePath; 76 String m_cacheStoragePath; 77 Ref<QuotaManager> m_quotaManager; 76 78 }; 77 79 -
trunk/Source/WebKit/Scripts/webkit/messages.py
r289247 r289474 289 289 'WebCore::PageIdentifier', 290 290 'WebCore::PlaybackTargetClientContextIdentifier', 291 'WebKit::QuotaIncreaseRequestIdentifier', 291 292 'WebCore::PluginLoadClientPolicy', 292 293 'WebCore::PointerID', -
trunk/Source/WebKit/Shared/WebsiteDataStoreParameters.h
r282130 r289474 72 72 SandboxExtension::Handle generalStorageDirectoryHandle; 73 73 74 uint64_t perOriginStorageQuota { WebCore::StorageQuotaManager::defaultQuota() };75 uint64_t perThirdPartyOriginStorageQuota { WebCore::StorageQuotaManager::defaultThirdPartyQuota() };74 uint64_t perOriginStorageQuota; 75 uint64_t perThirdPartyOriginStorageQuota; 76 76 }; 77 77 -
trunk/Source/WebKit/Sources.txt
r289247 r289474 150 150 NetworkProcess/storage/FileSystemStorageHandle.cpp 151 151 NetworkProcess/storage/FileSystemStorageHandleRegistry.cpp 152 NetworkProcess/storage/IDBStorageConnectionToClient.cpp 153 NetworkProcess/storage/IDBStorageManager.cpp 154 NetworkProcess/storage/IDBStorageRegistry.cpp 152 155 NetworkProcess/storage/LocalStorageManager.cpp 153 156 NetworkProcess/storage/MemoryStorageArea.cpp 154 157 NetworkProcess/storage/NetworkStorageManager.cpp 155 158 NetworkProcess/storage/OriginStorageManager.cpp 159 NetworkProcess/storage/QuotaManager.cpp 156 160 NetworkProcess/storage/SQLiteStorageArea.cpp 157 161 NetworkProcess/storage/SessionStorageManager.cpp -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp
r289247 r289474 1507 1507 } 1508 1508 1509 void NetworkProcessProxy::increaseQuota(PAL::SessionID sessionID, const WebCore::ClientOrigin& origin, QuotaIncreaseRequestIdentifier identifier, uint64_t currentQuota, uint64_t currentUsage, uint64_t spaceRequested) 1510 { 1511 requestStorageSpace(sessionID, origin, currentQuota, currentUsage, spaceRequested, [this, weakThis = WeakPtr { *this }, sessionID, origin, identifier](auto result) mutable { 1512 if (!weakThis) 1513 return; 1514 1515 send(Messages::NetworkProcess::DidIncreaseQuota(sessionID, origin, identifier, result), 0); 1516 }); 1517 } 1518 1509 1519 void NetworkProcessProxy::registerSchemeForLegacyCustomProtocol(const String& scheme) 1510 1520 { -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h
r289247 r289474 34 34 #include "ProcessThrottler.h" 35 35 #include "ProcessThrottlerClient.h" 36 #include "QuotaIncreaseRequestIdentifier.h" 36 37 #include "UserContentControllerIdentifier.h" 37 38 #include "WebProcessProxyMessagesReplies.h" … … 343 344 344 345 void requestStorageSpace(PAL::SessionID, const WebCore::ClientOrigin&, uint64_t quota, uint64_t currentSize, uint64_t spaceRequired, CompletionHandler<void(std::optional<uint64_t> quota)>&&); 346 void increaseQuota(PAL::SessionID, const WebCore::ClientOrigin&, QuotaIncreaseRequestIdentifier, uint64_t currentQuota, uint64_t currentUsage, uint64_t spaceRequested); 345 347 346 348 WebsiteDataStore* websiteDataStoreFromSessionID(PAL::SessionID); -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.messages.in
r289247 r289474 71 71 72 72 RequestStorageSpace(PAL::SessionID sessionID, struct WebCore::ClientOrigin origin, uint64_t quota, uint64_t currentSize, uint64_t spaceRequired) -> (std::optional<uint64_t> newQuota) Async 73 IncreaseQuota(PAL::SessionID sessionID, struct WebCore::ClientOrigin origin, WebKit::QuotaIncreaseRequestIdentifier identifier, uint64_t quota, uint64_t currentSize, uint64_t spaceRequested) 73 74 74 75 ResourceLoadDidSendRequest(WebKit::WebPageProxyIdentifier pageIdentifier, struct WebKit::ResourceLoadInfo resourceLoadInfo, WebCore::ResourceRequest request, std::optional<IPC::FormDataReference> httpBody) -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp
r288238 r289474 1717 1717 { 1718 1718 // FIXME: Consider whether allowing to set a perThirdPartyOriginStorageQuota from a WebsiteDataStore. 1719 return WebCore::StorageQuotaManager::defaultThirdPartyQuotaFromPerOriginQuota(perOriginStorageQuota());1719 return perOriginStorageQuota() / 10; 1720 1720 } 1721 1721 -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h
r288387 r289474 351 351 static WTF::String defaultJavaScriptConfigurationDirectory(); 352 352 static bool http3Enabled(); 353 static constexpr uint64_t defaultPerOriginQuota() { return 1000 * MB; } 353 354 354 355 void resetQuota(CompletionHandler<void()>&&); -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.cpp
r289150 r289474 34 34 WebsiteDataStoreConfiguration::WebsiteDataStoreConfiguration(IsPersistent isPersistent, WillCopyPathsFromExistingConfiguration willCopyPaths) 35 35 : m_isPersistent(isPersistent) 36 , m_perOriginStorageQuota(WebsiteDataStore::defaultPerOriginQuota()) 36 37 { 37 38 if (isPersistent == IsPersistent::Yes && willCopyPaths == WillCopyPathsFromExistingConfiguration::No) { -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStoreConfiguration.h
r287781 r289474 27 27 28 28 #include "APIObject.h" 29 #include <WebCore/StorageQuotaManager.h>30 29 #include <wtf/URL.h> 31 30 #include <wtf/text/WTFString.h> … … 208 207 String m_cacheStorageDirectory; 209 208 String m_generalStorageDirectory; 210 uint64_t m_perOriginStorageQuota { WebCore::StorageQuotaManager::defaultQuota() };209 uint64_t m_perOriginStorageQuota; 211 210 String m_networkCacheDirectory; 212 211 String m_applicationCacheDirectory; -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r289379 r289474 1473 1473 93B2614E227D14B100B97A76 /* LocalStorageDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B26145227D147000B97A76 /* LocalStorageDatabase.h */; }; 1474 1474 93B2614F227D14B100B97A76 /* LocalStorageDatabaseTracker.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B26146227D147100B97A76 /* LocalStorageDatabaseTracker.h */; }; 1475 93B631E527ABA62800443A44 /* IDBStorageConnectionToClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B631E427ABA62700443A44 /* IDBStorageConnectionToClient.h */; }; 1476 93B631E827ABA65D00443A44 /* IDBStorageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B631E627ABA65C00443A44 /* IDBStorageManager.h */; }; 1477 93B631ED27ABA6B400443A44 /* IDBStorageRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B631EB27ABA6B300443A44 /* IDBStorageRegistry.h */; }; 1478 93B631F127ABACA900443A44 /* QuotaManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B631EF27ABACA900443A44 /* QuotaManager.h */; }; 1479 93B631F327ABAD8000443A44 /* QuotaIncreaseRequestIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B631F227ABAD7F00443A44 /* QuotaIncreaseRequestIdentifier.h */; }; 1475 1480 93BDEB01171DD7AF00BFEE1B /* WKPageLoadTypesPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = 93BDEB00171DD7AF00BFEE1B /* WKPageLoadTypesPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1476 1481 93D6B772254BB5190058DD3A /* SpeechRecognitionServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 93D6B76C254B89580058DD3A /* SpeechRecognitionServer.h */; }; … … 5378 5383 93B2614A227D147200B97A76 /* StorageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageManager.cpp; sourceTree = "<group>"; }; 5379 5384 93B2614C227D147200B97A76 /* LocalStorageDatabase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocalStorageDatabase.cpp; sourceTree = "<group>"; }; 5385 93B631E327ABA5F700443A44 /* IDBStorageConnectionToClient.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = IDBStorageConnectionToClient.cpp; sourceTree = "<group>"; }; 5386 93B631E427ABA62700443A44 /* IDBStorageConnectionToClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBStorageConnectionToClient.h; sourceTree = "<group>"; }; 5387 93B631E627ABA65C00443A44 /* IDBStorageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBStorageManager.h; sourceTree = "<group>"; }; 5388 93B631E727ABA65C00443A44 /* IDBStorageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBStorageManager.cpp; sourceTree = "<group>"; }; 5389 93B631EA27ABA6B200443A44 /* IDBStorageRegistry.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBStorageRegistry.cpp; sourceTree = "<group>"; }; 5390 93B631EB27ABA6B300443A44 /* IDBStorageRegistry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBStorageRegistry.h; sourceTree = "<group>"; }; 5391 93B631EE27ABACA800443A44 /* QuotaManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QuotaManager.cpp; sourceTree = "<group>"; }; 5392 93B631EF27ABACA900443A44 /* QuotaManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuotaManager.h; sourceTree = "<group>"; }; 5393 93B631F227ABAD7F00443A44 /* QuotaIncreaseRequestIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QuotaIncreaseRequestIdentifier.h; sourceTree = "<group>"; }; 5380 5394 93BA04DA2151ADF3007F455F /* WebSWServerConnection.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = WebSWServerConnection.messages.in; sourceTree = "<group>"; }; 5381 5395 93BA04DB2151ADF3007F455F /* WebSWServerToContextConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebSWServerToContextConnection.h; sourceTree = "<group>"; }; … … 7593 7607 isa = PBXGroup; 7594 7608 children = ( 7609 93B631F227ABAD7F00443A44 /* QuotaIncreaseRequestIdentifier.h */, 7595 7610 1A4832D41A9CDF96008B4DFE /* WebsiteData.cpp */, 7596 7611 1A4832D51A9CDF96008B4DFE /* WebsiteData.h */, … … 10470 10485 931A075126F06310004474CD /* FileSystemStorageManager.cpp */, 10471 10486 931A075026F06310004474CD /* FileSystemStorageManager.h */, 10487 93B631E327ABA5F700443A44 /* IDBStorageConnectionToClient.cpp */, 10488 93B631E427ABA62700443A44 /* IDBStorageConnectionToClient.h */, 10489 93B631E727ABA65C00443A44 /* IDBStorageManager.cpp */, 10490 93B631E627ABA65C00443A44 /* IDBStorageManager.h */, 10491 93B631EA27ABA6B200443A44 /* IDBStorageRegistry.cpp */, 10492 93B631EB27ABA6B300443A44 /* IDBStorageRegistry.h */, 10472 10493 93E799C92760497A0074008A /* LocalStorageManager.cpp */, 10473 10494 93E799CB2760497A0074008A /* LocalStorageManager.h */, … … 10479 10500 93085DC526E1C6CF000EC6A7 /* OriginStorageManager.cpp */, 10480 10501 93085DC626E1C6CF000EC6A7 /* OriginStorageManager.h */, 10502 93B631EE27ABACA800443A44 /* QuotaManager.cpp */, 10503 93B631EF27ABACA900443A44 /* QuotaManager.h */, 10481 10504 93E799CC2760497B0074008A /* SessionStorageManager.cpp */, 10482 10505 93E799CA2760497A0074008A /* SessionStorageManager.h */, … … 13089 13112 839A2F321E2067450039057E /* HighPerformanceGraphicsUsageSampler.h in Headers */, 13090 13113 51C0C9741DDD76000032CAD3 /* IconLoadingDelegate.h in Headers */, 13114 93B631E527ABA62800443A44 /* IDBStorageConnectionToClient.h in Headers */, 13115 93B631E827ABA65D00443A44 /* IDBStorageManager.h in Headers */, 13116 93B631ED27ABA6B400443A44 /* IDBStorageRegistry.h in Headers */, 13091 13117 51E351CB180F2CCC00E53BE9 /* IDBUtilities.h in Headers */, 13092 13118 BCCF6B2512C93E7A008F9C35 /* ImageOptions.h in Headers */, … … 13303 13329 1A0C227E2451130A00ED614D /* QuickLookThumbnailingSoftLink.h in Headers */, 13304 13330 1AEE57252409F142002005D6 /* QuickLookThumbnailLoader.h in Headers */, 13331 93B631F327ABAD8000443A44 /* QuotaIncreaseRequestIdentifier.h in Headers */, 13332 93B631F127ABACA900443A44 /* QuotaManager.h in Headers */, 13305 13333 5CB6AE442609799C00B6ED5A /* ReasonSPI.h in Headers */, 13306 13334 57FD318222B3515E008D0E8B /* RedirectSOAuthorizationSession.h in Headers */, -
trunk/Source/WebKit/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp
r280053 r289474 30 30 #include "NetworkConnectionToWebProcessMessages.h" 31 31 #include "NetworkProcessConnection.h" 32 #include "NetworkStorageManagerMessages.h" 32 33 #include "WebCoreArgumentCoders.h" 33 34 #include "WebIDBResult.h" 34 #include "WebIDBServerMessages.h"35 35 #include "WebProcess.h" 36 36 #include <WebCore/IDBConnectionToServer.h> … … 83 83 void WebIDBConnectionToServer::deleteDatabase(const IDBRequestData& requestData) 84 84 { 85 send(Messages:: WebIDBServer::DeleteDatabase(requestData));85 send(Messages::NetworkStorageManager::DeleteDatabase(requestData)); 86 86 } 87 87 88 88 void WebIDBConnectionToServer::openDatabase(const IDBRequestData& requestData) 89 89 { 90 send(Messages:: WebIDBServer::OpenDatabase(requestData));90 send(Messages::NetworkStorageManager::OpenDatabase(requestData)); 91 91 } 92 92 93 93 void WebIDBConnectionToServer::abortTransaction(const IDBResourceIdentifier& transactionIdentifier) 94 94 { 95 send(Messages:: WebIDBServer::AbortTransaction(transactionIdentifier));95 send(Messages::NetworkStorageManager::AbortTransaction(transactionIdentifier)); 96 96 } 97 97 98 98 void WebIDBConnectionToServer::commitTransaction(const IDBResourceIdentifier& transactionIdentifier, uint64_t pendingRequestCount) 99 99 { 100 send(Messages:: WebIDBServer::CommitTransaction(transactionIdentifier, pendingRequestCount));100 send(Messages::NetworkStorageManager::CommitTransaction(transactionIdentifier, pendingRequestCount)); 101 101 } 102 102 103 103 void WebIDBConnectionToServer::didFinishHandlingVersionChangeTransaction(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier) 104 104 { 105 send(Messages:: WebIDBServer::DidFinishHandlingVersionChangeTransaction(databaseConnectionIdentifier, transactionIdentifier));105 send(Messages::NetworkStorageManager::DidFinishHandlingVersionChangeTransaction(databaseConnectionIdentifier, transactionIdentifier)); 106 106 } 107 107 108 108 void WebIDBConnectionToServer::createObjectStore(const IDBRequestData& requestData, const IDBObjectStoreInfo& info) 109 109 { 110 send(Messages:: WebIDBServer::CreateObjectStore(requestData, info));110 send(Messages::NetworkStorageManager::CreateObjectStore(requestData, info)); 111 111 } 112 112 113 113 void WebIDBConnectionToServer::deleteObjectStore(const IDBRequestData& requestData, const String& objectStoreName) 114 114 { 115 send(Messages:: WebIDBServer::DeleteObjectStore(requestData, objectStoreName));115 send(Messages::NetworkStorageManager::DeleteObjectStore(requestData, objectStoreName)); 116 116 } 117 117 118 118 void WebIDBConnectionToServer::renameObjectStore(const IDBRequestData& requestData, uint64_t objectStoreIdentifier, const String& newName) 119 119 { 120 send(Messages:: WebIDBServer::RenameObjectStore(requestData, objectStoreIdentifier, newName));120 send(Messages::NetworkStorageManager::RenameObjectStore(requestData, objectStoreIdentifier, newName)); 121 121 } 122 122 123 123 void WebIDBConnectionToServer::clearObjectStore(const IDBRequestData& requestData, uint64_t objectStoreIdentifier) 124 124 { 125 send(Messages:: WebIDBServer::ClearObjectStore(requestData, objectStoreIdentifier));125 send(Messages::NetworkStorageManager::ClearObjectStore(requestData, objectStoreIdentifier)); 126 126 } 127 127 128 128 void WebIDBConnectionToServer::createIndex(const IDBRequestData& requestData, const IDBIndexInfo& info) 129 129 { 130 send(Messages:: WebIDBServer::CreateIndex(requestData, info));130 send(Messages::NetworkStorageManager::CreateIndex(requestData, info)); 131 131 } 132 132 133 133 void WebIDBConnectionToServer::deleteIndex(const IDBRequestData& requestData, uint64_t objectStoreIdentifier, const String& indexName) 134 134 { 135 send(Messages:: WebIDBServer::DeleteIndex(requestData, objectStoreIdentifier, indexName));135 send(Messages::NetworkStorageManager::DeleteIndex(requestData, objectStoreIdentifier, indexName)); 136 136 } 137 137 138 138 void WebIDBConnectionToServer::renameIndex(const IDBRequestData& requestData, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName) 139 139 { 140 send(Messages:: WebIDBServer::RenameIndex(requestData, objectStoreIdentifier, indexIdentifier, newName));140 send(Messages::NetworkStorageManager::RenameIndex(requestData, objectStoreIdentifier, indexIdentifier, newName)); 141 141 } 142 142 143 143 void WebIDBConnectionToServer::putOrAdd(const IDBRequestData& requestData, const IDBKeyData& keyData, const IDBValue& value, const IndexedDB::ObjectStoreOverwriteMode mode) 144 144 { 145 send(Messages:: WebIDBServer::PutOrAdd(requestData, keyData, value, mode));145 send(Messages::NetworkStorageManager::PutOrAdd(requestData, keyData, value, mode)); 146 146 } 147 147 148 148 void WebIDBConnectionToServer::getRecord(const IDBRequestData& requestData, const IDBGetRecordData& getRecordData) 149 149 { 150 send(Messages:: WebIDBServer::GetRecord(requestData, getRecordData));150 send(Messages::NetworkStorageManager::GetRecord(requestData, getRecordData)); 151 151 } 152 152 153 153 void WebIDBConnectionToServer::getAllRecords(const IDBRequestData& requestData, const IDBGetAllRecordsData& getAllRecordsData) 154 154 { 155 send(Messages:: WebIDBServer::GetAllRecords(requestData, getAllRecordsData));155 send(Messages::NetworkStorageManager::GetAllRecords(requestData, getAllRecordsData)); 156 156 } 157 157 158 158 void WebIDBConnectionToServer::getCount(const IDBRequestData& requestData, const IDBKeyRangeData& range) 159 159 { 160 send(Messages:: WebIDBServer::GetCount(requestData, range));160 send(Messages::NetworkStorageManager::GetCount(requestData, range)); 161 161 } 162 162 163 163 void WebIDBConnectionToServer::deleteRecord(const IDBRequestData& requestData, const IDBKeyRangeData& range) 164 164 { 165 send(Messages:: WebIDBServer::DeleteRecord(requestData, range));165 send(Messages::NetworkStorageManager::DeleteRecord(requestData, range)); 166 166 } 167 167 168 168 void WebIDBConnectionToServer::openCursor(const IDBRequestData& requestData, const IDBCursorInfo& info) 169 169 { 170 send(Messages:: WebIDBServer::OpenCursor(requestData, info));170 send(Messages::NetworkStorageManager::OpenCursor(requestData, info)); 171 171 } 172 172 173 173 void WebIDBConnectionToServer::iterateCursor(const IDBRequestData& requestData, const IDBIterateCursorData& data) 174 174 { 175 send(Messages:: WebIDBServer::IterateCursor(requestData, data));175 send(Messages::NetworkStorageManager::IterateCursor(requestData, data)); 176 176 } 177 177 178 178 void WebIDBConnectionToServer::establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo& info) 179 179 { 180 send(Messages:: WebIDBServer::EstablishTransaction(databaseConnectionIdentifier, info));180 send(Messages::NetworkStorageManager::EstablishTransaction(databaseConnectionIdentifier, info)); 181 181 } 182 182 183 183 void WebIDBConnectionToServer::databaseConnectionPendingClose(uint64_t databaseConnectionIdentifier) 184 184 { 185 send(Messages:: WebIDBServer::DatabaseConnectionPendingClose(databaseConnectionIdentifier));185 send(Messages::NetworkStorageManager::DatabaseConnectionPendingClose(databaseConnectionIdentifier)); 186 186 } 187 187 188 188 void WebIDBConnectionToServer::databaseConnectionClosed(uint64_t databaseConnectionIdentifier) 189 189 { 190 send(Messages:: WebIDBServer::DatabaseConnectionClosed(databaseConnectionIdentifier));190 send(Messages::NetworkStorageManager::DatabaseConnectionClosed(databaseConnectionIdentifier)); 191 191 } 192 192 193 193 void WebIDBConnectionToServer::abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier) 194 194 { 195 send(Messages:: WebIDBServer::AbortOpenAndUpgradeNeeded(databaseConnectionIdentifier, transactionIdentifier));195 send(Messages::NetworkStorageManager::AbortOpenAndUpgradeNeeded(databaseConnectionIdentifier, transactionIdentifier)); 196 196 } 197 197 198 198 void WebIDBConnectionToServer::didFireVersionChangeEvent(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& requestIdentifier, const IndexedDB::ConnectionClosedOnBehalfOfServer connectionClosed) 199 199 { 200 send(Messages:: WebIDBServer::DidFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, connectionClosed));200 send(Messages::NetworkStorageManager::DidFireVersionChangeEvent(databaseConnectionIdentifier, requestIdentifier, connectionClosed)); 201 201 } 202 202 203 203 void WebIDBConnectionToServer::openDBRequestCancelled(const IDBRequestData& requestData) 204 204 { 205 send(Messages:: WebIDBServer::OpenDBRequestCancelled(requestData));205 send(Messages::NetworkStorageManager::OpenDBRequestCancelled(requestData)); 206 206 } 207 207 208 208 void WebIDBConnectionToServer::getAllDatabaseNamesAndVersions(const IDBResourceIdentifier& requestIdentifier, const ClientOrigin& origin) 209 209 { 210 send(Messages:: WebIDBServer::GetAllDatabaseNamesAndVersions(requestIdentifier, origin));210 send(Messages::NetworkStorageManager::GetAllDatabaseNamesAndVersions(requestIdentifier, origin)); 211 211 } 212 212 -
trunk/Source/WebKitLegacy/ChangeLog
r289017 r289474 1 2022-02-09 Sihui Liu <sihui_liu@apple.com> 2 3 Manage IndexedDB storage by origin 4 https://bugs.webkit.org/show_bug.cgi?id=234925 5 <rdar://problem/87555014> 6 7 Reviewed by Chris Dumez. 8 9 * Storage/InProcessIDBServer.cpp: 10 (InProcessIDBServer::quotaManager): 11 1 12 2022-02-02 Elliott Williams <emw@apple.com> 2 13 -
trunk/Source/WebKitLegacy/Storage/InProcessIDBServer.cpp
r284162 r289474 43 43 using namespace WebCore; 44 44 45 static constexpr uint64_t defaultPerOriginQuota = 1000 * MB; 46 45 47 Ref<InProcessIDBServer> InProcessIDBServer::create(PAL::SessionID sessionID) 46 48 { … … 74 76 { 75 77 return m_quotaManagers.ensure(origin, [] { 76 return StorageQuotaManager::create( StorageQuotaManager::defaultQuota(), [] {78 return StorageQuotaManager::create(defaultPerOriginQuota, [] { 77 79 return 0; 78 80 }, [](uint64_t quota, uint64_t currentSpace, uint64_t spaceIncrease, auto callback) { -
trunk/Tools/ChangeLog
r289470 r289474 1 2022-02-09 Sihui Liu <sihui_liu@apple.com> 2 3 Manage IndexedDB storage by origin 4 https://bugs.webkit.org/show_bug.cgi?id=234925 5 <rdar://problem/87555014> 6 7 Reviewed by Chris Dumez. 8 9 * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBFileName.mm: 10 (runTest): 11 * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBPersistence.mm: 12 * TestWebKitAPI/Tests/WebKitCocoa/IndexedDBSuspendImminently.mm: 13 (TEST): 14 * TestWebKitAPI/Tests/WebKitCocoa/StoreBlobThenDelete.mm: 15 (TEST): 16 1 17 2022-02-09 Martin Robinson <mrobinson@webkit.org> 2 18 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBFileName.mm
r285547 r289474 72 72 EXPECT_WK_STREQ(@"Success", string2.get()); 73 73 74 // For database that is not opened after upgrade, its file should be in v0.74 // All databases of an origin are migrated to new version directory when the origin is accessed. 75 75 auto defaultFileManager = [NSFileManager defaultManager]; 76 76 NSString *existingDatabaseName = @"IndexedDBTest"; … … 79 79 NSString *existingDatbaseHash = WebCore::SQLiteFileSystem::computeHashForFileName(existingDatabaseName); 80 80 NSString *createdDatabaseHash = WebCore::SQLiteFileSystem::computeHashForFileName(createdDatabaseName); 81 NSString *unusedDatabaseHash = WebCore::SQLiteFileSystem::computeHashForFileName(createdDatabaseName); 81 82 NSURL *idbRootURL = [[WKWebsiteDataStore defaultDataStore] _indexedDBDatabaseDirectory]; 82 83 NSURL *oldVersionDirectoryURL = [idbRootURL URLByAppendingPathComponent:@"v0"]; … … 85 86 NSURL *newVersionOriginDirectoryURL = [newVersionDirectoryURL URLByAppendingPathComponent: @"file__0"]; 86 87 NSURL *oldVersionUnusedDatabaseDirectoryURL = [oldVersionOriginDirectoryURL URLByAppendingPathComponent:unusedDatabaseName]; 87 EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:oldVersionUnusedDatabaseDirectoryURL.path]); 88 NSURL *newVersionUnusedDatabaseDirectoryURL = [newVersionOriginDirectoryURL URLByAppendingPathComponent:unusedDatabaseHash]; 89 EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:oldVersionUnusedDatabaseDirectoryURL.path]); 90 EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:newVersionUnusedDatabaseDirectoryURL.path]); 88 91 89 92 // For database that is opened after upgrade, its file should only be in v1. -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBPersistence.mm
r288098 r289474 306 306 307 307 readyToContinue = false; 308 [[WKWebsiteDataStore defaultDataStore] fetchDataRecordsOfTypes:websiteDataTypes.get() completionHandler:^(NSArray<WKWebsiteDataRecord *> *dataRecords) { 309 EXPECT_EQ(1u, dataRecords.count); 310 EXPECT_WK_STREQ("iframe", [[dataRecords firstObject] displayName]); 311 [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes.get() forDataRecords:dataRecords completionHandler:^() { 308 [[WKWebsiteDataStore defaultDataStore] fetchDataRecordsOfTypes:websiteDataTypes.get() completionHandler:^(NSArray<WKWebsiteDataRecord *> *records) { 309 EXPECT_EQ(2u, records.count); 310 NSSortDescriptor *recordDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"displayName" ascending:YES]; 311 NSArray *sortDescriptors = @[recordDescriptor]; 312 NSArray *sortedRecords = [records sortedArrayUsingDescriptors:sortDescriptors]; 313 EXPECT_WK_STREQ("iframe", [[sortedRecords objectAtIndex:0] displayName]); 314 EXPECT_WK_STREQ("webkit.org", [[sortedRecords objectAtIndex:1] displayName]); 315 [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes.get() forDataRecords:records completionHandler:^() { 312 316 readyToContinue = true; 313 317 }]; -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/IndexedDBSuspendImminently.mm
r285547 r289474 74 74 TEST(IndexedDB, IndexedDBSuspendImminently) 75 75 { 76 readyToContinue = false; 77 [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() { 78 readyToContinue = true; 79 }]; 80 TestWebKitAPI::Util::run(&readyToContinue); 81 76 82 auto handler = adoptNS([[IndexedDBSuspendImminentlyMessageHandler alloc] init]); 77 83 auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/StoreBlobThenDelete.mm
r285547 r289474 88 88 [[NSFileManager defaultManager] copyItemAtPath:databaseFilePath toPath:fakeWalPath error:nil]; 89 89 90 // Make some other .blob files in the database directory to later validate that only appropriate filesare deleted.90 // Make some other .blob files in the database directory to later validate all blob files in the directory are deleted. 91 91 NSString *otherBlob1 = [databaseDirectory stringByAppendingPathComponent:@"7182.blob"]; 92 92 NSString *otherBlob2 = [databaseDirectory stringByAppendingPathComponent:@"1a.blob"]; … … 103 103 EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:databaseFilePath]); 104 104 105 // Make sure the fake blob file with a valid blob file name isgone.105 // Make sure all fake blob file are gone. 106 106 EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:otherBlob1]); 107 107 108 // Make sure the fake blob files with invalid blob file names are still there. 109 EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:otherBlob2]); 110 EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:otherBlob3]); 111 EXPECT_TRUE([[NSFileManager defaultManager] fileExistsAtPath:otherBlob4]); 108 EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:otherBlob2]); 109 EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:otherBlob3]); 110 EXPECT_FALSE([[NSFileManager defaultManager] fileExistsAtPath:otherBlob4]); 112 111 113 112 // Make sure everything related to the fake database is gone.
Note:
See TracChangeset
for help on using the changeset viewer.