Title: [258862] trunk
Revision
258862
Author
achristen...@apple.com
Date
2020-03-23 11:40:03 -0700 (Mon, 23 Mar 2020)

Log Message

Add SPI to move localStorage to a different domain
https://bugs.webkit.org/show_bug.cgi?id=209260
<rdar://problem/60285683>

Reviewed by Brady Eidson.

Source/WebKit:

Covered by an API test.

* NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::renameDomainInWebsiteData):
(WebKit::NetworkProcess::getLocalStorageOriginDetails):
* NetworkProcess/NetworkProcess.h:
* NetworkProcess/NetworkProcess.messages.in:
* NetworkProcess/WebStorage/LocalStorageNamespace.cpp:
(WebKit::LocalStorageNamespace::renameDomain):
* NetworkProcess/WebStorage/LocalStorageNamespace.h:
* NetworkProcess/WebStorage/StorageArea.cpp:
(WebKit::StorageArea::close):
* NetworkProcess/WebStorage/StorageArea.h:
* NetworkProcess/WebStorage/StorageManager.cpp:
(WebKit::StorageManager::renameDomain):
* NetworkProcess/WebStorage/StorageManager.h:
* NetworkProcess/WebStorage/StorageManagerSet.cpp:
(WebKit::StorageManagerSet::renameDomain):
* NetworkProcess/WebStorage/StorageManagerSet.h:
* UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
(-[WKWebsiteDataStore _renameDomain:to:forDataOfTypes:completionHandler:]):
* UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::renameDomainInWebsiteData):
* UIProcess/Network/NetworkProcessProxy.h:
* UIProcess/WebsiteData/WebsiteDataStore.cpp:
(WebKit::WebsiteDataStore::renameDomainInWebsiteData):
* UIProcess/WebsiteData/WebsiteDataStore.h:

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:
(TEST):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (258861 => 258862)


--- trunk/Source/WebKit/ChangeLog	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/ChangeLog	2020-03-23 18:40:03 UTC (rev 258862)
@@ -1,3 +1,40 @@
+2020-03-23  Alex Christensen  <achristen...@webkit.org>
+
+        Add SPI to move localStorage to a different domain
+        https://bugs.webkit.org/show_bug.cgi?id=209260
+        <rdar://problem/60285683>
+
+        Reviewed by Brady Eidson.
+
+        Covered by an API test.
+
+        * NetworkProcess/NetworkProcess.cpp:
+        (WebKit::NetworkProcess::renameDomainInWebsiteData):
+        (WebKit::NetworkProcess::getLocalStorageOriginDetails):
+        * NetworkProcess/NetworkProcess.h:
+        * NetworkProcess/NetworkProcess.messages.in:
+        * NetworkProcess/WebStorage/LocalStorageNamespace.cpp:
+        (WebKit::LocalStorageNamespace::renameDomain):
+        * NetworkProcess/WebStorage/LocalStorageNamespace.h:
+        * NetworkProcess/WebStorage/StorageArea.cpp:
+        (WebKit::StorageArea::close):
+        * NetworkProcess/WebStorage/StorageArea.h:
+        * NetworkProcess/WebStorage/StorageManager.cpp:
+        (WebKit::StorageManager::renameDomain):
+        * NetworkProcess/WebStorage/StorageManager.h:
+        * NetworkProcess/WebStorage/StorageManagerSet.cpp:
+        (WebKit::StorageManagerSet::renameDomain):
+        * NetworkProcess/WebStorage/StorageManagerSet.h:
+        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
+        (-[WKWebsiteDataStore _renameDomain:to:forDataOfTypes:completionHandler:]):
+        * UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h:
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::renameDomainInWebsiteData):
+        * UIProcess/Network/NetworkProcessProxy.h:
+        * UIProcess/WebsiteData/WebsiteDataStore.cpp:
+        (WebKit::WebsiteDataStore::renameDomainInWebsiteData):
+        * UIProcess/WebsiteData/WebsiteDataStore.h:
+
 2020-03-23  Per Arne Vollan  <pvol...@apple.com>
 
         [iOS] Deny mach lookup access to icon services

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-03-23 18:40:03 UTC (rev 258862)
@@ -2437,6 +2437,16 @@
     completionHandler();
 }
 
