Changeset 265149 in webkit
- Timestamp:
- Jul 31, 2020 10:44:19 AM (4 years ago)
- Location:
- trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r265148 r265149 1 2020-07-31 Sihui Liu <sihui_liu@appe.com> 2 3 -[WKWebsiteDataStore _renameOrigin:] needs to support IndexedDB renames 4 https://bugs.webkit.org/show_bug.cgi?id=214905 5 <rdar://problem/66247978> 6 7 Reviewed by Alex Christensen. 8 9 To do the renaming, we close all existing databases whose top origin is old origin, and move all files in 10 directory of old origin to that of new origin. 11 12 API test: WebKit.WebsiteDataStoreRenameOriginForIndexedDatabase 13 14 * Modules/indexeddb/server/IDBServer.cpp: 15 (WebCore::IDBServer::IDBServer::closeDatabasesForOrigins): 16 (WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins): 17 (WebCore::IDBServer::IDBServer::renameOrigin): 18 * Modules/indexeddb/server/IDBServer.h: 19 1 20 2020-07-31 Chris Fleizach <cfleizach@apple.com> 2 21 -
trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp
r264790 r265149 563 563 } 564 564 565 void IDBServer::close AndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>& origins)565 void IDBServer::closeDatabasesForOrigins(const Vector<SecurityOriginData>& targetOrigins, Function<bool(const SecurityOriginData&, const ClientOrigin&)>&& filter) 566 566 { 567 567 ASSERT(!isMainThread()); … … 570 570 HashSet<UniqueIDBDatabase*> openDatabases; 571 571 for (auto& database : m_uniqueIDBDatabaseMap.values()) { 572 const auto& identifier = database->identifier(); 573 for (auto& origin : origins) { 574 if (identifier.isRelatedToOrigin(origin)) { 575 openDatabases.add(database.get()); 576 break; 577 } 578 } 572 const auto& databaseOrigin = database->identifier().origin(); 573 bool filtered = WTF::anyOf(targetOrigins, [&databaseOrigin, &filter](auto& targetOrigin) { 574 return filter(targetOrigin, databaseOrigin); 575 }); 576 if (filtered) 577 openDatabases.add(database.get()); 579 578 } 580 579 … … 583 582 m_uniqueIDBDatabaseMap.remove(database->identifier()); 584 583 } 584 } 585 586 void IDBServer::closeAndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>& origins) 587 { 588 ASSERT(!isMainThread()); 589 ASSERT(m_lock.isHeld()); 590 591 closeDatabasesForOrigins(origins, [](const SecurityOriginData& origin, const ClientOrigin& databaseOrigin) -> bool { 592 return databaseOrigin.isRelated(origin); 593 }); 585 594 586 595 if (!m_databaseDirectoryPath.isEmpty()) { … … 695 704 } 696 705 706 void IDBServer::renameOrigin(const WebCore::SecurityOriginData& oldOrigin, const WebCore::SecurityOriginData& newOrigin) 707 { 708 Vector<SecurityOriginData> targetOrigins = { oldOrigin }; 709 closeDatabasesForOrigins(targetOrigins, [](const SecurityOriginData& targetOrigin, const ClientOrigin& databaseOrigin) -> bool { 710 return databaseOrigin.topOrigin == targetOrigin; 711 }); 712 713 auto versionPath = FileSystem::pathByAppendingComponent(databaseDirectoryPathIsolatedCopy(), "v1"); 714 auto oldOriginPath = FileSystem::pathByAppendingComponent(versionPath, oldOrigin.databaseIdentifier()); 715 auto newOriginPath = FileSystem::pathByAppendingComponent(versionPath, newOrigin.databaseIdentifier()); 716 if (FileSystem::fileExists(oldOriginPath)) 717 FileSystem::moveFile(oldOriginPath, newOriginPath); 718 } 719 697 720 StorageQuotaManager::Decision IDBServer::requestSpace(const ClientOrigin& origin, uint64_t taskSize) 698 721 { -
trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h
r263157 r265149 104 104 WEBCORE_EXPORT void closeAndDeleteDatabasesModifiedSince(WallTime); 105 105 WEBCORE_EXPORT void closeAndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>&); 106 void closeDatabasesForOrigins(const Vector<SecurityOriginData>&, Function<bool(const SecurityOriginData&, const ClientOrigin&)>&&); 107 WEBCORE_EXPORT void renameOrigin(const WebCore::SecurityOriginData&, const WebCore::SecurityOriginData&); 106 108 107 109 StorageQuotaManager::Decision requestSpace(const ClientOrigin&, uint64_t taskSize); -
trunk/Source/WebKit/ChangeLog
r265144 r265149 1 2020-07-31 Sihui Liu <sihui_liu@appe.com> 2 3 -[WKWebsiteDataStore _renameOrigin:] needs to support IndexedDB renames 4 https://bugs.webkit.org/show_bug.cgi?id=214905 5 <rdar://problem/66247978> 6 7 Reviewed by Alex Christensen. 8 9 * NetworkProcess/IndexedDB/WebIDBServer.cpp: 10 (WebKit::WebIDBServer::renameOrigin): 11 * NetworkProcess/IndexedDB/WebIDBServer.h: 12 * NetworkProcess/NetworkProcess.cpp: 13 (WebKit::NetworkProcess::renameOriginInWebsiteData): 14 * UIProcess/API/Cocoa/WKWebsiteDataStore.mm: 15 (-[WKWebsiteDataStore _renameOrigin:to:forDataOfTypes:completionHandler:]): 16 1 17 2020-07-31 Ryan Haddad <ryanhaddad@apple.com> 2 18 -
trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp
r263157 r265149 90 90 } 91 91 92 void WebIDBServer::renameOrigin(const WebCore::SecurityOriginData& oldOrigin, const WebCore::SecurityOriginData& newOrigin, CompletionHandler<void()>&& callback) 93 { 94 ASSERT(RunLoop::isMain()); 95 96 postTask([this, protectedThis = makeRef(*this), oldOrigin = oldOrigin.isolatedCopy(), newOrigin = newOrigin.isolatedCopy(), callback = WTFMove(callback)] () mutable { 97 ASSERT(!RunLoop::isMain()); 98 99 LockHolder locker(m_server->lock()); 100 m_server->renameOrigin(oldOrigin, newOrigin); 101 postTaskReply(CrossThreadTask(WTFMove(callback))); 102 }); 103 } 104 92 105 void WebIDBServer::suspend(ShouldForceStop shouldForceStop) 93 106 { -
trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h
r264119 r265149 50 50 void closeAndDeleteDatabasesModifiedSince(WallTime, CompletionHandler<void()>&& callback); 51 51 void closeAndDeleteDatabasesForOrigins(const Vector<WebCore::SecurityOriginData>&, CompletionHandler<void()>&& callback); 52 void renameOrigin(const WebCore::SecurityOriginData&, const WebCore::SecurityOriginData&, CompletionHandler<void()>&&); 52 53 53 54 enum class ShouldForceStop : bool { No, Yes }; -
trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp
r265087 r265149 2552 2552 { 2553 2553 auto aggregator = CallbackAggregator::create(WTFMove(completionHandler)); 2554 auto oldOrigin = WebCore::SecurityOriginData::fromURL(oldName); 2555 auto newOrigin = WebCore::SecurityOriginData::fromURL(newName); 2556 2557 if (oldOrigin.isEmpty() || newOrigin.isEmpty()) 2558 return; 2554 2559 2555 2560 if (dataTypes.contains(WebsiteDataType::LocalStorage)) { … … 2557 2562 m_storageManagerSet->renameOrigin(sessionID, oldName, newName, [aggregator] { }); 2558 2563 } 2564 2565 #if ENABLE(INDEXED_DATABASE) 2566 if (dataTypes.contains(WebsiteDataType::IndexedDBDatabases)) { 2567 auto path = m_idbDatabasePaths.get(sessionID); 2568 if (!path.isEmpty()) 2569 webIDBServer(sessionID).renameOrigin(oldOrigin, newOrigin, [aggregator] { }); 2570 } 2571 #endif 2559 2572 } 2560 2573 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm
r263874 r265149 609 609 return completionHandler(); 610 610 611 if (dataTypes.count > 1 || ![dataTypes containsObject:WKWebsiteDataTypeLocalStorage]) 612 [NSException raise:NSInvalidArgumentException format:@"_renameOrigin can only be called with WKWebsiteDataTypeLocalStorage right now."]; 611 NSSet *supportedTypes = [NSSet setWithObjects:WKWebsiteDataTypeLocalStorage, WKWebsiteDataTypeIndexedDBDatabases, nil]; 612 if (![dataTypes isSubsetOfSet:supportedTypes]) 613 [NSException raise:NSInvalidArgumentException format:@"_renameOrigin can only be called with WKWebsiteDataTypeLocalStorage and WKWebsiteDataTypeIndexedDBDatabases right now."]; 614 613 615 _websiteDataStore->renameOriginInWebsiteData(oldName, newName, WebKit::toWebsiteDataTypes(dataTypes), [completionHandler = makeBlockPtr(completionHandler)] { 614 616 completionHandler(); -
trunk/Tools/ChangeLog
r265143 r265149 1 2020-07-31 Sihui Liu <sihui_liu@appe.com> 2 3 -[WKWebsiteDataStore _renameOrigin:] needs to support IndexedDB renames 4 https://bugs.webkit.org/show_bug.cgi?id=214905 5 <rdar://problem/66247978> 6 7 Reviewed by Alex Christensen. 8 9 * TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm: 10 (TEST): 11 1 12 2020-07-31 Jonathan Bedard <jbedard@apple.com> 2 13 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm
r264724 r265149 549 549 } 550 550 551 TEST(WebKit, WebsiteDataStoreRenameOriginForIndexedDatabase) 552 { 553 // Reset defaultDataStore before test. 554 __block bool done = false; 555 [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() { 556 done = true; 557 }]; 558 TestWebKitAPI::Util::run(&done); 559 done = false; 560 561 auto handler = adoptNS([[WebsiteDataStoreCustomPathsMessageHandler alloc] init]); 562 RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]); 563 [[configuration userContentController] addScriptMessageHandler:handler.get() name:@"testHandler"]; 564 auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]); 565 566 NSString *testString = @"<script> \ 567 var request = window.indexedDB.open('testDB'); \ 568 var db; \ 569 request.onupgradeneeded = function(event) { \ 570 db = event.target.result; \ 571 window.webkit.messageHandlers.testHandler.postMessage('database is created'); \ 572 db.onclose = function(event) { \ 573 window.webkit.messageHandlers.testHandler.postMessage('database is closed'); \ 574 } \ 575 }; \ 576 request.onsuccess = function(event) { \ 577 if (!db) { \ 578 db = event.target.result; \ 579 window.webkit.messageHandlers.testHandler.postMessage('database exists'); \ 580 } \ 581 }; \ 582 request.onerror = function(event) { \ 583 if (!db) { \ 584 window.webkit.messageHandlers.testHandler.postMessage('database error: ' + event.target.error.name + ' - ' + event.target.error.message); \ 585 } \ 586 }; \ 587 </script>"; 588 589 NSURL *exampleURL = [NSURL URLWithString:@"http://example.com/"]; 590 NSURL *webKitURL = [NSURL URLWithString:@"https://webkit.org/"]; 591 592 [webView loadHTMLString:testString baseURL:exampleURL]; 593 EXPECT_WK_STREQ("database is created", getNextMessage().body); 594 595 auto dataStore = webView.get().configuration.websiteDataStore; 596 auto indexedDBType = adoptNS([[NSSet alloc] initWithObjects:WKWebsiteDataTypeIndexedDBDatabases, nil]); 597 [dataStore _renameOrigin:exampleURL to:webKitURL forDataOfTypes:indexedDBType.get() completionHandler:^{ 598 done = true; 599 }]; 600 TestWebKitAPI::Util::run(&done); 601 done = false; 602 EXPECT_WK_STREQ("database is closed", getNextMessage().body); 603 604 [webView loadHTMLString:testString baseURL:webKitURL]; 605 EXPECT_WK_STREQ("database exists", getNextMessage().body); 606 607 [webView loadHTMLString:testString baseURL:exampleURL]; 608 EXPECT_WK_STREQ("database is created", getNextMessage().body); 609 610 // Clean up defaultDataStore after test. 611 [[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() { 612 done = true; 613 }]; 614 TestWebKitAPI::Util::run(&done); 615 } 616 551 617 TEST(WebKit, WebsiteDataStoreRenameOrigin) 552 618 {
Note: See TracChangeset
for help on using the changeset viewer.