Changeset 261038 in webkit
- Timestamp:
- May 1, 2020 4:38:22 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r261034 r261038 1 2020-05-01 Alex Christensen <achristensen@webkit.org> 2 3 Add SPI to move localStorage to a different domain 4 https://bugs.webkit.org/show_bug.cgi?id=209260 5 <rdar://problem/60285683> 6 7 Reviewed by Brady Eidson. 8 9 Covered by an API test. 10 11 * NetworkProcess/NetworkProcess.cpp: 12 (WebKit::NetworkProcess::renameDomainInWebsiteData): 13 (WebKit::NetworkProcess::getLocalStorageOriginDetails): 14 * NetworkProcess/NetworkProcess.h: 15 * NetworkProcess/NetworkProcess.messages.in: 16 * NetworkProcess/WebStorage/LocalStorageNamespace.cpp: 17 (WebKit::LocalStorageNamespace::renameDomain): 18 * NetworkProcess/WebStorage/LocalStorageNamespace.h: 19 * NetworkProcess/WebStorage/StorageArea.cpp: 20 (WebKit::StorageArea::close): 21 * NetworkProcess/WebStorage/StorageArea.h: 22 * NetworkProcess/WebStorage/StorageManager.cpp: 23 (WebKit::StorageManager::renameDomain): 24 * NetworkProcess/WebStorage/StorageManager.h: 25 * NetworkProcess/WebStorage/StorageManagerSet.cpp: 26 (WebKit::StorageManagerSet::renameDomain): 27 * NetworkProcess/WebStorage/StorageManagerSet.h: 28 * UIProcess/API/Cocoa/WKWebsiteDataStore.mm: 29 (-[WKWebsiteDataStore _renameDomain:to:forDataOfTypes:completionHandler:]): 30 * UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h: 31 * UIProcess/Network/NetworkProcessProxy.cpp: 32 (WebKit::NetworkProcessProxy::renameDomainInWebsiteData): 33 * UIProcess/Network/NetworkProcessProxy.h: 34 * UIProcess/WebsiteData/WebsiteDataStore.cpp: 35 (WebKit::WebsiteDataStore::renameDomainInWebsiteData): 36 * UIProcess/WebsiteData/WebsiteDataStore.h: 37 1 38 2020-05-01 Chris Dumez <cdumez@apple.com> 2 39 -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r260928 r261038 2461 2461 } 2462 2462 2463 void NetworkProcess::renameOriginInWebsiteData(PAL::SessionID sessionID, const URL& oldName, const URL& newName, OptionSet<WebsiteDataType> dataTypes, CompletionHandler<void()>&& completionHandler) 2464 { 2465 auto aggregator = CallbackAggregator::create(WTFMove(completionHandler)); 2466 2467 if (dataTypes.contains(WebsiteDataType::LocalStorage)) { 2468 if (m_storageManagerSet->contains(sessionID)) 2469 m_storageManagerSet->renameOrigin(sessionID, oldName, newName, [aggregator = aggregator.copyRef()] { }); 2470 } 2471 } 2472 2463 2473 #if ENABLE(SERVICE_WORKER) 2464 2474 void NetworkProcess::forEachSWServer(const Function<void(SWServer&)>& callback) … … 2648 2658 if (!m_storageManagerSet->contains(sessionID)) { 2649 2659 LOG_ERROR("Cannot get local storage information for an unknown session"); 2660 completionHandler({ }); 2650 2661 return; 2651 2662 } 2652 2663 2653 m_storageManagerSet->getLocalStorageOriginDetails(sessionID, [completionHandler = WTFMove(completionHandler)](auto&& details) mutable { 2654 completionHandler(WTFMove(details)); 2655 }); 2664 m_storageManagerSet->getLocalStorageOriginDetails(sessionID, WTFMove(completionHandler)); 2656 2665 } 2657 2666 -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.h
r260900 r261038 293 293 294 294 void resetQuota(PAL::SessionID, CompletionHandler<void()>&&); 295 void renameOriginInWebsiteData(PAL::SessionID, const URL&, const URL&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&); 295 296 296 297 #if ENABLE(SERVICE_WORKER) -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in
r260900 r261038 47 47 DeleteWebsiteData(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, WallTime modifiedSince, WebKit::CallbackID callbackID) 48 48 DeleteWebsiteDataForOrigins(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, Vector<WebCore::SecurityOriginData> origins, Vector<String> cookieHostNames, Vector<String> HSTSCacheHostNames, Vector<WebCore::RegistrableDomain> registrableDomains, WebKit::CallbackID callbackID) 49 RenameOriginInWebsiteData(PAL::SessionID sessionID, URL oldDomain, URL newDomain, OptionSet<WebKit::WebsiteDataType> websiteDataTypes) -> () Async 49 50 50 51 DownloadRequest(PAL::SessionID sessionID, WebKit::DownloadID downloadID, WebCore::ResourceRequest request, enum:bool Optional<WebKit::NavigatingToAppBoundDomain> isNavigatingToAppBoundDomain, String suggestedFilename) -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.cpp
r258914 r261038 71 71 } 72 72 73 void LocalStorageNamespace::flushAndClose(const SecurityOriginData& origin) 74 { 75 ASSERT(!RunLoop::isMain()); 76 if (auto* storageArea = m_storageAreaMap.get(origin)) { 77 storageArea->syncToDatabase(); 78 storageArea->close(); 79 } 80 } 81 73 82 Vector<SecurityOriginData> LocalStorageNamespace::ephemeralOrigins() const 74 83 { -
trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h
r258914 r261038 53 53 void clearStorageAreasMatchingOrigin(const WebCore::SecurityOriginData&); 54 54 void clearAllStorageAreas(); 55 void flushAndClose(const WebCore::SecurityOriginData&); 55 56 56 57 Vector<WebCore::SecurityOriginData> ephemeralOrigins() const; -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp
r258914 r261038 211 211 } 212 212 213 void StorageArea::close() 214 { 215 if (!m_localStorageDatabase) 216 return; 217 218 m_localStorageDatabase->close(); 219 } 220 213 221 } // namespace WebKit -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.h
r258914 r261038 72 72 73 73 void syncToDatabase(); 74 void close(); 74 75 75 76 private: -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp
r258914 r261038 41 41 #include <memory> 42 42 #include <wtf/CrossThreadCopier.h> 43 #include <wtf/FileSystem.h> 43 44 #include <wtf/WorkQueue.h> 44 45 … … 156 157 } 157 158 159 void StorageManager::renameOrigin(const URL& oldURL, const URL& newURL) 160 { 161 ASSERT(!RunLoop::isMain()); 162 auto oldOrigin = WebCore::SecurityOriginData::fromURL(oldURL); 163 auto newOrigin = WebCore::SecurityOriginData::fromURL(newURL); 164 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 165 localStorageNamespace->flushAndClose(oldOrigin); 166 167 if (auto* tracker = m_localStorageDatabaseTracker.get()) { 168 static const std::array<const char *, 3> suffixes { "", "-shm", "-wal" }; 169 for (const auto* suffix : suffixes) 170 FileSystem::moveFile(makeString(tracker->databasePath(oldOrigin), suffix), makeString(tracker->databasePath(newOrigin), suffix)); 171 } 172 173 for (auto& localStorageNamespace : m_localStorageNamespaces.values()) 174 localStorageNamespace->clearStorageAreasMatchingOrigin(oldOrigin); 175 } 176 158 177 void StorageManager::deleteLocalStorageOriginsModifiedSince(WallTime time) 159 178 { -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h
r258914 r261038 70 70 void deleteLocalStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>&); 71 71 Vector<LocalStorageDatabaseTracker::OriginDetails> getLocalStorageOriginDetailsCrossThreadCopy() const; 72 void renameOrigin(const URL&, const URL&); 72 73 73 74 void clearStorageNamespaces(); -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.cpp
r258914 r261038 294 294 } 295 295 296 void StorageManagerSet::renameOrigin(PAL::SessionID sessionID, const URL& oldName, const URL& newName, CompletionHandler<void()>&& completionHandler) 297 { 298 ASSERT(RunLoop::isMain()); 299 300 m_queue->dispatch([this, protectedThis = makeRef(*this), sessionID, oldName = oldName.isolatedCopy(), newName = newName.isolatedCopy(), completionHandler = WTFMove(completionHandler)]() mutable { 301 auto* storageManager = m_storageManagers.get(sessionID); 302 ASSERT(storageManager); 303 storageManager->renameOrigin(oldName, newName); 304 RunLoop::main().dispatch(WTFMove(completionHandler)); 305 }); 306 } 307 296 308 void StorageManagerSet::connectToLocalStorageArea(IPC::Connection& connection, PAL::SessionID sessionID, StorageNamespaceIdentifier storageNamespaceID, SecurityOriginData&& originData, ConnectToStorageAreaCallback&& completionHandler) 297 309 { -
trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.h
r258914 r261038 70 70 void deleteLocalStorageForOrigins(PAL::SessionID, const Vector<WebCore::SecurityOriginData>&, DeleteCallback&&); 71 71 void getLocalStorageOriginDetails(PAL::SessionID, GetOriginDetailsCallback&&); 72 void renameOrigin(PAL::SessionID, const URL&, const URL&, CompletionHandler<void()>&&); 72 73 73 74 void didReceiveMessage(IPC::Connection&, IPC::Decoder&); -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm
r260900 r261038 589 589 } 590 590 591 - (void)_renameOrigin:(NSURL *)oldName to:(NSURL *)newName forDataOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(void))completionHandler 592 { 593 if (!dataTypes.count) 594 return completionHandler(); 595 596 if (dataTypes.count > 1 || ![dataTypes containsObject:WKWebsiteDataTypeLocalStorage]) 597 [NSException raise:NSInvalidArgumentException format:@"_renameOrigin can only be called with WKWebsiteDataTypeLocalStorage right now."]; 598 _websiteDataStore->renameOriginInWebsiteData(oldName, newName, WebKit::toWebsiteDataTypes(dataTypes), [completionHandler = makeBlockPtr(completionHandler)] { 599 completionHandler(); 600 }); 601 } 602 591 603 - (id <_WKWebsiteDataStoreDelegate>)_delegate 592 604 { -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h
r260900 r261038 81 81 - (void)_appBoundDomains:(void (^)(NSArray<NSString *> *))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA)); 82 82 83 - (void)_renameOrigin:(NSURL *)oldName to:(NSURL *)newName forDataOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(void))completionHandler; 84 83 85 @property (nullable, nonatomic, weak) id <_WKWebsiteDataStoreDelegate> _delegate WK_API_AVAILABLE(macos(10.15), ios(13.0)); 84 86 @property (nonatomic, readonly, copy) _WKWebsiteDataStoreConfiguration *_configuration; -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp
r260900 r261038 218 218 } 219 219 220 void NetworkProcessProxy::renameOriginInWebsiteData(PAL::SessionID sessionID, const URL& oldName, const URL& newName, OptionSet<WebsiteDataType> dataTypes, CompletionHandler<void()>&& completionHandler) 221 { 222 sendWithAsyncReply(Messages::NetworkProcess::RenameOriginInWebsiteData(sessionID, oldName, newName, dataTypes), WTFMove(completionHandler)); 223 } 224 220 225 void NetworkProcessProxy::networkProcessCrashed() 221 226 { -
trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h
r260928 r261038 109 109 void deleteWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, WallTime modifiedSince, CompletionHandler<void()>&& completionHandler); 110 110 void deleteWebsiteDataForOrigins(PAL::SessionID, OptionSet<WebKit::WebsiteDataType>, const Vector<WebCore::SecurityOriginData>& origins, const Vector<String>& cookieHostNames, const Vector<String>& HSTSCacheHostNames, const Vector<RegistrableDomain>&, CompletionHandler<void()>&&); 111 void renameOriginInWebsiteData(PAL::SessionID, const URL&, const URL&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&); 111 112 112 113 void getLocalStorageDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&); -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp
r260900 r261038 2408 2408 } 2409 2409 2410 } 2410 void WebsiteDataStore::renameOriginInWebsiteData(URL&& oldName, URL&& newName, OptionSet<WebsiteDataType> dataTypes, CompletionHandler<void()>&& completionHandler) 2411 { 2412 auto callbackAggregator = CallbackAggregator::create(WTFMove(completionHandler)); 2413 for (auto& processPool : WebProcessPool::allProcessPools()) { 2414 if (auto* networkProcess = processPool->networkProcess()) { 2415 networkProcess->addSession(*this); 2416 networkProcess->renameOriginInWebsiteData(m_sessionID, oldName, newName, dataTypes, [callbackAggregator = callbackAggregator.copyRef()] { }); 2417 } 2418 } 2419 } 2420 2421 } -
trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h
r260900 r261038 259 259 API::HTTPCookieStore& cookieStore(); 260 260 261 void renameOriginInWebsiteData(URL&&, URL&&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&); 262 261 263 #if ENABLE(DEVICE_ORIENTATION) 262 264 WebDeviceOrientationAndMotionAccessController& deviceOrientationAndMotionAccessController() { return m_deviceOrientationAndMotionAccessController; } -
trunk/Tools/ChangeLog
r261037 r261038 1 2020-05-01 Alex Christensen <achristensen@webkit.org> 2 3 Add SPI to move localStorage to a different domain 4 https://bugs.webkit.org/show_bug.cgi?id=209260 5 <rdar://problem/60285683> 6 7 Reviewed by Brady Eidson. 8 9 * TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm: 10 (TEST): 11 1 12 2020-05-01 Wenson Hsieh <wenson_hsieh@apple.com> 2 13 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm
r259843 r261038 518 518 } 519 519 520 TEST(WebKit, WebsiteDataStoreRenameOrigin) 521 { 522 TestWKWebView *webView = [[[TestWKWebView alloc] init] autorelease]; 523 [webView synchronouslyLoadHTMLString:@"<script>localStorage.setItem('testkey', 'testvalue')</script>" baseURL:[NSURL URLWithString:@"https://example.com/"]]; 524 525 __block bool done = false; 526 NSURL *exampleURL = [NSURL URLWithString:@"https://example.com/"]; 527 NSURL *webKitURL = [NSURL URLWithString:@"https://webkit.org/"]; 528 WKWebsiteDataStore *dataStore = webView.configuration.websiteDataStore; 529 NSSet *localStorageSet = [NSSet setWithObject:WKWebsiteDataTypeLocalStorage]; 530 [dataStore _renameOrigin:exampleURL to:webKitURL forDataOfTypes:localStorageSet completionHandler:^{ 531 done = true; 532 }]; 533 TestWebKitAPI::Util::run(&done); 534 535 [webView synchronouslyLoadHTMLString:@"hello" baseURL:webKitURL]; 536 EXPECT_WK_STREQ([webView objectByEvaluatingJavaScript:@"localStorage.getItem('testkey')"], "testvalue"); 537 [webView synchronouslyLoadHTMLString:@"hello" baseURL:exampleURL]; 538 EXPECT_TRUE([[webView objectByEvaluatingJavaScript:@"localStorage.getItem('testkey')"] isKindOfClass:[NSNull class]]); 539 540 done = false; 541 [dataStore fetchDataRecordsOfTypes:localStorageSet completionHandler:^(NSArray<WKWebsiteDataRecord *> *records) { 542 [dataStore removeDataOfTypes:localStorageSet forDataRecords:records completionHandler:^{ 543 done = true; 544 }]; 545 }]; 546 TestWebKitAPI::Util::run(&done); 547 } 548 520 549 TEST(WebKit, NetworkCacheDirectory) 521 550 {
Note: See TracChangeset
for help on using the changeset viewer.