+void NetworkProcess::renameDomainInWebsiteData(PAL::SessionID sessionID, const String& oldName, const String& newName, OptionSet<WebsiteDataType> dataTypes, CompletionHandler<void()>&& completionHandler)
+{
+    auto aggregator = CallbackAggregator::create(WTFMove(completionHandler));
+
+    if (dataTypes.contains(WebsiteDataType::LocalStorage)) {
+        if (m_storageManagerSet->contains(sessionID))
+            m_storageManagerSet->renameDomain(sessionID, oldName, newName, [aggregator = aggregator.copyRef()] { });
+    }
+}
+
 #if ENABLE(SERVICE_WORKER)
 void NetworkProcess::forEachSWServer(const Function<void(SWServer&)>& callback)
 {
@@ -2623,12 +2633,11 @@
 {
     if (!m_storageManagerSet->contains(sessionID)) {
         LOG_ERROR("Cannot get local storage information for an unknown session");
+        completionHandler({ });
         return;
     }
 
-    m_storageManagerSet->getLocalStorageOriginDetails(sessionID, [completionHandler = WTFMove(completionHandler)](auto&& details) mutable {
-        completionHandler(WTFMove(details));
-    });
+    m_storageManagerSet->getLocalStorageOriginDetails(sessionID, WTFMove(completionHandler));
 }
 
 void NetworkProcess::connectionToWebProcessClosed(IPC::Connection& connection, PAL::SessionID sessionID)

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.h (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-03-23 18:40:03 UTC (rev 258862)
@@ -290,6 +290,7 @@
     void clearLegacyPrivateBrowsingLocalStorage();
 
     void resetQuota(PAL::SessionID, CompletionHandler<void()>&&);
+    void renameDomainInWebsiteData(PAL::SessionID, const String&, const String&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&);
 
 #if ENABLE(SERVICE_WORKER)
     WebCore::SWServer* swServerForSessionIfExists(PAL::SessionID sessionID) { return m_swServers.get(sessionID); }
@@ -527,7 +528,7 @@
     HashMap<PAL::SessionID, std::unique_ptr<WebCore::NetworkStorageSession>> m_networkStorageSessions;
     mutable std::unique_ptr<WebCore::NetworkStorageSession> m_defaultNetworkStorageSession;
 
-    RefPtr<StorageManagerSet> m_storageManagerSet;
+    Ref<StorageManagerSet> m_storageManagerSet;
 
 #if PLATFORM(COCOA)
     void platformInitializeNetworkProcessCocoa(const NetworkProcessCreationParameters&);

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2020-03-23 18:40:03 UTC (rev 258862)
@@ -46,6 +46,7 @@
     FetchWebsiteData(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, OptionSet<WebKit::WebsiteDataFetchOption> fetchOptions, uint64_t callbackID)
     DeleteWebsiteData(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, WallTime modifiedSince, uint64_t callbackID)
     DeleteWebsiteDataForOrigins(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, Vector<WebCore::SecurityOriginData> origins, Vector<String> cookieHostNames, Vector<String> HSTSCacheHostNames, uint64_t callbackID)
+    RenameDomainInWebsiteData(PAL::SessionID sessionID, String oldName, String newName, OptionSet<WebKit::WebsiteDataType> websiteDataTypes) -> () Async
 
     DownloadRequest(PAL::SessionID sessionID, WebKit::DownloadID downloadID, WebCore::ResourceRequest request, enum:bool WebKit::NavigatingToAppBoundDomain isNavigatingToAppBoundDomain, String suggestedFilename)
     ResumeDownload(PAL::SessionID sessionID, WebKit::DownloadID downloadID, IPC::DataReference resumeData, String path, WebKit::SandboxExtension::Handle sandboxExtensionHandle)

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.cpp (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.cpp	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.cpp	2020-03-23 18:40:03 UTC (rev 258862)
@@ -70,6 +70,34 @@
         storageArea->clear();
 }
 
+void LocalStorageNamespace::renameDomain(const String& oldName, const String& newName, LocalStorageDatabaseTracker* tracker)
+{
+    ASSERT(!RunLoop::isMain());
+
+    struct MoveRecord {
+        SecurityOriginData fromOrigin;
+        SecurityOriginData toOrigin;
+    };
+
+    Vector<MoveRecord> moveRecords;
+    for (const auto& pair : m_storageAreaMap) {
+        const auto& fromOrigin = pair.key;
+        if (fromOrigin.host == oldName) {
+            pair.value->syncToDatabase();
+            pair.value->close();
+            SecurityOriginData toOrigin = fromOrigin;
+            toOrigin.host = newName;
+            moveRecords.append({ fromOrigin, toOrigin });
+        }
+    }
+
+    for (const auto& record : moveRecords) {
+        if (tracker)
+            FileSystem::moveFile(tracker->databasePath(record.fromOrigin), tracker->databasePath(record.toOrigin));
+        m_storageAreaMap.take(record.fromOrigin)->clear();
+    }
+}
+
 Vector<SecurityOriginData> LocalStorageNamespace::ephemeralOrigins() const
 {
     ASSERT(!RunLoop::isMain());

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h	2020-03-23 18:40:03 UTC (rev 258862)
@@ -52,6 +52,7 @@
 
     void clearStorageAreasMatchingOrigin(const WebCore::SecurityOriginData&);
     void clearAllStorageAreas();
+    void renameDomain(const String&, const String&, LocalStorageDatabaseTracker*);
 
     Vector<WebCore::SecurityOriginData> ephemeralOrigins() const;
 

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp	2020-03-23 18:40:03 UTC (rev 258862)
@@ -210,4 +210,12 @@
     m_localStorageDatabase->updateDatabase();
 }
 
+void StorageArea::close()
+{
+    if (!m_localStorageDatabase)
+        return;
+
+    m_localStorageDatabase->close();
+}
+
 } // namespace WebKit

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.h (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.h	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.h	2020-03-23 18:40:03 UTC (rev 258862)
@@ -71,6 +71,7 @@
     void openDatabaseAndImportItemsIfNeeded() const;
 
     void syncToDatabase();
+    void close();
 
 private:
     void dispatchEvents(IPC::Connection::UniqueID sourceConnection, StorageAreaImplIdentifier, const String& key, const String& oldValue, const String& newValue, const String& urlString) const;

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp	2020-03-23 18:40:03 UTC (rev 258862)
@@ -155,6 +155,13 @@
     return { };
 }
 
+void StorageManager::renameDomain(const String& oldName, const String& newName)
+{
+    ASSERT(!RunLoop::isMain());
+    for (auto& localStorageNamespace : m_localStorageNamespaces.values())
+        localStorageNamespace->renameDomain(oldName, newName, m_localStorageDatabaseTracker.get());
+}
+
 void StorageManager::deleteLocalStorageOriginsModifiedSince(WallTime time)
 {
     ASSERT(!RunLoop::isMain());

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h	2020-03-23 18:40:03 UTC (rev 258862)
@@ -69,6 +69,7 @@
     void deleteLocalStorageOriginsModifiedSince(WallTime);
     void deleteLocalStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>&);
     Vector<LocalStorageDatabaseTracker::OriginDetails> getLocalStorageOriginDetailsCrossThreadCopy() const;
+    void renameDomain(const String&, const String&);
 
     void clearStorageNamespaces();
 

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.cpp (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.cpp	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.cpp	2020-03-23 18:40:03 UTC (rev 258862)
@@ -293,6 +293,18 @@
     });
 }
 
