Changeset 286936 in webkit
- Timestamp:
- Dec 12, 2021, 11:39:53 PM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 7 added
- 22 edited
- 5 copied
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/platform/sql/SQLiteFileSystem.cpp (modified) (3 diffs)
-
WebCore/platform/sql/SQLiteFileSystem.h (modified) (1 diff)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/NetworkProcess/NetworkProcess.cpp (modified) (21 diffs)
-
WebKit/NetworkProcess/NetworkProcess.h (modified) (4 diffs)
-
WebKit/NetworkProcess/NetworkProcess.messages.in (modified) (1 diff)
-
WebKit/NetworkProcess/storage/LocalStorageManager.cpp (added)
-
WebKit/NetworkProcess/storage/LocalStorageManager.h (copied) (copied from trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h ) (1 diff)
-
WebKit/NetworkProcess/storage/MemoryStorageArea.cpp (added)
-
WebKit/NetworkProcess/storage/MemoryStorageArea.h (copied) (copied from trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h ) (2 diffs)
-
WebKit/NetworkProcess/storage/NetworkStorageManager.cpp (modified) (17 diffs)
-
WebKit/NetworkProcess/storage/NetworkStorageManager.h (modified) (5 diffs)
-
WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in (modified) (1 diff)
-
WebKit/NetworkProcess/storage/OriginStorageManager.cpp (modified) (11 diffs)
-
WebKit/NetworkProcess/storage/OriginStorageManager.h (modified) (4 diffs)
-
WebKit/NetworkProcess/storage/SQLiteStorageArea.cpp (added)
-
WebKit/NetworkProcess/storage/SQLiteStorageArea.h (added)
-
WebKit/NetworkProcess/storage/SessionStorageManager.cpp (added)
-
WebKit/NetworkProcess/storage/SessionStorageManager.h (copied) (copied from trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h ) (1 diff)
-
WebKit/NetworkProcess/storage/StorageAreaBase.cpp (added)
-
WebKit/NetworkProcess/storage/StorageAreaBase.h (added)
-
WebKit/NetworkProcess/storage/StorageAreaRegistry.cpp (copied) (copied from trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h ) (1 diff)
-
WebKit/NetworkProcess/storage/StorageAreaRegistry.h (copied) (copied from trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h ) (1 diff)
-
WebKit/Scripts/generate-unified-sources.sh (modified) (1 diff)
-
WebKit/Sources.txt (modified) (1 diff)
-
WebKit/UIProcess/Network/NetworkProcessProxy.cpp (modified) (1 diff)
-
WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm (modified) (1 diff)
-
WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (modified) (2 diffs)
-
WebKit/UIProcess/WebsiteData/WebsiteDataStore.h (modified) (2 diffs)
-
WebKit/UnifiedSources-output.xcfilelist (modified) (1 diff)
-
WebKit/WebKit.xcodeproj/project.pbxproj (modified) (17 diffs)
-
WebKit/WebProcess/WebStorage/StorageAreaMap.cpp (modified) (7 diffs)
-
WebKit/WebProcess/WebStorage/StorageNamespaceImpl.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r286933 r286936 1 2021-12-12 Sihui Liu <sihui_liu@apple.com> 2 3 Merge StorageManager with NetworkStorageManager to manage WebStorage by origin 4 https://bugs.webkit.org/show_bug.cgi?id=234087 5 6 Reviewed by Chris Dumez. 7 8 * platform/sql/SQLiteFileSystem.cpp: 9 (WebCore::SQLiteFileSystem::deleteDatabaseFile): 10 (WebCore::SQLiteFileSystem::moveDatabaseFile): 11 (WebCore::SQLiteFileSystem::databaseFileSize): 12 * platform/sql/SQLiteFileSystem.h: 13 1 14 2021-12-12 Alan Bujtas <zalan@apple.com> 2 15 -
trunk/Source/WebCore/platform/sql/SQLiteFileSystem.cpp
r278533 r286936 44 44 namespace WebCore { 45 45 46 static constexpr std::array<const char *, 3> databaseFileSuffixes { "", "-shm", "-wal" }; 47 46 48 SQLiteFileSystem::SQLiteFileSystem() 47 49 { … … 78 80 } 79 81 80 bool SQLiteFileSystem::deleteDatabaseFile(const String& file Name)82 bool SQLiteFileSystem::deleteDatabaseFile(const String& filePath) 81 83 { 82 auto walFileName = makeString(fileName, "-wal"_s); 83 auto shmFileName = makeString(fileName, "-shm"_s); 84 bool fileExists = false; 85 for (const auto* suffix : databaseFileSuffixes) { 86 String path = filePath + suffix; 87 FileSystem::deleteFile(path); 88 fileExists |= FileSystem::fileExists(path); 89 } 84 90 85 // Try to delete all three files whether or not they are there. 86 FileSystem::deleteFile(fileName); 87 FileSystem::deleteFile(walFileName); 88 FileSystem::deleteFile(shmFileName); 91 return !fileExists; 92 } 89 93 90 // If any of the wal or shm files remain after the delete attempt, the overall delete operation failed. 91 return !FileSystem::fileExists(fileName) && !FileSystem::fileExists(walFileName) && !FileSystem::fileExists(shmFileName); 94 void SQLiteFileSystem::moveDatabaseFile(const String& oldFilePath, const String& newFilePath) 95 { 96 for (const auto* suffix : databaseFileSuffixes) 97 FileSystem::moveFile(makeString(oldFilePath, suffix), makeString(newFilePath, suffix)); 92 98 } 93 99 … … 99 105 #endif 100 106 101 uint64_t SQLiteFileSystem::databaseFileSize(const String& file Name)102 { 107 uint64_t SQLiteFileSystem::databaseFileSize(const String& filePath) 108 { 103 109 uint64_t totalSize = 0; 104 105 if (auto fileSize = FileSystem::fileSize(fileName)) 106 totalSize += *fileSize; 107 108 if (auto fileSize = FileSystem::fileSize(makeString(fileName, "-wal"_s))) 109 totalSize += *fileSize; 110 111 if (auto fileSize = FileSystem::fileSize(makeString(fileName, "-shm"_s))) 112 totalSize += *fileSize; 110 for (const auto* suffix : databaseFileSuffixes) { 111 if (auto fileSize = FileSystem::fileSize(filePath + suffix)) 112 totalSize += *fileSize; 113 } 113 114 114 115 return totalSize; -
trunk/Source/WebCore/platform/sql/SQLiteFileSystem.h
r278253 r286936 79 79 // 80 80 // fileName - The file name. 81 WEBCORE_EXPORT static bool deleteDatabaseFile(const String& file Name);81 WEBCORE_EXPORT static bool deleteDatabaseFile(const String& filePath); 82 82 83 WEBCORE_EXPORT static String computeHashForFileName(const String& fileName); 83 // Moves a database file to a new place. 84 WEBCORE_EXPORT static void moveDatabaseFile(const String& oldFilePath, const String& newFilePath); 85 WEBCORE_EXPORT static String computeHashForFileName(const String& filePath); 84 86 85 87 #if PLATFORM(IOS_FAMILY) -
trunk/Source/WebKit/ChangeLog
r286919 r286936 1 2021-12-12 Sihui Liu <sihui_liu@apple.com> 2 3 Merge StorageManager with NetworkStorageManager to manage WebStorage by origin 4 https://bugs.webkit.org/show_bug.cgi?id=234087 5 6 Reviewed by Chris Dumez. 7 8 In network process, WebStorage data is managed by WebKit::StorageManager class. Each StorageManager owns one or 9 many StorageNameSpaces, and each StorageNamespace owns one or more StorageAreas. Each StorageArea correponds 10 to one storage map (one localStorage or sessionStorage object), using either a SQLite database or a in-memory 11 map as backend. Now that we have NetworkStorageManager, which manages storage by origin. We can merge 12 StorageManager with NetworkStorageManager, since localStorage and sessionStorage are not shared between 13 different origins. 14 15 The new structure is: 16 NetworkStorageManager (manage storage for a session, owns one or more OriginStorageManagers) 17 OriginStorageManager (manage storage for an origin, owns one LocalStorageManager and one SessionStorageManager) 18 LocalStorageManager / SessionStorageManager (manage LocalStorage and SessionStorage, owns one or more 19 StorageAreaBases) 20 MemoryStorageArea / SQLiteStorageArea (inherits StorageAreaBases; manage one local or session storage, like 21 Webkit::StorageArea) 22 23 StorageNamespace layer is removed. For SessionStorage, different StorageNamespaces means different web pages, 24 and same origin can have different sessionStorages on different pages, so we keep a StorageNamespace <=> 25 StorageArea map in SessionStorageManager. For LocalStorage, differnt StorageNamespaces means different page 26 groups. Our original plan was the same origin can have different localStorages in different page groups, but our 27 old implementation actually made all page groups point to the same database file. To keep existing behavior 28 that all page groups with same origin share the storage, we now keep one local StorageArea and one transient 29 StorageArea per LocalStorageManager. 30 31 Mostly refactoring and covered by existing tests. 32 33 * NetworkProcess/NetworkProcess.cpp: 34 (WebKit::NetworkProcess::NetworkProcess): 35 (WebKit::NetworkProcess::lowMemoryHandler): 36 (WebKit::NetworkProcess::createNetworkConnectionToWebProcess): 37 (WebKit::NetworkProcess::addWebsiteDataStore): 38 (WebKit::NetworkProcess::addStorageManagerForSession): 39 (WebKit::NetworkProcess::destroySession): 40 (WebKit::NetworkProcess::hasLocalStorage): 41 (WebKit::NetworkProcess::fetchWebsiteData): 42 (WebKit::NetworkProcess::deleteWebsiteData): 43 (WebKit::NetworkProcess::deleteWebsiteDataForOrigins): 44 (WebKit::NetworkProcess::deleteAndRestrictWebsiteDataForRegistrableDomains): 45 (WebKit::NetworkProcess::prepareToSuspend): 46 (WebKit::NetworkProcess::resume): 47 (WebKit::NetworkProcess::syncLocalStorage): 48 (WebKit::NetworkProcess::renameOriginInWebsiteData): 49 (WebKit::NetworkProcess::connectionToWebProcessClosed): 50 (WebKit::NetworkProcess::getLocalStorageOriginDetails): Deleted. 51 * NetworkProcess/NetworkProcess.h: 52 * NetworkProcess/NetworkProcess.messages.in: 53 * NetworkProcess/storage/LocalStorageManager.cpp: Added. 54 (WebKit::fileNameToOrigin): 55 (WebKit::originToFileName): 56 (WebKit::LocalStorageManager::originsOfLocalStorageData): 57 (WebKit::LocalStorageManager::localStorageFilePath): 58 (WebKit::LocalStorageManager::LocalStorageManager): 59 (WebKit::LocalStorageManager::isActive const): 60 (WebKit::LocalStorageManager::hasDataInMemory const): 61 (WebKit::LocalStorageManager::clearDataInMemory): 62 (WebKit::LocalStorageManager::clearDataOnDisk): 63 (WebKit::LocalStorageManager::close): 64 (WebKit::LocalStorageManager::handleLowMemoryWarning): 65 (WebKit::LocalStorageManager::syncLocalStorage): 66 (WebKit::LocalStorageManager::connectionClosed): 67 (WebKit::LocalStorageManager::connectionClosedForLocalStorageArea): 68 (WebKit::LocalStorageManager::connectionClosedForTransientStorageArea): 69 (WebKit::LocalStorageManager::connectToLocalStorageArea): 70 (WebKit::LocalStorageManager::connectToTransientLocalStorageArea): 71 (WebKit::LocalStorageManager::disconnectFromStorageArea): 72 * NetworkProcess/storage/LocalStorageManager.h: Added. 73 * NetworkProcess/storage/MemoryStorageArea.cpp: Added. 74 (WebKit::MemoryStorageArea::MemoryStorageArea): 75 (WebKit::MemoryStorageArea::isEmpty): 76 (WebKit::MemoryStorageArea::clear): 77 (WebKit::MemoryStorageArea::allItems): 78 (WebKit::MemoryStorageArea::setItem): 79 (WebKit::MemoryStorageArea::removeItem): 80 (WebKit::MemoryStorageArea::clone const): 81 * NetworkProcess/storage/MemoryStorageArea.h: Added. 82 (isType): 83 * NetworkProcess/storage/NetworkStorageManager.cpp: 84 (WebKit::readOriginFromFile): 85 (WebKit::writeOriginToFileIfNecessary): 86 (WebKit::NetworkStorageManager::create): 87 (WebKit::NetworkStorageManager::NetworkStorageManager): 88 (WebKit::NetworkStorageManager::canHandleTypes): 89 (WebKit::NetworkStorageManager::close): 90 (WebKit::originDirectoryPath): 91 (WebKit::originFilePath): 92 (WebKit::NetworkStorageManager::localOriginStorageManager): 93 (WebKit::NetworkStorageManager::removeOriginStorageManagerIfPossible): 94 (WebKit::NetworkStorageManager::deleteOriginDirectoryIfPossible): 95 (WebKit::NetworkStorageManager::clearStorageForTesting): 96 (WebKit::NetworkStorageManager::forEachOriginDirectory): 97 (WebKit::NetworkStorageManager::getAllOrigins): 98 (WebKit::NetworkStorageManager::fetchDataFromDisk): 99 (WebKit::NetworkStorageManager::deleteDataOnDisk): 100 (WebKit::NetworkStorageManager::moveData): 101 (WebKit::NetworkStorageManager::suspend): 102 (WebKit::NetworkStorageManager::resume): 103 (WebKit::NetworkStorageManager::handleLowMemoryWarning): 104 (WebKit::NetworkStorageManager::syncLocalStorage): 105 (WebKit::NetworkStorageManager::connectToLocalStorageArea): 106 (WebKit::NetworkStorageManager::connectToTransientLocalStorageArea): 107 (WebKit::NetworkStorageManager::connectToSessionStorageArea): 108 (WebKit::NetworkStorageManager::disconnectFromStorageArea): 109 (WebKit::NetworkStorageManager::cloneSessionStorageNamespace): 110 (WebKit::NetworkStorageManager::getValues): 111 (WebKit::NetworkStorageManager::setItem): 112 (WebKit::NetworkStorageManager::removeItem): 113 (WebKit::NetworkStorageManager::clear): 114 (WebKit::toWebsiteDataType): Deleted. 115 * NetworkProcess/storage/NetworkStorageManager.h: 116 * NetworkProcess/storage/NetworkStorageManager.messages.in: 117 * NetworkProcess/storage/OriginStorageManager.cpp: 118 (WebKit::OriginStorageManager::StorageBucket::StorageBucket): 119 (WebKit::OriginStorageManager::StorageBucket::toWebsiteDataType): 120 (WebKit::OriginStorageManager::StorageBucket::toStorageIdentifier): 121 (WebKit::OriginStorageManager::StorageBucket::localStorageManager): 122 (WebKit::OriginStorageManager::StorageBucket::existingLocalStorageManager): 123 (WebKit::OriginStorageManager::StorageBucket::sessionStorageManager): 124 (WebKit::OriginStorageManager::StorageBucket::existingSessionStorageManager): 125 (WebKit::OriginStorageManager::StorageBucket::isActive const): 126 (WebKit::OriginStorageManager::StorageBucket::isEmpty const): 127 (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInList): 128 (WebKit::OriginStorageManager::StorageBucket::deleteData): 129 (WebKit::OriginStorageManager::StorageBucket::moveData): 130 (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromMemory): 131 (WebKit::OriginStorageManager::StorageBucket::fetchDataTypesInListFromDisk): 132 (WebKit::OriginStorageManager::StorageBucket::deleteLocalStorageData): 133 (WebKit::OriginStorageManager::StorageBucket::deleteSessionStorageData): 134 (WebKit::OriginStorageManager::OriginStorageManager): 135 (WebKit::OriginStorageManager::defaultBucket): 136 (WebKit::OriginStorageManager::localStorageManager): 137 (WebKit::OriginStorageManager::existingLocalStorageManager): 138 (WebKit::OriginStorageManager::sessionStorageManager): 139 (WebKit::OriginStorageManager::existingSessionStorageManager): 140 (WebKit::OriginStorageManager::isEmpty): 141 (WebKit::OriginStorageManager::fetchDataTypesInList): 142 (WebKit::OriginStorageManager::deleteData): 143 (WebKit::OriginStorageManager::moveData): 144 (WebKit::OriginStorageManager::StorageBucket::isActive): Deleted. 145 * NetworkProcess/storage/OriginStorageManager.h: 146 * NetworkProcess/storage/SQLiteStorageArea.cpp: Added. 147 (WebKit::SQLiteStorageArea::statementString const): 148 (WebKit::SQLiteStorageArea::SQLiteStorageArea): 149 (WebKit::SQLiteStorageArea::close): 150 (WebKit::SQLiteStorageArea::~SQLiteStorageArea): 151 (WebKit::SQLiteStorageArea::isEmpty): 152 (WebKit::SQLiteStorageArea::clear): 153 (WebKit::SQLiteStorageArea::createTableIfNecessary): 154 (WebKit::SQLiteStorageArea::prepareDatabase): 155 (WebKit::SQLiteStorageArea::startTransactionIfNecessary): 156 (WebKit::SQLiteStorageArea::cachedStatement): 157 (WebKit::SQLiteStorageArea::getItem): 158 (WebKit::SQLiteStorageArea::getItemFromDatabase): 159 (WebKit::SQLiteStorageArea::allItems): 160 (WebKit::SQLiteStorageArea::setItem): 161 (WebKit::SQLiteStorageArea::removeItem): 162 (WebKit::SQLiteStorageArea::commitTransactionIfNecessary): 163 (WebKit::SQLiteStorageArea::handleLowMemoryWarning): 164 * NetworkProcess/storage/SQLiteStorageArea.h: Added. 165 (isType): 166 * NetworkProcess/storage/SessionStorageManager.cpp: Added. 167 (WebKit::SessionStorageManager::SessionStorageManager): 168 (WebKit::SessionStorageManager::isActive const): 169 (WebKit::SessionStorageManager::hasDataInMemory const): 170 (WebKit::SessionStorageManager::clearData): 171 (WebKit::SessionStorageManager::connectionClosed): 172 (WebKit::SessionStorageManager::addStorageArea): 173 (WebKit::SessionStorageManager::connectToSessionStorageArea): 174 (WebKit::SessionStorageManager::disconnectFromStorageArea): 175 (WebKit::SessionStorageManager::cloneStorageArea): 176 * NetworkProcess/storage/SessionStorageManager.h: Added. 177 * NetworkProcess/storage/StorageAreaBase.cpp: Added. Some code is moved from NetworkProcess/WebStoreage/StorageArea.cpp. 178 (WebKit::StorageAreaBase::StorageAreaBase): 179 (WebKit::StorageAreaBase::addListener): 180 (WebKit::StorageAreaBase::removeListener): 181 (WebKit::StorageAreaBase::hasListeners const): 182 (WebKit::StorageAreaBase::notifyListenersAboutClear): 183 (WebKit::StorageAreaBase::dispatchEvents const): 184 * NetworkProcess/storage/StorageAreaBase.h: Added. Some code is moved from NetworkProcess/WebStoreage/StorageArea.h. 185 (WebKit::StorageAreaBase::identifier const): 186 (WebKit::StorageAreaBase::origin const): 187 (WebKit::StorageAreaBase::quota const): 188 * NetworkProcess/storage/StorageAreaRegistry.cpp: Added. 189 (WebKit::StorageAreaRegistry::registerStorageArea): 190 (WebKit::StorageAreaRegistry::unregisterStorageArea): 191 (WebKit::StorageAreaRegistry::getStorageArea): 192 * NetworkProcess/storage/StorageAreaRegistry.h: Added. 193 * Scripts/generate-unified-sources.sh: 194 * Sources.txt: 195 * UIProcess/Network/NetworkProcessProxy.cpp: 196 (WebKit::NetworkProcessProxy::getLocalStorageDetails): Deleted. 197 * UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm: 198 (WebKit::WebsiteDataStore::excludeDirectoryFromBackup): 199 * UIProcess/WebsiteData/WebsiteDataStore.cpp: 200 (WebKit::WebsiteDataStore::parameters): 201 (WebKit::WebsiteDataStore::getLocalStorageDetails): Deleted. 202 * UIProcess/WebsiteData/WebsiteDataStore.h: 203 * UnifiedSources-output.xcfilelist: 204 * WebKit.xcodeproj/project.pbxproj: 205 * WebProcess/WebStorage/StorageAreaMap.cpp: 206 (WebKit::StorageAreaMap::setItem): 207 (WebKit::StorageAreaMap::removeItem): 208 (WebKit::StorageAreaMap::clear): 209 (WebKit::StorageAreaMap::ensureMap): 210 (WebKit::StorageAreaMap::connect): 211 (WebKit::StorageAreaMap::disconnect): 212 * WebProcess/WebStorage/StorageNamespaceImpl.cpp: 213 (WebKit::StorageNamespaceImpl::copy): 214 1 215 2021-12-11 Tim Horton <timothy_horton@apple.com> 2 216 -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r286788 r286936 159 159 NetworkProcess::NetworkProcess(AuxiliaryProcessInitializationParameters&& parameters) 160 160 : m_downloadManager(*this) 161 , m_storageManagerSet(StorageManagerSet::create())162 161 #if ENABLE(CONTENT_EXTENSIONS) 163 162 , m_networkContentRuleListManager(*this) … … 315 314 }); 316 315 317 m_storageManagerSet->handleLowMemoryWarning();318 319 316 #if ENABLE(SERVICE_WORKER) 320 317 for (auto& swServer : m_swServers.values()) 321 318 swServer->handleLowMemoryWarning(); 322 319 #endif 320 321 for (auto& manager : m_storageManagers.values()) 322 manager->handleLowMemoryWarning(); 323 323 } 324 324 … … 403 403 connection.setOnLineState(NetworkStateNotifier::singleton().onLine()); 404 404 405 m_storageManagerSet->addConnection(connection.connection());406 405 webIDBServer(sessionID).addConnection(connection.connection(), identifier); 407 406 if (auto manager = m_storageManagers.get(sessionID)) … … 422 421 auto sessionID = parameters.networkSessionParameters.sessionID; 423 422 424 addStorageManagerForSession(sessionID, parameters.generalStorageDirectory, parameters.generalStorageDirectoryHandle );423 addStorageManagerForSession(sessionID, parameters.generalStorageDirectory, parameters.generalStorageDirectoryHandle, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle); 425 424 addSessionStorageQuotaManager(sessionID, parameters.perOriginStorageQuota, parameters.perThirdPartyOriginStorageQuota, parameters.cacheStorageDirectory, parameters.cacheStorageDirectoryExtensionHandle); 426 425 … … 430 429 addServiceWorkerSession(sessionID, parameters.serviceWorkerProcessTerminationDelayEnabled, WTFMove(parameters.serviceWorkerRegistrationDirectory), parameters.serviceWorkerRegistrationDirectoryExtensionHandle); 431 430 #endif 432 433 m_storageManagerSet->add(sessionID, parameters.localStorageDirectory, parameters.localStorageDirectoryExtensionHandle);434 431 435 432 RemoteNetworkingContext::ensureWebsiteDataStoreSession(*this, WTFMove(parameters)); … … 455 452 } 456 453 457 void NetworkProcess::addStorageManagerForSession(PAL::SessionID sessionID, const String& generalStoragePath, SandboxExtension::Handle& generalStoragePathHandle )454 void NetworkProcess::addStorageManagerForSession(PAL::SessionID sessionID, const String& generalStoragePath, SandboxExtension::Handle& generalStoragePathHandle, const String& localStoragePath, SandboxExtension::Handle& localStoragePathHandle) 458 455 { 459 456 m_storageManagers.ensure(sessionID, [&] { 460 457 SandboxExtension::consumePermanently(generalStoragePathHandle); 461 return NetworkStorageManager::create(sessionID, generalStoragePath); 458 SandboxExtension::consumePermanently(localStoragePathHandle); 459 return NetworkStorageManager::create(sessionID, generalStoragePath, localStoragePath); 462 460 }); 463 461 } … … 576 574 #endif 577 575 578 m_storageManagerSet->remove(sessionID);579 576 if (auto server = m_webIDBServers.take(sessionID)) 580 577 server->close(); … … 1066 1063 void NetworkProcess::hasLocalStorage(PAL::SessionID sessionID, const RegistrableDomain& domain, CompletionHandler<void(bool)>&& completionHandler) 1067 1064 { 1068 if (m_storageManagerSet->contains(sessionID)) { 1069 m_storageManagerSet->getLocalStorageOrigins(sessionID, [domain, completionHandler = WTFMove(completionHandler)](auto&& origins) mutable { 1070 completionHandler(WTF::anyOf(origins, [&domain](auto& origin) { 1071 return domain.matches(origin); 1072 })); 1073 }); 1074 return; 1075 } 1076 completionHandler(false); 1065 auto iterator = m_storageManagers.find(sessionID); 1066 if (iterator == m_storageManagers.end()) 1067 return completionHandler(false); 1068 1069 auto types = OptionSet<WebsiteDataType> { WebsiteDataType::LocalStorage }; 1070 iterator->value->fetchData(types, [domain, completionHandler = WTFMove(completionHandler)](auto entries) mutable { 1071 completionHandler(WTF::anyOf(entries, [&domain](auto& entry) { 1072 return domain.matches(entry.origin); 1073 })); 1074 }); 1077 1075 } 1078 1076 … … 1492 1490 } 1493 1491 1494 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManagerSet->contains(sessionID)) {1495 m_storageManagerSet->getSessionStorageOrigins(sessionID, [callbackAggregator](auto&& origins) {1496 while (!origins.isEmpty())1497 callbackAggregator->m_websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::SessionStorage, 0 });1498 });1499 }1500 1501 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManagerSet->contains(sessionID)) {1502 m_storageManagerSet->getLocalStorageOrigins(sessionID, [callbackAggregator](auto&& origins) {1503 while (!origins.isEmpty())1504 callbackAggregator->m_websiteData.entries.append(WebsiteData::Entry { origins.takeAny(), WebsiteDataType::LocalStorage, 0 });1505 });1506 }1507 1508 1492 #if PLATFORM(COCOA) || USE(SOUP) 1509 1493 if (websiteDataTypes.contains(WebsiteDataType::HSTSCache)) … … 1558 1542 #endif 1559 1543 1560 if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) { 1561 iterator->value->fetchData(websiteDataTypes, [callbackAggregator](auto entries) mutable { 1562 callbackAggregator->m_websiteData.entries.appendVector(WTFMove(entries)); 1563 }); 1544 if (NetworkStorageManager::canHandleTypes(websiteDataTypes)) { 1545 if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) { 1546 iterator->value->fetchData(websiteDataTypes, [callbackAggregator](auto entries) mutable { 1547 callbackAggregator->m_websiteData.entries.appendVector(WTFMove(entries)); 1548 }); 1549 } 1564 1550 } 1565 1551 } … … 1587 1573 if (websiteDataTypes.contains(WebsiteDataType::DOMCache)) 1588 1574 CacheStorage::Engine::clearAllCaches(*this, sessionID, [clearTasksHandler] { }); 1589 1590 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManagerSet->contains(sessionID))1591 m_storageManagerSet->deleteSessionStorage(sessionID, [clearTasksHandler] { });1592 1593 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManagerSet->contains(sessionID))1594 m_storageManagerSet->deleteLocalStorageModifiedSince(sessionID, modifiedSince, [clearTasksHandler] { });1595 1575 1596 1576 if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && !sessionID.isEphemeral()) … … 1638 1618 #endif 1639 1619 1640 if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) 1641 iterator->value->deleteDataModifiedSince(websiteDataTypes, modifiedSince, [clearTasksHandler] { }); 1620 if (NetworkStorageManager::canHandleTypes(websiteDataTypes)) { 1621 if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) 1622 iterator->value->deleteDataModifiedSince(websiteDataTypes, modifiedSince, [clearTasksHandler] { }); 1623 } 1642 1624 } 1643 1625 … … 1704 1686 } 1705 1687 1706 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage) && m_storageManagerSet->contains(sessionID))1707 m_storageManagerSet->deleteSessionStorageForOrigins(sessionID, originDatas, [clearTasksHandler] { });1708 1709 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage) && m_storageManagerSet->contains(sessionID))1710 m_storageManagerSet->deleteLocalStorageForOrigins(sessionID, originDatas, [clearTasksHandler] { });1711 1712 1688 if (websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases) && !sessionID.isEphemeral()) 1713 1689 webIDBServer(sessionID).closeAndDeleteDatabasesForOrigins(originDatas, [clearTasksHandler] { }); … … 1747 1723 #endif 1748 1724 1749 if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) 1750 iterator->value->deleteData(websiteDataTypes, originDatas, [clearTasksHandler] { }); 1725 if (NetworkStorageManager::canHandleTypes(websiteDataTypes)) { 1726 if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) 1727 iterator->value->deleteData(websiteDataTypes, originDatas, [clearTasksHandler] { }); 1728 } 1751 1729 1752 1730 if (auto* networkSession = this->networkSession(sessionID)) { … … 1905 1883 } 1906 1884 1907 if (m_storageManagerSet->contains(sessionID)) {1908 if (websiteDataTypes.contains(WebsiteDataType::SessionStorage)) {1909 m_storageManagerSet->getSessionStorageOrigins(sessionID, [protectedThis = Ref { *this }, this, sessionID, callbackAggregator, domainsToDeleteAllNonCookieWebsiteDataFor](auto&& origins) {1910 if (!m_storageManagerSet->contains(sessionID))1911 return;1912 1913 auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator->m_domains);1914 m_storageManagerSet->deleteSessionStorageForOrigins(sessionID, originsToDelete, [callbackAggregator] { });1915 });1916 }1917 1918 if (websiteDataTypes.contains(WebsiteDataType::LocalStorage)) {1919 m_storageManagerSet->getLocalStorageOrigins(sessionID, [protectedThis = Ref { *this }, this, sessionID, callbackAggregator, domainsToDeleteAllNonCookieWebsiteDataFor](auto&& origins) {1920 if (!m_storageManagerSet->contains(sessionID))1921 return;1922 1923 auto originsToDelete = filterForRegistrableDomains(origins, domainsToDeleteAllNonCookieWebsiteDataFor, callbackAggregator->m_domains);1924 m_storageManagerSet->deleteLocalStorageForOrigins(sessionID, originsToDelete, [callbackAggregator] { });1925 });1926 }1927 }1928 1929 1885 auto path = m_idbDatabasePaths.get(sessionID); 1930 1886 if (!path.isEmpty() && websiteDataTypes.contains(WebsiteDataType::IndexedDBDatabases)) { … … 1973 1929 } 1974 1930 1975 if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) { 1976 iterator->value->deleteDataForRegistrableDomains(websiteDataTypes, domainsToDeleteAllNonCookieWebsiteDataFor, [callbackAggregator](auto deletedDomains) mutable { 1977 for (auto domain : deletedDomains) 1978 callbackAggregator->m_domains.add(WTFMove(domain)); 1979 }); 1931 if (NetworkStorageManager::canHandleTypes(websiteDataTypes)) { 1932 if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) { 1933 iterator->value->deleteDataForRegistrableDomains(websiteDataTypes, domainsToDeleteAllNonCookieWebsiteDataFor, [callbackAggregator](auto&& deletedDomains) mutable { 1934 for (auto domain : deletedDomains) 1935 callbackAggregator->m_domains.add(WTFMove(domain)); 1936 }); 1937 } 1980 1938 } 1981 1939 … … 2308 2266 #endif 2309 2267 2310 m_storageManagerSet->suspend([callbackAggregator] { }); 2268 for (auto& manager : m_storageManagers.values()) 2269 manager->suspend([callbackAggregator] { }); 2311 2270 } 2312 2271 … … 2347 2306 #endif 2348 2307 2349 m_storageManagerSet->resume(); 2308 for (auto& manager : m_storageManagers.values()) 2309 manager->resume(); 2350 2310 } 2351 2311 … … 2443 2403 void NetworkProcess::syncLocalStorage(CompletionHandler<void()>&& completionHandler) 2444 2404 { 2445 m_storageManagerSet->waitUntilSyncingLocalStorageFinished(); 2446 completionHandler(); 2405 auto aggregator = CallbackAggregator::create(WTFMove(completionHandler)); 2406 for (auto& manager : m_storageManagers.values()) 2407 manager->syncLocalStorage([aggregator] { }); 2447 2408 } 2448 2409 … … 2474 2435 return; 2475 2436 2476 if (dataTypes.contains(WebsiteDataType::LocalStorage)) { 2477 if (m_storageManagerSet->contains(sessionID)) 2478 m_storageManagerSet->renameOrigin(sessionID, oldName, newName, [aggregator] { }); 2479 } 2437 if (auto iterator = m_storageManagers.find(sessionID); iterator != m_storageManagers.end()) 2438 iterator->value->moveData(oldOrigin, newOrigin, [aggregator] { }); 2480 2439 2481 2440 if (dataTypes.contains(WebsiteDataType::IndexedDBDatabases)) { … … 2772 2731 } 2773 2732 2774 void NetworkProcess::getLocalStorageOriginDetails(PAL::SessionID sessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)2775 {2776 if (!m_storageManagerSet->contains(sessionID)) {2777 LOG_ERROR("Cannot get local storage information for an unknown session");2778 completionHandler({ });2779 return;2780 }2781 2782 m_storageManagerSet->getLocalStorageOriginDetails(sessionID, WTFMove(completionHandler));2783 }2784 2785 2733 void NetworkProcess::connectionToWebProcessClosed(IPC::Connection& connection, PAL::SessionID sessionID) 2786 2734 { 2787 m_storageManagerSet->removeConnection(connection);2788 2789 2735 if (auto* server = m_webIDBServers.get(sessionID)) 2790 2736 server->removeConnection(connection); -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.h
r286788 r286936 108 108 class NetworkStorageManager; 109 109 class ProcessAssertion; 110 class StorageManagerSet;111 110 class WebPageNetworkParameters; 112 111 class WebSWServerConnection; … … 297 296 298 297 void connectionToWebProcessClosed(IPC::Connection&, PAL::SessionID); 299 void getLocalStorageOriginDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);300 298 301 299 #if ENABLE(CONTENT_EXTENSIONS) … … 555 553 void removeSessionStorageQuotaManager(PAL::SessionID); 556 554 557 void addStorageManagerForSession(PAL::SessionID, const String& path, SandboxExtension::Handle& );555 void addStorageManagerForSession(PAL::SessionID, const String& path, SandboxExtension::Handle&, const String& localStoragePath, SandboxExtension::Handle&); 558 556 void removeStorageManagerForSession(PAL::SessionID); 559 557 … … 577 575 HashMap<PAL::SessionID, std::unique_ptr<NetworkSession>> m_networkSessions; 578 576 HashMap<PAL::SessionID, std::unique_ptr<WebCore::NetworkStorageSession>> m_networkStorageSessions; 579 580 Ref<StorageManagerSet> m_storageManagerSet;581 577 582 578 #if PLATFORM(COCOA) -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in
r286788 r286936 174 174 SetPCMFraudPreventionValuesForTesting(PAL::SessionID sessionID, String secretToken, String unlinkableToken, String signature, String keyID) -> () Async 175 175 SetPrivateClickMeasurementAppBundleIDForTesting(PAL::SessionID sessionID, String appBundleIDForTesting) -> () Async 176 GetLocalStorageOriginDetails(PAL::SessionID sessionID) -> (Vector<WebKit::LocalStorageDatabaseTracker::OriginDetails> details) Async177 176 178 177 SetServiceWorkerFetchTimeoutForTesting(Seconds seconds) -> () Synchronous -
trunk/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h
r286935 r286936 26 26 #pragma once 27 27 28 #include "Connection.h" 29 #include <wtf/text/WTFString.h> 28 #include "StorageAreaIdentifier.h" 30 29 31 30 namespace WebCore { 32 31 struct ClientOrigin; 32 struct SecurityOriginData; 33 33 } 34 34 35 35 namespace WebKit { 36 36 37 class FileSystemStorageHandleRegistry;38 class FileSystemStorageManager;39 enum class WebsiteDataType : uint32_t;37 class MemoryStorageArea; 38 class StorageAreaBase; 39 class StorageAreaRegistry; 40 40 41 class OriginStorageManager {41 class LocalStorageManager { 42 42 WTF_MAKE_FAST_ALLOCATED; 43 43 public: 44 explicit OriginStorageManager(String&& path);45 ~OriginStorageManager();44 static Vector<WebCore::SecurityOriginData> originsOfLocalStorageData(const String& path); 45 static String localStorageFilePath(const String& path, const WebCore::ClientOrigin&); 46 46 47 LocalStorageManager(const String& path, StorageAreaRegistry&); 48 bool isActive() const; 49 bool hasDataInMemory() const; 50 void clearDataInMemory(); 51 void clearDataOnDisk(); 52 void close(); 53 void handleLowMemoryWarning(); 54 void syncLocalStorage(); 47 55 void connectionClosed(IPC::Connection::UniqueID); 48 bool persisted() const { return m_persisted; } 49 void setPersisted(bool value); 50 FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&); 51 bool isActive(); 52 void deleteData(OptionSet<WebsiteDataType>, WallTime); 56 57 StorageAreaIdentifier connectToLocalStorageArea(IPC::Connection::UniqueID, const WebCore::ClientOrigin&, Ref<WorkQueue>&&); 58 StorageAreaIdentifier connectToTransientLocalStorageArea(IPC::Connection::UniqueID, const WebCore::ClientOrigin&); 59 void disconnectFromStorageArea(IPC::Connection::UniqueID, StorageAreaIdentifier); 53 60 54 61 private: 55 enum class StorageBucketMode : bool; 56 class StorageBucket; 57 StorageBucket& defaultBucket(); 62 void connectionClosedForLocalStorageArea(IPC::Connection::UniqueID); 63 void connectionClosedForTransientStorageArea(IPC::Connection::UniqueID); 58 64 59 void createOriginFileIfNecessary(const WebCore::ClientOrigin&);60 void deleteOriginFileIfNecessary();61 62 std::unique_ptr<StorageBucket> m_defaultBucket;63 65 String m_path; 64 bool m_persisted { false }; 66 StorageAreaRegistry& m_registry; 67 std::unique_ptr<MemoryStorageArea> m_transientStorageArea; 68 std::unique_ptr<StorageAreaBase> m_localStorageArea; 65 69 }; 66 70 67 71 } // namespace WebKit 68 72 73 -
trunk/Source/WebKit/NetworkProcess/storage/MemoryStorageArea.h
r286935 r286936 1 1 /* 2 * Copyright (C) 20 21 Apple Inc. All rights reserved.2 * Copyright (C) 2013-2021 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 26 26 #pragma once 27 27 28 #include " Connection.h"29 #include < wtf/text/WTFString.h>28 #include "StorageAreaBase.h" 29 #include <WebCore/StorageMap.h> 30 30 31 31 namespace WebCore { 32 struct ClientOrigin;32 class StorageMap; 33 33 } 34 34 35 35 namespace WebKit { 36 36 37 class FileSystemStorageHandleRegistry;38 class FileSystemStorageManager; 39 enum class WebsiteDataType : uint32_t;37 class MemoryStorageArea final : public StorageAreaBase { 38 public: 39 explicit MemoryStorageArea(const WebCore::ClientOrigin&, StorageAreaBase::StorageType = StorageAreaBase::StorageType::Session); 40 40 41 class OriginStorageManager { 42 WTF_MAKE_FAST_ALLOCATED; 43 public: 44 explicit OriginStorageManager(String&& path); 45 ~OriginStorageManager(); 46 47 void connectionClosed(IPC::Connection::UniqueID); 48 bool persisted() const { return m_persisted; } 49 void setPersisted(bool value); 50 FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&); 51 bool isActive(); 52 void deleteData(OptionSet<WebsiteDataType>, WallTime); 41 StorageAreaBase::Type type() const final { return StorageAreaBase::Type::Memory; }; 42 bool isEmpty() final; 43 void clear() final; 44 std::unique_ptr<MemoryStorageArea> clone() const; 45 53 46 54 47 private: 55 enum class StorageBucketMode : bool; 56 class StorageBucket; 57 StorageBucket& defaultBucket(); 48 // StorageAreaBase 49 StorageAreaBase::StorageType storageType() const final { return m_storageType; } 50 HashMap<String, String> allItems() final; 51 Expected<void, StorageError> setItem(IPC::Connection::UniqueID, StorageAreaImplIdentifier, String&& key, String&& value, const String& urlString) final; 52 Expected<void, StorageError> removeItem(IPC::Connection::UniqueID, StorageAreaImplIdentifier, const String& key, const String& urlString) final; 53 Expected<void, StorageError> clear(IPC::Connection::UniqueID, StorageAreaImplIdentifier, const String& urlString) final; 58 54 59 void createOriginFileIfNecessary(const WebCore::ClientOrigin&); 60 void deleteOriginFileIfNecessary(); 61 62 std::unique_ptr<StorageBucket> m_defaultBucket; 63 String m_path; 64 bool m_persisted { false }; 55 mutable WebCore::StorageMap m_map; 56 StorageAreaBase::StorageType m_storageType; 65 57 }; 66 58 67 59 } // namespace WebKit 68 60 61 SPECIALIZE_TYPE_TRAITS_BEGIN(WebKit::MemoryStorageArea) 62 static bool isType(const WebKit::StorageAreaBase& area) { return area.type() == WebKit::StorageAreaBase::Type::Memory; } 63 SPECIALIZE_TYPE_TRAITS_END() -
trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp
r286771 r286936 29 29 #include "FileSystemStorageHandleRegistry.h" 30 30 #include "FileSystemStorageManager.h" 31 #include "LocalStorageManager.h" 31 32 #include "Logging.h" 32 33 #include "NetworkStorageManagerMessages.h" 33 34 #include "OriginStorageManager.h" 35 #include "SessionStorageManager.h" 36 #include "StorageAreaBase.h" 37 #include "StorageAreaMapMessages.h" 38 #include "StorageAreaRegistry.h" 34 39 #include "WebsiteDataType.h" 40 #include <WebCore/SecurityOriginData.h> 35 41 #include <pal/crypto/CryptoDigest.h> 36 42 #include <wtf/Scope.h> 43 #include <wtf/SuspendableWorkQueue.h> 37 44 #include <wtf/persistence/PersistentCoders.h> 38 45 #include <wtf/text/Base64.h> … … 44 51 ASSERT(!RunLoop::isMain()); 45 52 46 if ( !FileSystem::fileExists(filePath))53 if (filePath.isEmpty() || !FileSystem::fileExists(filePath)) 47 54 return std::nullopt; 48 55 … … 67 74 static void writeOriginToFileIfNecessary(const String& filePath, const WebCore::ClientOrigin& origin) 68 75 { 69 if ( FileSystem::fileExists(filePath))76 if (filePath.isEmpty() || FileSystem::fileExists(filePath)) 70 77 return; 71 78 … … 77 84 78 85 if (!FileSystem::isHandleValid(originFileHandle)) { 79 LOG_ERROR("writeOriginToFileIfNecessary: Failed to open origin file ");86 LOG_ERROR("writeOriginToFileIfNecessary: Failed to open origin file '%s'", filePath.utf8().data()); 80 87 return; 81 88 } … … 94 101 } 95 102 96 Ref<NetworkStorageManager> NetworkStorageManager::create(PAL::SessionID sessionID, const String& path )97 { 98 return adoptRef(*new NetworkStorageManager(sessionID, path ));99 } 100 101 NetworkStorageManager::NetworkStorageManager(PAL::SessionID sessionID, const String& path )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) 102 109 : m_sessionID(sessionID) 103 , m_queue( WorkQueue::create("com.apple.WebKit.Storage"))104 { 105 ASSERT(RunLoop::isMain()); 106 107 m_queue->dispatch([this, protectedThis = Ref { *this }, path = path.isolatedCopy() ]() mutable {110 , 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 { 108 115 m_fileSystemStorageHandleRegistry = makeUnique<FileSystemStorageHandleRegistry>(); 116 m_storageAreaRegistry = makeUnique<StorageAreaRegistry>(); 109 117 m_path = path; 118 m_customLocalStoragePath = customLocalStoragePath; 110 119 if (!m_path.isEmpty()) { 111 120 auto saltPath = FileSystem::pathByAppendingComponent(m_path, "salt"); … … 121 130 } 122 131 132 bool NetworkStorageManager::canHandleTypes(OptionSet<WebsiteDataType> types) 133 { 134 return types.contains(WebsiteDataType::LocalStorage) || types.contains(WebsiteDataType::SessionStorage) || types.contains(WebsiteDataType::FileSystem); 135 } 136 123 137 void NetworkStorageManager::close() 124 138 { … … 134 148 m_queue->dispatch([this, protectedThis = Ref { *this }]() mutable { 135 149 m_localOriginStorageManagers.clear(); 136 m_sessionOriginStorageManagers.clear();137 150 m_fileSystemStorageHandleRegistry = nullptr; 138 151 … … 178 191 { 179 192 if (rootPath.isEmpty()) 180 return rootPath;193 return String { }; 181 194 182 195 auto encodedTopOrigin = encode(origin.topOrigin.toString(), salt); … … 187 200 static String originFilePath(const String& directory) 188 201 { 202 if (directory.isEmpty()) 203 return String { }; 189 204 return FileSystem::pathByAppendingComponent(directory, "origin"_s); 190 205 } … … 197 212 auto originDirectory = originDirectoryPath(m_path, origin, m_salt); 198 213 writeOriginToFileIfNecessary(originFilePath(originDirectory), origin); 199 return makeUnique<OriginStorageManager>(WTFMove(originDirectory) );214 return makeUnique<OriginStorageManager>(WTFMove(originDirectory), LocalStorageManager::localStorageFilePath(m_customLocalStoragePath, origin)); 200 215 }).iterator->value; 201 216 } 202 217 203 void NetworkStorageManager::removeOriginStorageManagerIfPossible(const WebCore::ClientOrigin& origin) 204 { 205 if (auto iterator = m_localOriginStorageManagers.find(origin); iterator != m_localOriginStorageManagers.end()) { 206 if (!iterator->value->isActive()) 207 m_localOriginStorageManagers.remove(iterator); 208 } 218 bool NetworkStorageManager::removeOriginStorageManagerIfPossible(const WebCore::ClientOrigin& origin) 219 { 220 auto iterator = m_localOriginStorageManagers.find(origin); 221 if (iterator == m_localOriginStorageManagers.end()) 222 return true; 223 224 if (iterator->value->isActive()) 225 return false; 226 227 m_localOriginStorageManagers.remove(iterator); 228 return true; 229 } 230 231 void NetworkStorageManager::deleteOriginDirectoryIfPossible(const WebCore::ClientOrigin& origin) 232 { 233 bool isEmpty = localOriginStorageManager(origin).isEmpty(); 234 bool removed = removeOriginStorageManagerIfPossible(origin); 235 if (!removed || !isEmpty) 236 return; 237 238 auto originDirectory = originDirectoryPath(m_path, origin, m_salt); 239 auto filePath = originFilePath(originDirectory); 240 deleteOriginFileIfNecessary(filePath); 241 FileSystem::deleteEmptyDirectory(originDirectory); 209 242 } 210 243 … … 233 266 manager->setPersisted(false); 234 267 235 for (auto& manager : m_sessionOriginStorageManagers.values())236 manager->setPersisted(false);237 238 268 RunLoop::main().dispatch([protectedThis = WTFMove(protectedThis), completionHandler = WTFMove(completionHandler)]() mutable { 239 269 completionHandler(); … … 381 411 382 412 completionHandler(handle->getHandle(connection.uniqueID(), WTFMove(name))); 383 }384 385 static std::optional<WebsiteDataType> toWebsiteDataType(const String& storageType)386 {387 if (storageType == "FileSystem")388 return WebsiteDataType::FileSystem;389 390 return std::nullopt;391 413 } 392 414 … … 402 424 403 425 for (auto& openingOrigin : openingOrigins) { 426 if (openingOrigin.startsWith('.')) 427 continue; 428 404 429 auto openingOriginDirectory = FileSystem::pathByAppendingComponent(topOriginDirectory, openingOrigin); 405 430 apply(openingOriginDirectory); … … 408 433 } 409 434 435 HashSet<WebCore::ClientOrigin> NetworkStorageManager::getAllOrigins() 436 { 437 HashSet<WebCore::ClientOrigin> allOrigins; 438 for (auto& origin : m_localOriginStorageManagers.keys()) 439 allOrigins.add(origin); 440 441 forEachOriginDirectory([&](auto directory) { 442 if (auto origin = readOriginFromFile(originFilePath(directory))) 443 allOrigins.add(*origin); 444 }); 445 446 for (auto& origin : LocalStorageManager::originsOfLocalStorageData(m_customLocalStoragePath)) 447 allOrigins.add(WebCore::ClientOrigin { origin, origin }); 448 449 return allOrigins; 450 } 451 410 452 Vector<WebsiteData::Entry> NetworkStorageManager::fetchDataFromDisk(OptionSet<WebsiteDataType> targetTypes) 411 453 { … … 413 455 414 456 HashMap<WebCore::SecurityOriginData, OptionSet<WebsiteDataType>> originTypes; 415 forEachOriginDirectory([&](auto directory) mutable { 416 auto origin = readOriginFromFile(originFilePath(directory)); 417 if (!origin) 418 return; 419 420 for (auto& storageType : FileSystem::listDirectory(directory)) { 421 if (auto type = toWebsiteDataType(storageType); type && targetTypes.contains(*type)) { 422 // Return both top origin and opening origin for this data. 423 originTypes.add(origin->clientOrigin, OptionSet<WebsiteDataType> { }).iterator->value.add(*type); 424 originTypes.add(origin->topOrigin, OptionSet<WebsiteDataType> { }).iterator->value.add(*type); 425 } 426 } 427 }); 457 for (auto& origin : getAllOrigins()) { 458 auto types = localOriginStorageManager(origin).fetchDataTypesInList(targetTypes); 459 originTypes.add(origin.clientOrigin, OptionSet<WebsiteDataType> { }).iterator->value.add(types); 460 originTypes.add(origin.topOrigin, OptionSet<WebsiteDataType> { }).iterator->value.add(types); 461 removeOriginStorageManagerIfPossible(origin); 462 } 428 463 429 464 Vector<WebsiteData::Entry> entries; … … 449 484 } 450 485 451 Vector<WebCore::ClientOrigin> NetworkStorageManager::deleteDataOnDisk(OptionSet<WebsiteDataType> types, WallTime modifiedSinceTime, const Function<bool(const WebCore::ClientOrigin&)>& filter) 452 { 453 ASSERT(!RunLoop::isMain()); 454 455 Vector<WebCore::ClientOrigin> deletedOrigins; 456 forEachOriginDirectory([&](auto directory) mutable { 457 auto filePath = originFilePath(directory); 458 auto origin = readOriginFromFile(filePath); 459 if (!origin) { 460 // If origin cannot be retrieved, but we are asked to remove data for all origins, remove it. 461 RELEASE_LOG_ERROR(Storage, "NetworkStorageManager::deleteDataOnDisk failed to read origin from '%s'", filePath.utf8().data()); 462 if (filter(WebCore::ClientOrigin { })) { 463 auto tempOriginStorageManager = makeUnique<OriginStorageManager>(String { directory }); 464 tempOriginStorageManager->deleteData(types, modifiedSinceTime); 465 deleteOriginFileIfNecessary(filePath); 466 FileSystem::deleteEmptyDirectory(directory); 467 } 468 return; 486 HashSet<WebCore::ClientOrigin> NetworkStorageManager::deleteDataOnDisk(OptionSet<WebsiteDataType> types, WallTime modifiedSinceTime, const Function<bool(const WebCore::ClientOrigin&)>& filter) 487 { 488 ASSERT(!RunLoop::isMain()); 489 490 HashSet<WebCore::ClientOrigin> deletedOrigins; 491 for (auto& origin : getAllOrigins()) { 492 if (!filter(origin)) 493 continue; 494 495 auto existingDataTypes = localOriginStorageManager(origin).fetchDataTypesInList(types); 496 if (!existingDataTypes.isEmpty()) { 497 deletedOrigins.add(origin); 498 localOriginStorageManager(origin).deleteData(types, modifiedSinceTime); 469 499 } 470 471 if (!filter(*origin)) 472 return; 473 474 deletedOrigins.append(*origin); 475 localOriginStorageManager(*origin).deleteData(types, modifiedSinceTime); 476 removeOriginStorageManagerIfPossible(*origin); 477 deleteOriginFileIfNecessary(filePath); 478 FileSystem::deleteEmptyDirectory(directory); 479 }); 500 deleteOriginDirectoryIfPossible(origin); 501 } 480 502 481 503 return deletedOrigins; … … 542 564 } 543 565 566 void NetworkStorageManager::moveData(const WebCore::SecurityOriginData& source, const WebCore::SecurityOriginData& target, CompletionHandler<void()>&& completionHandler) 567 { 568 ASSERT(RunLoop::isMain()); 569 ASSERT(!m_closed); 570 571 m_queue->dispatch([this, protectedThis = Ref { *this }, source = crossThreadCopy(source), target = crossThreadCopy(target), completionHandler = WTFMove(completionHandler)]() mutable { 572 auto sourceOrigin = WebCore::ClientOrigin { source, source }; 573 auto targetOrigin = WebCore::ClientOrigin { target, target }; 574 575 // Clear existing data of target origin. 576 OptionSet<WebsiteDataType> types = { WebsiteDataType::FileSystem, WebsiteDataType::LocalStorage, WebsiteDataType::SessionStorage }; 577 localOriginStorageManager(targetOrigin).deleteData(types, -WallTime::infinity()); 578 removeOriginStorageManagerIfPossible(targetOrigin); 579 580 // Move data from source origin to target origin. 581 localOriginStorageManager(sourceOrigin).moveData(originDirectoryPath(m_path, targetOrigin, m_salt), LocalStorageManager::localStorageFilePath(m_customLocalStoragePath, targetOrigin)); 582 removeOriginStorageManagerIfPossible(sourceOrigin); 583 584 RunLoop::main().dispatch(WTFMove(completionHandler)); 585 }); 586 } 587 588 void NetworkStorageManager::suspend(CompletionHandler<void()>&& completionHandler) 589 { 590 ASSERT(RunLoop::isMain()); 591 592 m_queue->suspend([this, protectedThis = Ref { *this }] { 593 for (auto& manager : m_localOriginStorageManagers.values()) { 594 if (auto localStorageManager = manager->existingLocalStorageManager()) 595 localStorageManager->syncLocalStorage(); 596 } 597 }, WTFMove(completionHandler)); 598 } 599 600 void NetworkStorageManager::resume() 601 { 602 ASSERT(RunLoop::isMain()); 603 604 m_queue->resume(); 605 } 606 607 void NetworkStorageManager::handleLowMemoryWarning() 608 { 609 ASSERT(RunLoop::isMain()); 610 611 m_queue->dispatch([this, protectedThis = Ref { *this }] { 612 for (auto& manager : m_localOriginStorageManagers.values()) { 613 if (auto localStorageManager = manager->existingLocalStorageManager()) 614 localStorageManager->handleLowMemoryWarning(); 615 } 616 }); 617 } 618 619 void NetworkStorageManager::syncLocalStorage(CompletionHandler<void()>&& completionHandler) 620 { 621 ASSERT(RunLoop::isMain()); 622 623 m_queue->dispatch([this, protectedThis = Ref { *this }, completionHandler = WTFMove(completionHandler)]() mutable { 624 for (auto& manager : m_localOriginStorageManagers.values()) { 625 if (auto localStorageManager = manager->existingLocalStorageManager()) 626 localStorageManager->syncLocalStorage(); 627 } 628 629 RunLoop::main().dispatch(WTFMove(completionHandler)); 630 }); 631 } 632 633 void NetworkStorageManager::connectToLocalStorageArea(IPC::Connection& connection, StorageNamespaceIdentifier, WebCore::SecurityOriginData&& topOrigin, CompletionHandler<void(StorageAreaIdentifier)>&& completionHandler) 634 { 635 ASSERT(!RunLoop::isMain()); 636 637 WebCore::ClientOrigin origin = { topOrigin, topOrigin }; 638 completionHandler(localOriginStorageManager(origin).localStorageManager(*m_storageAreaRegistry).connectToLocalStorageArea(connection.uniqueID(), origin, m_queue.copyRef())); 639 } 640 641 void NetworkStorageManager::connectToTransientLocalStorageArea(IPC::Connection& connection, StorageNamespaceIdentifier, WebCore::SecurityOriginData&& topOrigin, WebCore::SecurityOriginData&& openingOrigin, CompletionHandler<void(StorageAreaIdentifier)>&& completionHandler) 642 { 643 WebCore::ClientOrigin origin = { topOrigin, openingOrigin }; 644 completionHandler(localOriginStorageManager(origin).localStorageManager(*m_storageAreaRegistry).connectToTransientLocalStorageArea(connection.uniqueID(), origin)); 645 } 646 647 void NetworkStorageManager::connectToSessionStorageArea(IPC::Connection& connection, StorageNamespaceIdentifier identifier, WebCore::SecurityOriginData&& topOrigin, CompletionHandler<void(StorageAreaIdentifier)>&& completionHandler) 648 { 649 WebCore::ClientOrigin origin = { topOrigin, topOrigin }; 650 completionHandler(localOriginStorageManager(origin).sessionStorageManager(*m_storageAreaRegistry).connectToSessionStorageArea(connection.uniqueID(), origin, identifier)); 651 } 652 653 void NetworkStorageManager::disconnectFromStorageArea(IPC::Connection& connection, StorageAreaIdentifier identifier) 654 { 655 ASSERT(!RunLoop::isMain()); 656 657 auto storageArea = m_storageAreaRegistry->getStorageArea(identifier); 658 if (!storageArea) 659 return; 660 661 if (storageArea->storageType() == StorageAreaBase::StorageType::Local) 662 localOriginStorageManager(storageArea->origin()).localStorageManager(*m_storageAreaRegistry).disconnectFromStorageArea(connection.uniqueID(), identifier); 663 else 664 localOriginStorageManager(storageArea->origin()).sessionStorageManager(*m_storageAreaRegistry).disconnectFromStorageArea(connection.uniqueID(), identifier); 665 } 666 667 void NetworkStorageManager::cloneSessionStorageNamespace(IPC::Connection& connection, StorageNamespaceIdentifier fromIdentifier, StorageNamespaceIdentifier toIdentifier) 668 { 669 ASSERT(!RunLoop::isMain()); 670 671 for (auto& manager : m_localOriginStorageManagers.values()) { 672 if (auto* sessionStorageManager = manager->existingSessionStorageManager()) 673 sessionStorageManager->cloneStorageArea(connection.uniqueID(), fromIdentifier, toIdentifier); 674 } 675 } 676 677 void NetworkStorageManager::getValues(StorageAreaIdentifier identifier, CompletionHandler<void(const HashMap<String, String>&)>&& completionHandler) 678 { 679 ASSERT(!RunLoop::isMain()); 680 681 if (auto storageArea = m_storageAreaRegistry->getStorageArea(identifier)) 682 return completionHandler(storageArea->allItems()); 683 684 return completionHandler({ }); 685 } 686 687 void NetworkStorageManager::setItem(IPC::Connection& connection, StorageAreaIdentifier identifier, StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String&& key, String&& value, String&& urlString) 688 { 689 ASSERT(!RunLoop::isMain()); 690 691 bool hasQuotaError = false; 692 if (auto storageArea = m_storageAreaRegistry->getStorageArea(identifier)) { 693 auto result = storageArea->setItem(connection.uniqueID(), implIdentifier, String { key }, WTFMove(value), WTFMove(urlString)); 694 if (!result) 695 hasQuotaError = (result.error() == StorageError::QuotaExceeded); 696 } 697 698 connection.send(Messages::StorageAreaMap::DidSetItem(storageMapSeed, key, hasQuotaError), identifier); 699 } 700 701 void NetworkStorageManager::removeItem(IPC::Connection& connection, StorageAreaIdentifier identifier, StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String&& key, String&& urlString) 702 { 703 ASSERT(!RunLoop::isMain()); 704 705 if (auto storageArea = m_storageAreaRegistry->getStorageArea(identifier)) 706 storageArea->removeItem(connection.uniqueID(), implIdentifier, key, WTFMove(urlString)); 707 708 connection.send(Messages::StorageAreaMap::DidRemoveItem(storageMapSeed, WTFMove(key)), identifier); 709 } 710 711 void NetworkStorageManager::clear(IPC::Connection& connection, StorageAreaIdentifier identifier, StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String&& urlString) 712 { 713 ASSERT(!RunLoop::isMain()); 714 715 if (auto storageArea = m_storageAreaRegistry->getStorageArea(identifier)) 716 storageArea->clear(connection.uniqueID(), implIdentifier, WTFMove(urlString)); 717 718 connection.send(Messages::StorageAreaMap::DidClear(storageMapSeed), identifier); 719 } 720 544 721 } // namespace WebKit 545 722 -
trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h
r286601 r286936 29 29 #include "FileSystemStorageError.h" 30 30 #include "OriginStorageManager.h" 31 #include "StorageAreaIdentifier.h" 32 #include "StorageAreaImplIdentifier.h" 33 #include "StorageNamespaceIdentifier.h" 31 34 #include "WebsiteData.h" 32 35 #include <WebCore/ClientOrigin.h> … … 47 50 48 51 class FileSystemStorageHandleRegistry; 52 class StorageAreaRegistry; 49 53 50 54 class NetworkStorageManager final : public IPC::Connection::WorkQueueMessageReceiver { 51 55 public: 52 static Ref<NetworkStorageManager> create(PAL::SessionID, const String& path); 56 static Ref<NetworkStorageManager> create(PAL::SessionID, const String& path, const String& customLocalStoragePath); 57 static bool canHandleTypes(OptionSet<WebsiteDataType>); 53 58 54 59 void startReceivingMessageFromConnection(IPC::Connection&); … … 62 67 void deleteDataModifiedSince(OptionSet<WebsiteDataType>, WallTime, CompletionHandler<void()>&&); 63 68 void deleteDataForRegistrableDomains(OptionSet<WebsiteDataType>, const Vector<WebCore::RegistrableDomain>&, CompletionHandler<void(HashSet<WebCore::RegistrableDomain>&&)>&&); 69 void moveData(const WebCore::SecurityOriginData& source, const WebCore::SecurityOriginData& target, CompletionHandler<void()>&&); 70 void suspend(CompletionHandler<void()>&&); 71 void resume(); 72 void handleLowMemoryWarning(); 73 void syncLocalStorage(CompletionHandler<void()>&&); 64 74 65 75 private: 66 NetworkStorageManager(PAL::SessionID, const String& path );76 NetworkStorageManager(PAL::SessionID, const String& path, const String& customLocalStoragePath); 67 77 ~NetworkStorageManager(); 68 78 OriginStorageManager& localOriginStorageManager(const WebCore::ClientOrigin&); 69 void removeOriginStorageManagerIfPossible(const WebCore::ClientOrigin&); 79 bool removeOriginStorageManagerIfPossible(const WebCore::ClientOrigin&); 80 void deleteOriginDirectoryIfPossible(const WebCore::ClientOrigin&); 70 81 FileSystemStorageHandleRegistry& fileSystemStorageHandleRegistry(); 71 82 72 83 void forEachOriginDirectory(const Function<void(const String&)>&); 84 HashSet<WebCore::ClientOrigin> getAllOrigins(); 73 85 Vector<WebsiteData::Entry> fetchDataFromDisk(OptionSet<WebsiteDataType>); 74 Vector<WebCore::ClientOrigin> deleteDataOnDisk(OptionSet<WebsiteDataType>, WallTime, const Function<bool(const WebCore::ClientOrigin&)>&);86 HashSet<WebCore::ClientOrigin> deleteDataOnDisk(OptionSet<WebsiteDataType>, WallTime, const Function<bool(const WebCore::ClientOrigin&)>&); 75 87 76 88 // IPC::MessageReceiver (implemented by generated code) 77 89 void didReceiveMessage(IPC::Connection&, IPC::Decoder&); 90 bool didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, UniqueRef<IPC::Encoder>& replyEncoder); 78 91 79 // Message handlers 92 // Message handlers for FileSystem. 80 93 void persisted(const WebCore::ClientOrigin&, CompletionHandler<void(bool)>&&); 81 94 void persist(const WebCore::ClientOrigin&, CompletionHandler<void(bool)>&&); … … 89 102 void resolve(WebCore::FileSystemHandleIdentifier, WebCore::FileSystemHandleIdentifier, CompletionHandler<void(Expected<Vector<String>, FileSystemStorageError>)>&&); 90 103 void getFile(WebCore::FileSystemHandleIdentifier, CompletionHandler<void(Expected<String, FileSystemStorageError>)>&&); 91 92 104 using AccessHandleInfo = std::pair<WebCore::FileSystemSyncAccessHandleIdentifier, IPC::SharedFileHandle>; 93 105 void createSyncAccessHandle(WebCore::FileSystemHandleIdentifier, CompletionHandler<void(Expected<AccessHandleInfo, FileSystemStorageError>)>&&); … … 95 107 void getHandleNames(WebCore::FileSystemHandleIdentifier, CompletionHandler<void(Expected<Vector<String>, FileSystemStorageError>)>&&); 96 108 void getHandle(IPC::Connection&, WebCore::FileSystemHandleIdentifier, String&& name, CompletionHandler<void(Expected<std::pair<WebCore::FileSystemHandleIdentifier, bool>, FileSystemStorageError>)>&&); 109 110 // Message handlers for WebStorage. 111 void connectToLocalStorageArea(IPC::Connection&, StorageNamespaceIdentifier, WebCore::SecurityOriginData&&, CompletionHandler<void(StorageAreaIdentifier)>&&); 112 void connectToTransientLocalStorageArea(IPC::Connection&, StorageNamespaceIdentifier, WebCore::SecurityOriginData&&, WebCore::SecurityOriginData&&, CompletionHandler<void(StorageAreaIdentifier)>&&); 113 void connectToSessionStorageArea(IPC::Connection&, StorageNamespaceIdentifier, WebCore::SecurityOriginData&&, CompletionHandler<void(StorageAreaIdentifier)>&&); 114 void disconnectFromStorageArea(IPC::Connection&, StorageAreaIdentifier); 115 void cloneSessionStorageNamespace(IPC::Connection&, StorageNamespaceIdentifier, StorageNamespaceIdentifier); 116 void getValues(StorageAreaIdentifier, CompletionHandler<void(const HashMap<String, String>&)>&&); 117 void setItem(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t seed, String&& key, String&& value, String&& urlString); 118 void removeItem(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t seed, String&& key, String&& urlString); 119 void clear(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t seed, String&& urlString); 97 120 98 121 PAL::SessionID m_sessionID; 99 Ref< WorkQueue> m_queue;122 Ref<SuspendableWorkQueue> m_queue; 100 123 String m_path; 101 124 FileSystem::Salt m_salt; 102 125 bool m_closed { false }; 103 126 HashMap<WebCore::ClientOrigin, std::unique_ptr<OriginStorageManager>> m_localOriginStorageManagers; 104 HashMap<WebCore::ClientOrigin, std::unique_ptr<OriginStorageManager>> m_sessionOriginStorageManagers;105 127 WeakHashSet<IPC::Connection> m_connections; // Main thread only. 106 128 std::unique_ptr<FileSystemStorageHandleRegistry> m_fileSystemStorageHandleRegistry; 129 std::unique_ptr<StorageAreaRegistry> m_storageAreaRegistry; 130 String m_customLocalStoragePath; 107 131 }; 108 132 -
trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in
r285912 r286936 36 36 Move(WebCore::FileSystemHandleIdentifier identifier, WebCore::FileSystemHandleIdentifier destinationIdentifier, String newName) -> (std::optional<WebKit::FileSystemStorageError> result) Async 37 37 GetFile(WebCore::FileSystemHandleIdentifier identifier) -> (Expected<String, WebKit::FileSystemStorageError> result) Async 38 39 38 CreateSyncAccessHandle(WebCore::FileSystemHandleIdentifier identifier) -> (Expected<std::pair<WebCore::FileSystemSyncAccessHandleIdentifier, IPC::SharedFileHandle>, WebKit::FileSystemStorageError> result) Async 40 39 CloseAccessHandle(WebCore::FileSystemHandleIdentifier identifier, WebCore::FileSystemSyncAccessHandleIdentifier accessHandleIdentifier) -> (std::optional<WebKit::FileSystemStorageError> result) Async 41 40 GetHandleNames(WebCore::FileSystemHandleIdentifier identifier) -> (Expected<Vector<String>, WebKit::FileSystemStorageError> result) Async 42 41 GetHandle(WebCore::FileSystemHandleIdentifier identifier, String name) -> (Expected<std::pair<WebCore::FileSystemHandleIdentifier, bool>, WebKit::FileSystemStorageError> result) Async WantsConnection 42 43 ConnectToLocalStorageArea(WebKit::StorageNamespaceIdentifier storageNamespaceID, struct WebCore::SecurityOriginData securityOriginData) -> (WebKit::StorageAreaIdentifier identifier) Synchronous WantsConnection 44 ConnectToTransientLocalStorageArea(WebKit::StorageNamespaceIdentifier storageNamespaceID, struct WebCore::SecurityOriginData topLevelSecurityOriginData, struct WebCore::SecurityOriginData securityOriginData) -> (WebKit::StorageAreaIdentifier identifier) Synchronous WantsConnection 45 ConnectToSessionStorageArea(WebKit::StorageNamespaceIdentifier storageNamespaceID, struct WebCore::SecurityOriginData securityOriginData) -> (WebKit::StorageAreaIdentifier identifier) Synchronous WantsConnection 46 DisconnectFromStorageArea(WebKit::StorageAreaIdentifier identifier) WantsConnection 47 CloneSessionStorageNamespace(WebKit::StorageNamespaceIdentifier fromStorageNamespaceID, WebKit::StorageNamespaceIdentifier toStorageNamespaceID) WantsConnection 48 GetValues(WebKit::StorageAreaIdentifier identifier) -> (HashMap<String, String> values) Synchronous 49 SetItem(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String key, String value, String urlString) WantsConnection 50 RemoveItem(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String key, String urlString) WantsConnection 51 Clear(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String urlString) WantsConnection 43 52 } -
trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.cpp
r286837 r286936 29 29 #include "FileSystemStorageHandleRegistry.h" 30 30 #include "FileSystemStorageManager.h" 31 #include "LocalStorageManager.h" 32 #include "SessionStorageManager.h" 33 #include "StorageAreaRegistry.h" 31 34 #include "WebsiteDataType.h" 35 #include <WebCore/SQLiteFileSystem.h> 32 36 #include <wtf/FileSystem.h> 33 37 34 38 namespace WebKit { 35 39 40 static constexpr auto originFileName = "origin"_s; 36 41 enum class OriginStorageManager::StorageBucketMode : bool { BestEffort, Persistent }; 37 42 … … 39 44 WTF_MAKE_FAST_ALLOCATED; 40 45 public: 41 StorageBucket(const String& rootPath, const String& identifier )46 StorageBucket(const String& rootPath, const String& identifier, const String& localStoragePath) 42 47 : m_rootPath(rootPath) 43 48 , m_identifier(identifier) 49 , m_localStoragePath(localStoragePath) 44 50 { 45 51 } … … 56 62 enum class StorageType : uint8_t { 57 63 FileSystem, 64 LocalStorage, 65 SessionStorage, 58 66 }; 67 68 static std::optional<WebsiteDataType> toWebsiteDataType(const String& storageIdentifier) 69 { 70 if (storageIdentifier == "FileSystem"_s) 71 return WebsiteDataType::FileSystem; 72 if (storageIdentifier == "LocalStorage"_s) 73 return WebsiteDataType::LocalStorage; 74 if (storageIdentifier == "SessionStorage"_s) 75 return WebsiteDataType::SessionStorage; 76 77 return std::nullopt; 78 } 59 79 60 80 static String toStorageIdentifier(StorageType type) … … 63 83 case StorageType::FileSystem: 64 84 return "FileSystem"_s; 85 case StorageType::LocalStorage: 86 return "LocalStorage"_s; 87 case StorageType::SessionStorage: 88 return "SessionStorage"_s; 65 89 default: 66 90 break; … … 87 111 } 88 112 89 bool isActive() 90 { 91 return !!m_fileSystemStorageManager; 113 LocalStorageManager& localStorageManager(StorageAreaRegistry& registry) 114 { 115 if (!m_localStorageManager) 116 m_localStorageManager = makeUnique<LocalStorageManager>(m_localStoragePath, registry); 117 118 return *m_localStorageManager; 119 } 120 121 LocalStorageManager* existingLocalStorageManager() 122 { 123 return m_localStorageManager.get(); 124 } 125 126 SessionStorageManager& sessionStorageManager(StorageAreaRegistry& registry) 127 { 128 if (!m_sessionStorageManager) 129 m_sessionStorageManager = makeUnique<SessionStorageManager>(registry); 130 131 return *m_sessionStorageManager; 132 } 133 134 SessionStorageManager* existingSessionStorageManager() 135 { 136 return m_sessionStorageManager.get(); 137 } 138 139 bool isActive() const 140 { 141 return m_fileSystemStorageManager || m_localStorageManager || m_sessionStorageManager; 142 } 143 144 bool isEmpty() const 145 { 146 auto files = FileSystem::listDirectory(m_rootPath); 147 auto hasValidFile = WTF::anyOf(files, [&](auto file) { 148 bool isInvalidFile = (file == originFileName); 149 #if PLATFORM(COCOA) 150 isInvalidFile |= (file == ".DS_Store"); 151 #endif 152 return !isInvalidFile; 153 }); 154 if (hasValidFile) 155 return false; 156 157 return !FileSystem::fileExists(m_localStoragePath); 158 } 159 160 OptionSet<WebsiteDataType> fetchDataTypesInList(OptionSet<WebsiteDataType> types) 161 { 162 auto result = fetchDataTypesInListFromMemory(types); 163 result.add(fetchDataTypesInListFromDisk(types)); 164 165 return result; 92 166 } 93 167 … … 96 170 if (types.contains(WebsiteDataType::FileSystem)) 97 171 deleteFileSystemStorageData(modifiedSinceTime); 172 173 if (types.contains(WebsiteDataType::LocalStorage)) 174 deleteLocalStorageData(modifiedSinceTime); 175 176 if (types.contains(WebsiteDataType::SessionStorage) && modifiedSinceTime == -WallTime::infinity()) 177 deleteSessionStorageData(); 178 } 179 180 void moveData(const String& path, const String& localStoragePath) 181 { 182 m_fileSystemStorageManager = nullptr; 183 if (m_localStorageManager) 184 m_localStorageManager->close(); 185 186 FileSystem::makeAllDirectories(FileSystem::parentPath(path)); 187 FileSystem::moveFile(m_rootPath, path); 188 189 if (!m_localStoragePath.isEmpty() && !localStoragePath.isEmpty()) { 190 FileSystem::makeAllDirectories(FileSystem::parentPath(localStoragePath)); 191 WebCore::SQLiteFileSystem::moveDatabaseFile(m_localStoragePath, localStoragePath); 192 } 98 193 } 99 194 100 195 private: 196 OptionSet<WebsiteDataType> fetchDataTypesInListFromMemory(OptionSet<WebsiteDataType> types) 197 { 198 OptionSet<WebsiteDataType> result; 199 if (types.contains(WebsiteDataType::LocalStorage)) { 200 if (m_localStorageManager && m_localStorageManager->hasDataInMemory()) 201 result.add(WebsiteDataType::LocalStorage); 202 } 203 204 if (types.contains(WebsiteDataType::SessionStorage)) { 205 if (m_sessionStorageManager && m_sessionStorageManager->hasDataInMemory()) 206 result.add(WebsiteDataType::SessionStorage); 207 } 208 209 return result; 210 } 211 212 OptionSet<WebsiteDataType> fetchDataTypesInListFromDisk(OptionSet<WebsiteDataType> types) 213 { 214 OptionSet<WebsiteDataType> result; 215 for (auto& storageType : FileSystem::listDirectory(m_rootPath)) { 216 if (auto type = toWebsiteDataType(storageType); type && types.contains(*type)) 217 result.add(*type); 218 } 219 220 if (types.contains(WebsiteDataType::LocalStorage) && !result.contains(WebsiteDataType::LocalStorage)) { 221 if (FileSystem::fileExists(m_localStoragePath)) 222 result.add(WebsiteDataType::LocalStorage); 223 } 224 225 return result; 226 } 227 101 228 void deleteFileSystemStorageData(WallTime modifiedSinceTime) 102 229 { … … 107 234 } 108 235 236 void deleteLocalStorageData(WallTime time) 237 { 238 if (auto modificationTime = FileSystem::fileModificationTime(m_localStoragePath); *modificationTime >= time) { 239 if (m_localStorageManager) 240 m_localStorageManager->clearDataOnDisk(); 241 WebCore::SQLiteFileSystem::deleteDatabaseFile(m_localStoragePath); 242 } 243 244 if (!m_localStorageManager) 245 return; 246 247 m_localStorageManager->clearDataInMemory(); 248 if (!m_localStorageManager->isActive()) 249 m_localStorageManager = nullptr; 250 } 251 252 void deleteSessionStorageData() 253 { 254 if (!m_sessionStorageManager) 255 return; 256 257 m_sessionStorageManager->clearData(); 258 if (!m_sessionStorageManager->isActive()) 259 m_sessionStorageManager = nullptr; 260 } 261 109 262 String m_rootPath; 110 263 String m_identifier; 111 264 StorageBucketMode m_mode { StorageBucketMode::BestEffort }; 112 265 std::unique_ptr<FileSystemStorageManager> m_fileSystemStorageManager; 266 std::unique_ptr<LocalStorageManager> m_localStorageManager; 267 String m_localStoragePath; 268 std::unique_ptr<SessionStorageManager> m_sessionStorageManager; 113 269 }; 114 270 115 OriginStorageManager::OriginStorageManager(String&& path )271 OriginStorageManager::OriginStorageManager(String&& path, String&& localStoragePath) 116 272 : m_path(WTFMove(path)) 273 , m_localStoragePath(WTFMove(localStoragePath)) 117 274 { 118 275 ASSERT(!RunLoop::isMain()); … … 130 287 { 131 288 if (!m_defaultBucket) 132 m_defaultBucket = makeUnique<StorageBucket>(m_path, "default"_s );289 m_defaultBucket = makeUnique<StorageBucket>(m_path, "default"_s, m_localStoragePath); 133 290 134 291 return *m_defaultBucket; … … 140 297 } 141 298 299 LocalStorageManager& OriginStorageManager::localStorageManager(StorageAreaRegistry& registry) 300 { 301 return defaultBucket().localStorageManager(registry); 302 } 303 304 LocalStorageManager* OriginStorageManager::existingLocalStorageManager() 305 { 306 return defaultBucket().existingLocalStorageManager(); 307 } 308 309 SessionStorageManager& OriginStorageManager::sessionStorageManager(StorageAreaRegistry& registry) 310 { 311 return defaultBucket().sessionStorageManager(registry); 312 } 313 314 SessionStorageManager* OriginStorageManager::existingSessionStorageManager() 315 { 316 return defaultBucket().existingSessionStorageManager(); 317 } 318 142 319 bool OriginStorageManager::isActive() 143 320 { … … 145 322 } 146 323 147 void OriginStorageManager::deleteData(OptionSet<WebsiteDataType> types, WallTime modifiedSince) 148 { 149 ASSERT(!RunLoop::isMain()); 150 defaultBucket().deleteData(types, modifiedSince); 324 bool OriginStorageManager::isEmpty() 325 { 326 return defaultBucket().isEmpty(); 151 327 } 152 328 … … 159 335 } 160 336 337 OptionSet<WebsiteDataType> OriginStorageManager::fetchDataTypesInList(OptionSet<WebsiteDataType> types) 338 { 339 ASSERT(!RunLoop::isMain()); 340 341 return defaultBucket().fetchDataTypesInList(types); 342 } 343 344 void OriginStorageManager::deleteData(OptionSet<WebsiteDataType> types, WallTime modifiedSince) 345 { 346 ASSERT(!RunLoop::isMain()); 347 348 defaultBucket().deleteData(types, modifiedSince); 349 } 350 351 void OriginStorageManager::moveData(const String& newPath, const String& localStoragePath) 352 { 353 ASSERT(!RunLoop::isMain()); 354 355 defaultBucket().moveData(newPath, localStoragePath); 356 } 357 161 358 } // namespace WebKit 162 359 -
trunk/Source/WebKit/NetworkProcess/storage/OriginStorageManager.h
r286601 r286936 37 37 class FileSystemStorageHandleRegistry; 38 38 class FileSystemStorageManager; 39 class LocalStorageManager; 40 class SessionStorageManager; 41 class StorageAreaRegistry; 39 42 enum class WebsiteDataType : uint32_t; 40 43 … … 42 45 WTF_MAKE_FAST_ALLOCATED; 43 46 public: 44 explicit OriginStorageManager(String&& path);47 OriginStorageManager(String&& path, String&& localStoragePath); 45 48 ~OriginStorageManager(); 46 49 … … 49 52 void setPersisted(bool value); 50 53 FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&); 54 LocalStorageManager& localStorageManager(StorageAreaRegistry&); 55 LocalStorageManager* existingLocalStorageManager(); 56 SessionStorageManager& sessionStorageManager(StorageAreaRegistry&); 57 SessionStorageManager* existingSessionStorageManager(); 51 58 bool isActive(); 59 bool isEmpty(); 60 OptionSet<WebsiteDataType> fetchDataTypesInList(OptionSet<WebsiteDataType>); 52 61 void deleteData(OptionSet<WebsiteDataType>, WallTime); 62 void moveData(const String& newPath, const String& localStoragePath); 53 63 54 64 private: … … 63 73 String m_path; 64 74 bool m_persisted { false }; 75 String m_localStoragePath; 65 76 }; 66 77 -
trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h
r286935 r286936 26 26 #pragma once 27 27 28 #include "Connection.h" 29 #include <wtf/text/WTFString.h> 30 31 namespace WebCore { 32 struct ClientOrigin; 33 } 28 #include "StorageAreaIdentifier.h" 29 #include "StorageNamespaceIdentifier.h" 34 30 35 31 namespace WebKit { 36 32 37 class FileSystemStorageHandleRegistry; 38 class FileSystemStorageManager; 39 enum class WebsiteDataType : uint32_t; 33 class MemoryStorageArea; 34 class StorageAreaRegistry; 40 35 41 class OriginStorageManager {36 class SessionStorageManager { 42 37 WTF_MAKE_FAST_ALLOCATED; 43 38 public: 44 explicit OriginStorageManager(String&& path); 45 ~OriginStorageManager(); 39 explicit SessionStorageManager(StorageAreaRegistry&); 40 bool isActive() const; 41 bool hasDataInMemory() const; 42 void clearData(); 43 void connectionClosed(IPC::Connection::UniqueID); 46 44 47 void connectionClosed(IPC::Connection::UniqueID); 48 bool persisted() const { return m_persisted; } 49 void setPersisted(bool value); 50 FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&); 51 bool isActive(); 52 void deleteData(OptionSet<WebsiteDataType>, WallTime); 45 StorageAreaIdentifier connectToSessionStorageArea(IPC::Connection::UniqueID, const WebCore::ClientOrigin&, StorageNamespaceIdentifier); 46 void disconnectFromStorageArea(IPC::Connection::UniqueID, StorageAreaIdentifier); 47 void cloneStorageArea(IPC::Connection::UniqueID, StorageNamespaceIdentifier, StorageNamespaceIdentifier); 53 48 54 49 private: 55 enum class StorageBucketMode : bool; 56 class StorageBucket; 57 StorageBucket& defaultBucket(); 50 StorageAreaIdentifier addStorageArea(std::unique_ptr<MemoryStorageArea>, IPC::Connection::UniqueID, StorageNamespaceIdentifier); 58 51 59 void createOriginFileIfNecessary(const WebCore::ClientOrigin&); 60 void deleteOriginFileIfNecessary(); 61 62 std::unique_ptr<StorageBucket> m_defaultBucket; 63 String m_path; 64 bool m_persisted { false }; 52 StorageAreaRegistry& m_registry; 53 HashMap<StorageAreaIdentifier, std::unique_ptr<MemoryStorageArea>> m_storageAreas; 54 HashMap<StorageNamespaceIdentifier, StorageAreaIdentifier> m_storageAreasByNamespace; 65 55 }; 66 56 67 57 } // namespace WebKit 68 -
trunk/Source/WebKit/NetworkProcess/storage/StorageAreaRegistry.cpp
r286935 r286936 24 24 */ 25 25 26 #pragma once 26 #include "config.h" 27 #include "StorageAreaRegistry.h" 27 28 28 #include "Connection.h" 29 #include <wtf/text/WTFString.h> 30 31 namespace WebCore { 32 struct ClientOrigin; 33 } 29 #include "StorageAreaBase.h" 34 30 35 31 namespace WebKit { 36 32 37 class FileSystemStorageHandleRegistry; 38 class FileSystemStorageManager; 39 enum class WebsiteDataType : uint32_t; 33 StorageAreaRegistry::StorageAreaRegistry() = default; 40 34 41 class OriginStorageManager { 42 WTF_MAKE_FAST_ALLOCATED; 43 public: 44 explicit OriginStorageManager(String&& path); 45 ~OriginStorageManager(); 35 void StorageAreaRegistry::registerStorageArea(StorageAreaIdentifier identifier, StorageAreaBase& storageArea) 36 { 37 ASSERT(!m_storageAreas.contains(identifier)); 46 38 47 void connectionClosed(IPC::Connection::UniqueID); 48 bool persisted() const { return m_persisted; } 49 void setPersisted(bool value); 50 FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&); 51 bool isActive(); 52 void deleteData(OptionSet<WebsiteDataType>, WallTime); 39 m_storageAreas.add(identifier, storageArea); 40 } 53 41 54 private: 55 enum class StorageBucketMode : bool; 56 class StorageBucket; 57 StorageBucket& defaultBucket(); 42 void StorageAreaRegistry::unregisterStorageArea(StorageAreaIdentifier identifier) 43 { 44 ASSERT(m_storageAreas.contains(identifier)); 58 45 59 void createOriginFileIfNecessary(const WebCore::ClientOrigin&);60 void deleteOriginFileIfNecessary(); 46 m_storageAreas.remove(identifier); 47 } 61 48 62 std::unique_ptr<StorageBucket> m_defaultBucket; 63 String m_path; 64 bool m_persisted { false };65 } ;49 StorageAreaBase* StorageAreaRegistry::getStorageArea(StorageAreaIdentifier identifier) 50 { 51 return m_storageAreas.get(identifier).get(); 52 } 66 53 67 54 } // namespace WebKit 68 -
trunk/Source/WebKit/NetworkProcess/storage/StorageAreaRegistry.h
r286935 r286936 26 26 #pragma once 27 27 28 #include "Connection.h" 29 #include <wtf/text/WTFString.h> 30 31 namespace WebCore { 32 struct ClientOrigin; 33 } 28 #include "StorageAreaIdentifier.h" 29 #include <wtf/WeakPtr.h> 34 30 35 31 namespace WebKit { 36 32 37 class FileSystemStorageHandleRegistry; 38 class FileSystemStorageManager; 39 enum class WebsiteDataType : uint32_t; 33 class StorageAreaBase; 40 34 41 class OriginStorageManager{35 class StorageAreaRegistry { 42 36 WTF_MAKE_FAST_ALLOCATED; 43 37 public: 44 explicit OriginStorageManager(String&& path); 45 ~OriginStorageManager(); 46 47 void connectionClosed(IPC::Connection::UniqueID); 48 bool persisted() const { return m_persisted; } 49 void setPersisted(bool value); 50 FileSystemStorageManager& fileSystemStorageManager(FileSystemStorageHandleRegistry&); 51 bool isActive(); 52 void deleteData(OptionSet<WebsiteDataType>, WallTime); 38 StorageAreaRegistry(); 39 void registerStorageArea(StorageAreaIdentifier, StorageAreaBase&); 40 void unregisterStorageArea(StorageAreaIdentifier); 41 StorageAreaBase* getStorageArea(StorageAreaIdentifier); 53 42 54 43 private: 55 enum class StorageBucketMode : bool; 56 class StorageBucket; 57 StorageBucket& defaultBucket(); 58 59 void createOriginFileIfNecessary(const WebCore::ClientOrigin&); 60 void deleteOriginFileIfNecessary(); 61 62 std::unique_ptr<StorageBucket> m_defaultBucket; 63 String m_path; 64 bool m_persisted { false }; 44 HashMap<StorageAreaIdentifier, WeakPtr<StorageAreaBase>> m_storageAreas; 65 45 }; 66 46 67 47 } // namespace WebKit 68 -
trunk/Source/WebKit/Scripts/generate-unified-sources.sh
r286535 r286936 15 15 fi 16 16 17 UnifiedSourceCppFileCount=11 117 UnifiedSourceCppFileCount=112 18 18 UnifiedSourceMmFileCount=80 19 19 -
trunk/Source/WebKit/Sources.txt
r286484 r286936 144 144 NetworkProcess/storage/FileSystemStorageHandle.cpp 145 145 NetworkProcess/storage/FileSystemStorageHandleRegistry.cpp 146 NetworkProcess/storage/LocalStorageManager.cpp 147 NetworkProcess/storage/MemoryStorageArea.cpp 146 148 NetworkProcess/storage/NetworkStorageManager.cpp 147 149 NetworkProcess/storage/OriginStorageManager.cpp 150 NetworkProcess/storage/SQLiteStorageArea.cpp 151 NetworkProcess/storage/SessionStorageManager.cpp 152 NetworkProcess/storage/StorageAreaBase.cpp 153 NetworkProcess/storage/StorageAreaRegistry.cpp 148 154 149 155 NetworkProcess/WebStorage/LocalStorageDatabase.cpp -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp
r286788 r286936 1573 1573 } 1574 1574 1575 void NetworkProcessProxy::getLocalStorageDetails(PAL::SessionID sessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)1576 {1577 if (!canSendMessage()) {1578 completionHandler({ });1579 return;1580 }1581 1582 sendWithAsyncReply(Messages::NetworkProcess::GetLocalStorageOriginDetails(sessionID), WTFMove(completionHandler));1583 }1584 1585 1575 void NetworkProcessProxy::preconnectTo(PAL::SessionID sessionID, WebPageProxyIdentifier webPageProxyID, WebCore::PageIdentifier webPageID, const URL& url, const String& userAgent, WebCore::StoredCredentialsPolicy storedCredentialsPolicy, std::optional<NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, LastNavigationWasAppInitiated lastNavigationWasAppInitiated) 1586 1576 { -
trunk/Source/WebKit/UIProcess/WebsiteData/Cocoa/WebsiteDataStoreCocoa.mm
r285746 r286936 645 645 } 646 646 647 } 647 #if PLATFORM(IOS_FAMILY) 648 649 void WebsiteDataStore::excludeDirectoryFromBackup(const String& directory) 650 { 651 NSURL *url = [NSURL URLWithString:(NSString *)directory]; 652 if ([[NSFileManager defaultManager] createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:nullptr]) 653 [[NSURL fileURLWithPath:(NSString *)directory isDirectory:YES] setResourceValue:@YES forKey:NSURLIsExcludedFromBackupKey error:nil]; 654 } 655 656 #endif 657 658 } -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp
r286455 r286936 1904 1904 if (!localStorageDirectory.isEmpty()) { 1905 1905 parameters.localStorageDirectory = localStorageDirectory; 1906 #if PLATFORM(IOS_FAMILY) 1907 excludeDirectoryFromBackup(localStorageDirectory); 1908 #endif 1906 1909 // FIXME: SandboxExtension::createHandleForReadWriteDirectory resolves the directory, but that has already been done. Remove this duplicate work. 1907 1910 if (auto handle = SandboxExtension::createHandleForReadWriteDirectory(localStorageDirectory)) … … 1970 1973 } 1971 1974 1972 void WebsiteDataStore::getLocalStorageDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&& completionHandler)1973 {1974 if (!isPersistent()) {1975 completionHandler({ });1976 return;1977 }1978 1979 networkProcess().getLocalStorageDetails(m_sessionID, [completionHandler = WTFMove(completionHandler)](auto&& details) {1980 completionHandler(WTFMove(details));1981 });1982 }1983 1984 1975 void WebsiteDataStore::resetQuota(CompletionHandler<void()>&& completionHandler) 1985 1976 { -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h
r286455 r286936 168 168 void removeData(OptionSet<WebsiteDataType>, const Vector<WebsiteDataRecord>&, Function<void()>&& completionHandler); 169 169 170 void getLocalStorageDetails(Function<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);171 170 void setCacheModelSynchronouslyForTesting(CacheModel); 172 171 void setServiceWorkerTimeoutForTesting(Seconds); … … 373 372 void countNonDefaultSessionSets(CompletionHandler<void(size_t)>&&); 374 373 374 #if PLATFORM(IOS_FAMILY) 375 void excludeDirectoryFromBackup(const String& directory); 376 #endif 377 375 378 private: 376 379 enum class ForceReinitialization : bool { No, Yes }; -
trunk/Source/WebKit/UnifiedSources-output.xcfilelist
r286535 r286936 18 18 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource110.cpp 19 19 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource111.cpp 20 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource112.cpp 20 21 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource12-mm.mm 21 22 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource12.cpp -
trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r286911 r286936 1515 1515 93E799872756FAB40074008A /* WebFileSystemStorageConnectionMessagesReplies.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799832756FA540074008A /* WebFileSystemStorageConnectionMessagesReplies.h */; }; 1516 1516 93E799882756FAC20074008A /* WebFileSystemStorageConnectionMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799812756FA530074008A /* WebFileSystemStorageConnectionMessages.h */; }; 1517 93E799C7276027460074008A /* StorageAreaRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799C6276027370074008A /* StorageAreaRegistry.h */; }; 1518 93E799CE2760497B0074008A /* SessionStorageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799CA2760497A0074008A /* SessionStorageManager.h */; }; 1519 93E799CF2760497B0074008A /* LocalStorageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799CB2760497A0074008A /* LocalStorageManager.h */; }; 1520 93E799D22760AA5B0074008A /* UnifiedSource112.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93E799D12760AA5A0074008A /* UnifiedSource112.cpp */; }; 1521 93E799DA276121080074008A /* SQLiteStorageArea.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799D4276121070074008A /* SQLiteStorageArea.h */; }; 1522 93E799DB276121080074008A /* MemoryStorageArea.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799D5276121070074008A /* MemoryStorageArea.h */; }; 1523 93E799DC276121080074008A /* StorageAreaBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 93E799D6276121080074008A /* StorageAreaBase.h */; }; 1517 1524 93F549B41E3174B7000E7239 /* WKSnapshotConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = 93F549B31E3174B7000E7239 /* WKSnapshotConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1518 1525 950F2880252414EA00B74F1C /* WKMouseDeviceObserver.h in Headers */ = {isa = PBXBuildFile; fileRef = 950F287E252414E900B74F1C /* WKMouseDeviceObserver.h */; }; … … 5354 5361 93E799822756FA540074008A /* WebFileSystemStorageConnectionMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebFileSystemStorageConnectionMessageReceiver.cpp; sourceTree = "<group>"; }; 5355 5362 93E799832756FA540074008A /* WebFileSystemStorageConnectionMessagesReplies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebFileSystemStorageConnectionMessagesReplies.h; sourceTree = "<group>"; }; 5363 93E799C5276027360074008A /* StorageAreaRegistry.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageAreaRegistry.cpp; sourceTree = "<group>"; }; 5364 93E799C6276027370074008A /* StorageAreaRegistry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageAreaRegistry.h; sourceTree = "<group>"; }; 5365 93E799C92760497A0074008A /* LocalStorageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LocalStorageManager.cpp; sourceTree = "<group>"; }; 5366 93E799CA2760497A0074008A /* SessionStorageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionStorageManager.h; sourceTree = "<group>"; }; 5367 93E799CB2760497A0074008A /* LocalStorageManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalStorageManager.h; sourceTree = "<group>"; }; 5368 93E799CC2760497B0074008A /* SessionStorageManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SessionStorageManager.cpp; sourceTree = "<group>"; }; 5369 93E799D12760AA5A0074008A /* UnifiedSource112.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnifiedSource112.cpp; sourceTree = "<group>"; }; 5370 93E799D3276121070074008A /* SQLiteStorageArea.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SQLiteStorageArea.cpp; sourceTree = "<group>"; }; 5371 93E799D4276121070074008A /* SQLiteStorageArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SQLiteStorageArea.h; sourceTree = "<group>"; }; 5372 93E799D5276121070074008A /* MemoryStorageArea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MemoryStorageArea.h; sourceTree = "<group>"; }; 5373 93E799D6276121080074008A /* StorageAreaBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageAreaBase.h; sourceTree = "<group>"; }; 5374 93E799D7276121080074008A /* StorageAreaBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = StorageAreaBase.cpp; sourceTree = "<group>"; }; 5375 93E799D8276121080074008A /* MemoryStorageArea.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryStorageArea.cpp; sourceTree = "<group>"; }; 5356 5376 93F549B31E3174B7000E7239 /* WKSnapshotConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKSnapshotConfiguration.h; sourceTree = "<group>"; }; 5357 5377 93F549B51E3174DA000E7239 /* WKSnapshotConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKSnapshotConfiguration.mm; sourceTree = "<group>"; }; … … 8235 8255 1CAECB6027465AE300AB78D0 /* UnifiedSource110.cpp */, 8236 8256 1CAECB5E27465AE300AB78D0 /* UnifiedSource111.cpp */, 8257 93E799D12760AA5A0074008A /* UnifiedSource112.cpp */, 8237 8258 ); 8238 8259 name = "unified-sources"; … … 10315 10336 931A075126F06310004474CD /* FileSystemStorageManager.cpp */, 10316 10337 931A075026F06310004474CD /* FileSystemStorageManager.h */, 10338 93E799C92760497A0074008A /* LocalStorageManager.cpp */, 10339 93E799CB2760497A0074008A /* LocalStorageManager.h */, 10340 93E799D8276121080074008A /* MemoryStorageArea.cpp */, 10341 93E799D5276121070074008A /* MemoryStorageArea.h */, 10317 10342 93085DC326E1BBBD000EC6A7 /* NetworkStorageManager.cpp */, 10318 10343 93085DC426E1BBBD000EC6A7 /* NetworkStorageManager.h */, … … 10320 10345 93085DC526E1C6CF000EC6A7 /* OriginStorageManager.cpp */, 10321 10346 93085DC626E1C6CF000EC6A7 /* OriginStorageManager.h */, 10347 93E799CC2760497B0074008A /* SessionStorageManager.cpp */, 10348 93E799CA2760497A0074008A /* SessionStorageManager.h */, 10349 93E799D3276121070074008A /* SQLiteStorageArea.cpp */, 10350 93E799D4276121070074008A /* SQLiteStorageArea.h */, 10351 93E799D7276121080074008A /* StorageAreaBase.cpp */, 10352 93E799D6276121080074008A /* StorageAreaBase.h */, 10353 93E799C5276027360074008A /* StorageAreaRegistry.cpp */, 10354 93E799C6276027370074008A /* StorageAreaRegistry.h */, 10322 10355 ); 10323 10356 path = storage; … … 12974 13007 93B2614E227D14B100B97A76 /* LocalStorageDatabase.h in Headers */, 12975 13008 93B2614F227D14B100B97A76 /* LocalStorageDatabaseTracker.h in Headers */, 13009 93E799CF2760497B0074008A /* LocalStorageManager.h in Headers */, 12976 13010 46BEB6DB22FB9D4800269867 /* LocalStorageNamespace.h in Headers */, 12977 13011 51A7F2F3125BF820008AEB1D /* Logging.h in Headers */, … … 12992 13026 075A9CF326169BAB006DFA3A /* MediaSessionCoordinatorProxyPrivate.h in Headers */, 12993 13027 A15799B72584433200528236 /* MediaTrackReader.h in Headers */, 13028 93E799DB276121080074008A /* MemoryStorageArea.h in Headers */, 12994 13029 51933DEF1965EB31008AC3EA /* MenuUtilities.h in Headers */, 12995 13030 9B47908D25314D8300EC11AB /* MessageArgumentDescriptions.h in Headers */, … … 13040 13075 839902031BE9A02B000F3653 /* NetworkLoad.h in Headers */, 13041 13076 83D454D71BE9D3C4006C93BD /* NetworkLoadClient.h in Headers */, 13042 517B5F97275EC5E5002DC22D /* WebPushMessage.h in Headers */,13043 13077 839149651BEA838500D2D953 /* NetworkLoadParameters.h in Headers */, 13044 13078 E47FC8A025B8331C005495FC /* NetworkLoadScheduler.h in Headers */, … … 13128 13162 517B5F81275E97B6002DC22D /* PushAppBundle.h in Headers */, 13129 13163 517B5F7D275E97B6002DC22D /* PushClientConnection.h in Headers */, 13164 517B5F95275EBA63002DC22D /* PushMessageForTesting.h in Headers */, 13130 13165 A1E688701F6E2BAB007006A6 /* QuarantineSPI.h in Headers */, 13131 13166 1A0C227E2451130A00ED614D /* QuickLookThumbnailingSoftLink.h in Headers */, … … 13212 13247 1AFDE65A1954A42B00C48FFA /* SessionState.h in Headers */, 13213 13248 1A002D49196B345D00B9AD44 /* SessionStateCoding.h in Headers */, 13249 93E799CE2760497B0074008A /* SessionStorageManager.h in Headers */, 13214 13250 46BEB6DF22FBB16B00269867 /* SessionStorageNamespace.h in Headers */, 13215 13251 1A6420E512DCE2FF00CAAE2C /* ShareableBitmap.h in Headers */, … … 13240 13276 93D6B784254CCD0E0058DD3A /* SpeechRecognitionServerMessages.h in Headers */, 13241 13277 93D6B785254CCD430058DD3A /* SpeechRecognitionServerMessagesReplies.h in Headers */, 13278 93E799DA276121080074008A /* SQLiteStorageArea.h in Headers */, 13242 13279 7A3FECA221F7C09700F267CD /* StorageAccessStatus.h in Headers */, 13243 13280 46BEB6D722FB9BD700269867 /* StorageArea.h in Headers */, 13281 93E799DC276121080074008A /* StorageAreaBase.h in Headers */, 13244 13282 1AD3306F16B1D991004F60E7 /* StorageAreaImpl.h in Headers */, 13245 13283 1ACECD2517162DB1001FC9EF /* StorageAreaMap.h in Headers */, 13246 13284 1A334DEE16DE8F88006A8E38 /* StorageAreaMapMessages.h in Headers */, 13285 93E799C7276027460074008A /* StorageAreaRegistry.h in Headers */, 13247 13286 93B2614D227D149E00B97A76 /* StorageManager.h in Headers */, 13248 13287 936B059823039097002FC06B /* StorageManagerSet.h in Headers */, … … 13514 13553 512CD69A2721F0A900F7F8EC /* WebPushDaemonConstants.h in Headers */, 13515 13554 517B5F73275E9609002DC22D /* WebPushDaemonMain.h in Headers */, 13555 517B5F97275EC5E5002DC22D /* WebPushMessage.h in Headers */, 13516 13556 461CCCA6231485AA00B659B9 /* WebRemoteObjectRegistry.h in Headers */, 13517 13557 A5860E71230F67FC00461AAE /* WebResourceInterceptController.h in Headers */, … … 13548 13588 517A53101F47A86200DCDC0A /* WebSWClientConnectionMessages.h in Headers */, 13549 13589 466BC03C1FA266DA002FA9C1 /* WebSWContextManagerConnection.h in Headers */, 13550 517B5F95275EBA63002DC22D /* PushMessageForTesting.h in Headers */,13551 13590 460F48901F996F7100CF4B87 /* WebSWContextManagerConnectionMessages.h in Headers */, 13552 13591 C11A9ECC214035F800CFB20A /* WebSwitchingGPUClient.h in Headers */, … … 15117 15156 files = ( 15118 15157 517B5F9A275F3A86002DC22D /* ArgumentCoders.cpp in Sources */, 15158 517B5F9C275F3C37002DC22D /* DaemonEncoder.cpp in Sources */, 15159 517B5F9B275F3A98002DC22D /* DaemonUtilities.mm in Sources */, 15119 15160 517B5F68275A9A78002DC22D /* WebPushToolConnection.mm in Sources */, 15120 517B5F9B275F3A98002DC22D /* DaemonUtilities.mm in Sources */,15121 517B5F9C275F3C37002DC22D /* DaemonEncoder.cpp in Sources */,15122 15161 517B5F65275A8D7F002DC22D /* WebPushToolMain.mm in Sources */, 15123 15162 ); … … 15215 15254 C1A152D724E5A29A00978C8B /* HandleXPCEndpointMessages.mm in Sources */, 15216 15255 2749F6442146561B008380BF /* InjectedBundleNodeHandle.cpp in Sources */, 15217 517B5F99275EC601002DC22D /* WebPushMessageCocoa.mm in Sources */,15218 15256 2749F6452146561E008380BF /* InjectedBundleRangeHandle.cpp in Sources */, 15219 15257 9BF5EC642541145600984E77 /* JSIPCBinding.cpp in Sources */, … … 15504 15542 1CAECB6827465AE400AB78D0 /* UnifiedSource110.cpp in Sources */, 15505 15543 1CAECB6627465AE400AB78D0 /* UnifiedSource111.cpp in Sources */, 15544 93E799D22760AA5B0074008A /* UnifiedSource112.cpp in Sources */, 15506 15545 E38A1FC023A551BF00D2374F /* UserInterfaceIdiom.mm in Sources */, 15507 15546 CD491B0D1E732E4D00009066 /* UserMediaCaptureManagerMessageReceiver.cpp in Sources */, … … 15575 15614 517B5F7A275E97A4002DC22D /* WebPushDaemon.mm in Sources */, 15576 15615 517B5F79275E97A1002DC22D /* WebPushDaemonMain.mm in Sources */, 15616 517B5F99275EC601002DC22D /* WebPushMessageCocoa.mm in Sources */, 15577 15617 51F060E11654318500F3281B /* WebResourceLoaderMessageReceiver.cpp in Sources */, 15578 15618 51F060E11654318500F3281F /* WebRTCMonitorMessageReceiver.cpp in Sources */, -
trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp
r281398 r286936 29 29 #include "Logging.h" 30 30 #include "NetworkProcessConnection.h" 31 #include "NetworkStorageManagerMessages.h" 31 32 #include "StorageAreaImpl.h" 32 33 #include "StorageAreaMapMessages.h" … … 96 97 97 98 if (m_mapID) 98 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages:: StorageManagerSet::SetItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, value, sourceFrame->document()->url().string()), 0);99 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::SetItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, value, sourceFrame->document()->url().string()), 0); 99 100 else 100 101 RELEASE_LOG_ERROR(Storage, "StorageAreaMap::setItem failed because storage map ID is invalid"); … … 115 116 116 117 if (m_mapID) 117 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages:: StorageManagerSet::RemoveItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, sourceFrame->document()->url().string()), 0);118 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::RemoveItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, sourceFrame->document()->url().string()), 0); 118 119 else 119 120 RELEASE_LOG_ERROR(Storage, "StorageAreaMap::removeItem failed because storage map ID is invalid"); … … 130 131 131 132 if (m_mapID) 132 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages:: StorageManagerSet::Clear(*m_mapID, sourceArea->identifier(), m_currentSeed, sourceFrame->document()->url().string()), 0);133 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::Clear(*m_mapID, sourceArea->identifier(), m_currentSeed, sourceFrame->document()->url().string()), 0); 133 134 else 134 135 RELEASE_LOG_ERROR(Storage, "StorageAreaMap::clear failed because storage map ID is invalid"); … … 161 162 IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope; 162 163 HashMap<String, String> values; 163 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages:: StorageManagerSet::GetValues(*m_mapID), Messages::StorageManagerSet::GetValues::Reply(values), 0);164 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::GetValues(*m_mapID), Messages::StorageManagerSet::GetValues::Reply(values), 0); 164 165 m_map->importItems(WTFMove(values)); 165 166 } else … … 349 350 return; 350 351 352 StorageAreaIdentifier mapID; 351 353 switch (m_type) { 352 354 case StorageType::Local: 353 355 case StorageType::TransientLocal: 354 356 if (SecurityOrigin* topLevelOrigin = m_namespace.topLevelOrigin()) 355 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages:: StorageManagerSet::ConnectToTransientLocalStorageArea(WebProcess::singleton().sessionID(), m_namespace.storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), Messages::StorageManagerSet::ConnectToTransientLocalStorageArea::Reply(m_mapID), 0);357 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToTransientLocalStorageArea(m_namespace.storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToTransientLocalStorageArea::Reply(mapID), 0); 356 358 else 357 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages:: StorageManagerSet::ConnectToLocalStorageArea(WebProcess::singleton().sessionID(), m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::StorageManagerSet::ConnectToLocalStorageArea::Reply(m_mapID), 0);359 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToLocalStorageArea(m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToLocalStorageArea::Reply(mapID), 0); 358 360 break; 359 361 case StorageType::Session: 360 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::StorageManagerSet::ConnectToSessionStorageArea(WebProcess::singleton().sessionID(), m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::StorageManagerSet::ConnectToSessionStorageArea::Reply(m_mapID), 0); 361 } 362 363 if (m_mapID) 362 WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToSessionStorageArea(m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToSessionStorageArea::Reply(mapID), 0); 363 } 364 365 if (mapID.isValid()) { 366 m_mapID = mapID; 364 367 WebProcess::singleton().registerStorageAreaMap(*this); 368 } 365 369 } 366 370 … … 374 378 375 379 if (auto* networkProcessConnection = WebProcess::singleton().existingNetworkProcessConnection()) 376 networkProcessConnection->connection().send(Messages:: StorageManagerSet::DisconnectFromStorageArea(*m_mapID), 0);380 networkProcessConnection->connection().send(Messages::NetworkStorageManager::DisconnectFromStorageArea(*m_mapID), 0); 377 381 378 382 m_mapID = { }; -
trunk/Source/WebKit/WebProcess/WebStorage/StorageNamespaceImpl.cpp
r281398 r286936 28 28 29 29 #include "NetworkProcessConnection.h" 30 #include "NetworkStorageManagerMessages.h" 30 31 #include "StorageAreaImpl.h" 31 32 #include "StorageAreaMap.h" 32 #include "StorageManagerSetMessages.h"33 33 #include "WebPage.h" 34 34 #include "WebPageGroupProxy.h" … … 115 115 116 116 if (auto networkProcessConnection = WebProcess::singleton().existingNetworkProcessConnection()) 117 networkProcessConnection->connection().send(Messages:: StorageManagerSet::CloneSessionStorageNamespace(sessionID(),m_storageNamespaceID, WebPage::fromCorePage(newPage).sessionStorageNamespaceIdentifier()), 0);117 networkProcessConnection->connection().send(Messages::NetworkStorageManager::CloneSessionStorageNamespace(m_storageNamespaceID, WebPage::fromCorePage(newPage).sessionStorageNamespaceIdentifier()), 0); 118 118 119 119 return adoptRef(*new StorageNamespaceImpl(m_storageType, WebPage::fromCorePage(newPage).sessionStorageNamespaceIdentifier(), WebPage::fromCorePage(newPage).identifier(), m_topLevelOrigin.get(), m_quotaInBytes));
Note:
See TracChangeset
for help on using the changeset viewer.