+void StorageManagerSet::renameDomain(PAL::SessionID sessionID, const String& oldName, const String& newName, CompletionHandler<void()>&& completionHandler)
+{
+    ASSERT(RunLoop::isMain());
+
+    m_queue->dispatch([this, protectedThis = makeRef(*this), sessionID, oldName = oldName.isolatedCopy(), newName = newName.isolatedCopy(), completionHandler = WTFMove(completionHandler)]() mutable {
+        auto* storageManager = m_storageManagers.get(sessionID);
+        ASSERT(storageManager);
+        storageManager->renameDomain(oldName, newName);
+        RunLoop::main().dispatch(WTFMove(completionHandler));
+    });
+}
+
 void StorageManagerSet::connectToLocalStorageArea(IPC::Connection& connection, PAL::SessionID sessionID, StorageNamespaceIdentifier storageNamespaceID, SecurityOriginData&& originData, ConnectToStorageAreaCallback&& completionHandler)
 {
     ASSERT(!RunLoop::isMain());

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.h (258861 => 258862)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.h	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.h	2020-03-23 18:40:03 UTC (rev 258862)
@@ -69,6 +69,7 @@
     void deleteLocalStorageModifiedSince(PAL::SessionID, WallTime, DeleteCallback&&);
     void deleteLocalStorageForOrigins(PAL::SessionID, const Vector<WebCore::SecurityOriginData>&, DeleteCallback&&);
     void getLocalStorageOriginDetails(PAL::SessionID, GetOriginDetailsCallback&&);
+    void renameDomain(PAL::SessionID, const String&, const String&, CompletionHandler<void()>&&);
 
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
     void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>& replyEncoder);

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm (258861 => 258862)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2020-03-23 18:40:03 UTC (rev 258862)
@@ -595,6 +595,17 @@
 #endif
 }
 
+- (void)_renameDomain:(NSString *)domainName to:(NSString *)newDomainName forDataOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(void))completionHandler
+{
+    if (!dataTypes.count)
+        return completionHandler();
+    if (dataTypes.count > 1 || ![dataTypes containsObject:WKWebsiteDataTypeLocalStorage])
+        [NSException raise:NSInvalidArgumentException format:@"_renameDomain can only be called with WKWebsiteDataTypeLocalStorage right now."];
+    _websiteDataStore->renameDomainInWebsiteData(domainName, newDomainName, WebKit::toWebsiteDataTypes(dataTypes), [completionHandler = makeBlockPtr(completionHandler)] {
+        completionHandler();
+    });
+}
+
 - (id <_WKWebsiteDataStoreDelegate>)_delegate
 {
     return _delegate.get().get();

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h (258861 => 258862)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h	2020-03-23 18:40:03 UTC (rev 258862)
@@ -80,6 +80,8 @@
 - (void)_processStatisticsAndDataRecords:(void (^)(void))completionHandler WK_API_AVAILABLE(macos(10.15), ios(13.0));
 - (void)_appBoundDomains:(void (^)(NSArray<NSString *> *))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 
+- (void)_renameDomain:(NSString *)domainName to:(NSString *)newDomainName forDataOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(void))completionHandler;
+
 @property (nullable, nonatomic, weak) id <_WKWebsiteDataStoreDelegate> _delegate WK_API_AVAILABLE(macos(10.15), ios(13.0));
 @property (nonatomic, readonly, copy) _WKWebsiteDataStoreConfiguration *_configuration;
 

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (258861 => 258862)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-03-23 18:40:03 UTC (rev 258862)
@@ -244,6 +244,11 @@
     send(Messages::NetworkProcess::DeleteWebsiteDataForOrigins(sessionID, dataTypes, origins, cookieHostNames, HSTSCacheHostNames, callbackID), 0);
 }
 
+void NetworkProcessProxy::renameDomainInWebsiteData(PAL::SessionID sessionID, const String& oldName, const String& newName, OptionSet<WebsiteDataType> dataTypes, CompletionHandler<void()>&& completionHandler)
+{
+    sendWithAsyncReply(Messages::NetworkProcess::RenameDomainInWebsiteData(sessionID, oldName, newName, dataTypes), WTFMove(completionHandler));
+}
+
 void NetworkProcessProxy::networkProcessCrashed()
 {
     clearCallbackStates();

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (258861 => 258862)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-03-23 18:40:03 UTC (rev 258862)
@@ -107,6 +107,7 @@
     void fetchWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, OptionSet<WebsiteDataFetchOption>, CompletionHandler<void(WebsiteData)>&&);
     void deleteWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, WallTime modifiedSince, CompletionHandler<void()>&& completionHandler);
     void deleteWebsiteDataForOrigins(PAL::SessionID, OptionSet<WebKit::WebsiteDataType>, const Vector<WebCore::SecurityOriginData>& origins, const Vector<String>& cookieHostNames, const Vector<String>& HSTSCacheHostNames, CompletionHandler<void()>&&);
+    void renameDomainInWebsiteData(PAL::SessionID, const String&, const String&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&);
 
     void getLocalStorageDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);
 

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (258861 => 258862)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2020-03-23 18:40:03 UTC (rev 258862)
@@ -2301,4 +2301,13 @@
     }
 }
 
+void WebsiteDataStore::renameDomainInWebsiteData(String&& oldName, String&& newName, OptionSet<WebsiteDataType> dataTypes, CompletionHandler<void()>&& completionHandler)
+{
+    auto callbackAggregator = CallbackAggregator::create(WTFMove(completionHandler));
+    for (auto& processPool : processPools()) {
+        if (auto* networkProcess = processPool->networkProcess())
+            networkProcess->renameDomainInWebsiteData(m_sessionID, oldName, newName, dataTypes, [callbackAggregator = callbackAggregator.copyRef()] { });
+    }
 }
+
+}

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h (258861 => 258862)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2020-03-23 18:40:03 UTC (rev 258862)
@@ -254,6 +254,8 @@
 
     API::HTTPCookieStore& cookieStore();
 
+    void renameDomainInWebsiteData(String&&, String&&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&);
+
 #if ENABLE(DEVICE_ORIENTATION)
     WebDeviceOrientationAndMotionAccessController& deviceOrientationAndMotionAccessController() { return m_deviceOrientationAndMotionAccessController; }
 #endif

Modified: trunk/Tools/ChangeLog (258861 => 258862)


--- trunk/Tools/ChangeLog	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Tools/ChangeLog	2020-03-23 18:40:03 UTC (rev 258862)
@@ -1,3 +1,14 @@
+2020-03-23  Alex Christensen  <achristen...@webkit.org>
+
+        Add SPI to move localStorage to a different domain
+        https://bugs.webkit.org/show_bug.cgi?id=209260
+        <rdar://problem/60285683>
+
+        Reviewed by Brady Eidson.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:
+        (TEST):
+
 2020-03-23  youenn fablet  <you...@apple.com>
 
         Disable TestWebKitAPI.ProcessSwap.GetUserMediaCaptureState if getUserMedia is not supported

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm (258861 => 258862)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2020-03-23 18:23:50 UTC (rev 258861)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2020-03-23 18:40:03 UTC (rev 258862)
@@ -517,6 +517,33 @@
     EXPECT_TRUE(dataStore._configuration.persistent);
 }
 
+TEST(WebKit, WebsiteDataStoreRenameDomain)
+{
+    TestWKWebView *webView = [[[TestWKWebView alloc] init] autorelease];
+    [webView synchronouslyLoadHTMLString:@"<script>localStorage.setItem('testkey', 'testvalue')</script>" baseURL:[NSURL URLWithString:@"https://example.com/"]];
+    
+    __block bool done = false;
+    WKWebsiteDataStore *dataStore = webView.configuration.websiteDataStore;
+    NSSet *localStorageSet = [NSSet setWithObject:WKWebsiteDataTypeLocalStorage];
+    [dataStore _renameDomain:@"example.com" to:@"webkit.org" forDataOfTypes:localStorageSet completionHandler:^{
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+
+    [webView synchronouslyLoadHTMLString:@"hello" baseURL:[NSURL URLWithString:@"https://webkit.org/"]];
+    EXPECT_WK_STREQ([webView objectByEvaluatingJavaScript:@"localStorage.getItem('testkey')"], "testvalue");
+    [webView synchronouslyLoadHTMLString:@"hello" baseURL:[NSURL URLWithString:@"https://example.com/"]];
+    EXPECT_TRUE([[webView objectByEvaluatingJavaScript:@"localStorage.getItem('testkey')"] isKindOfClass:[NSNull class]]);
+
+    done = false;
+    [dataStore fetchDataRecordsOfTypes:localStorageSet completionHandler:^(NSArray<WKWebsiteDataRecord *> *records) {
+        [dataStore removeDataOfTypes:localStorageSet forDataRecords:records completionHandler:^{
+            done = true;
+        }];
+    }];
+    TestWebKitAPI::Util::run(&done);
+}
+
 TEST(WebKit, NetworkCacheDirectory)
 {
     using namespace TestWebKitAPI;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to