Title: [261038] trunk
Revision
261038
Author
commit-qu...@webkit.org
Date
2020-05-01 16:38:22 -0700 (Fri, 01 May 2020)

Log Message

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

Patch by Alex Christensen <achristen...@webkit.org> on 2020-05-01
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 (261037 => 261038)


--- trunk/Source/WebKit/ChangeLog	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/ChangeLog	2020-05-01 23:38:22 UTC (rev 261038)
@@ -1,3 +1,40 @@
+2020-05-01  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-05-01  Chris Dumez  <cdu...@apple.com>
 
         [iOS] ProcessThrottler fails to re-take ProcessAssertion if the previous one was invalidated

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2020-05-01 23:38:22 UTC (rev 261038)
@@ -2460,6 +2460,16 @@
     completionHandler();
 }
 
+void NetworkProcess::renameOriginInWebsiteData(PAL::SessionID sessionID, const URL& oldName, const URL& 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->renameOrigin(sessionID, oldName, newName, [aggregator = aggregator.copyRef()] { });
+    }
+}
+
 #if ENABLE(SERVICE_WORKER)
 void NetworkProcess::forEachSWServer(const Function<void(SWServer&)>& callback)
 {
@@ -2647,12 +2657,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 (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.h	2020-05-01 23:38:22 UTC (rev 261038)
@@ -292,6 +292,7 @@
     void clearLegacyPrivateBrowsingLocalStorage();
 
     void resetQuota(PAL::SessionID, CompletionHandler<void()>&&);
+    void renameOriginInWebsiteData(PAL::SessionID, const URL&, const URL&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&);
 
 #if ENABLE(SERVICE_WORKER)
     WebCore::SWServer* swServerForSessionIfExists(PAL::SessionID sessionID) { return m_swServers.get(sessionID); }

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in	2020-05-01 23:38:22 UTC (rev 261038)
@@ -46,6 +46,7 @@
     FetchWebsiteData(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, OptionSet<WebKit::WebsiteDataFetchOption> fetchOptions, WebKit::CallbackID callbackID)
     DeleteWebsiteData(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, WallTime modifiedSince, WebKit::CallbackID callbackID)
     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)
+    RenameOriginInWebsiteData(PAL::SessionID sessionID, URL oldDomain, URL newDomain, OptionSet<WebKit::WebsiteDataType> websiteDataTypes) -> () Async
 
     DownloadRequest(PAL::SessionID sessionID, WebKit::DownloadID downloadID, WebCore::ResourceRequest request, enum:bool Optional<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 (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.cpp	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.cpp	2020-05-01 23:38:22 UTC (rev 261038)
@@ -70,6 +70,15 @@
         storageArea->clear();
 }
 
+void LocalStorageNamespace::flushAndClose(const SecurityOriginData& origin)
+{
+    ASSERT(!RunLoop::isMain());
+    if (auto* storageArea = m_storageAreaMap.get(origin)) {
+        storageArea->syncToDatabase();
+        storageArea->close();
+    }
+}
+
 Vector<SecurityOriginData> LocalStorageNamespace::ephemeralOrigins() const
 {
     ASSERT(!RunLoop::isMain());

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h	2020-05-01 23:38:22 UTC (rev 261038)
@@ -52,6 +52,7 @@
 
     void clearStorageAreasMatchingOrigin(const WebCore::SecurityOriginData&);
     void clearAllStorageAreas();
+    void flushAndClose(const WebCore::SecurityOriginData&);
 
     Vector<WebCore::SecurityOriginData> ephemeralOrigins() const;
 

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp	2020-05-01 23:38:22 UTC (rev 261038)
@@ -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 (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.h	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.h	2020-05-01 23:38:22 UTC (rev 261038)
@@ -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 (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp	2020-05-01 23:38:22 UTC (rev 261038)
@@ -40,6 +40,7 @@
 #include <WebCore/TextEncoding.h>
 #include <memory>
 #include <wtf/CrossThreadCopier.h>
+#include <wtf/FileSystem.h>
 #include <wtf/WorkQueue.h>
 
 namespace WebKit {
@@ -155,6 +156,24 @@
     return { };
 }
 
+void StorageManager::renameOrigin(const URL& oldURL, const URL& newURL)
+{
+    ASSERT(!RunLoop::isMain());
+    auto oldOrigin = WebCore::SecurityOriginData::fromURL(oldURL);
+    auto newOrigin = WebCore::SecurityOriginData::fromURL(newURL);
+    for (auto& localStorageNamespace : m_localStorageNamespaces.values())
+        localStorageNamespace->flushAndClose(oldOrigin);
+
+    if (auto* tracker = m_localStorageDatabaseTracker.get()) {
+        static const std::array<const char *, 3> suffixes { "", "-shm", "-wal" };
+        for (const auto* suffix : suffixes)
+            FileSystem::moveFile(makeString(tracker->databasePath(oldOrigin), suffix), makeString(tracker->databasePath(newOrigin), suffix));
+    }
+
+    for (auto& localStorageNamespace : m_localStorageNamespaces.values())
+        localStorageNamespace->clearStorageAreasMatchingOrigin(oldOrigin);
+}
+
 void StorageManager::deleteLocalStorageOriginsModifiedSince(WallTime time)
 {
     ASSERT(!RunLoop::isMain());

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h	2020-05-01 23:38:22 UTC (rev 261038)
@@ -69,6 +69,7 @@
     void deleteLocalStorageOriginsModifiedSince(WallTime);
     void deleteLocalStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>&);
     Vector<LocalStorageDatabaseTracker::OriginDetails> getLocalStorageOriginDetailsCrossThreadCopy() const;
+    void renameOrigin(const URL&, const URL&);
 
     void clearStorageNamespaces();
 

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.cpp (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.cpp	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.cpp	2020-05-01 23:38:22 UTC (rev 261038)
@@ -293,6 +293,18 @@
     });
 }
 
+void StorageManagerSet::renameOrigin(PAL::SessionID sessionID, const URL& oldName, const URL& 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->renameOrigin(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 (261037 => 261038)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.h	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.h	2020-05-01 23:38:22 UTC (rev 261038)
@@ -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 renameOrigin(PAL::SessionID, const URL&, const URL&, 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 (261037 => 261038)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2020-05-01 23:38:22 UTC (rev 261038)
@@ -588,6 +588,18 @@
 #endif
 }
 
+- (void)_renameOrigin:(NSURL *)oldName to:(NSURL *)newName forDataOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(void))completionHandler
+{
+    if (!dataTypes.count)
+        return completionHandler();
+
+    if (dataTypes.count > 1 || ![dataTypes containsObject:WKWebsiteDataTypeLocalStorage])
+        [NSException raise:NSInvalidArgumentException format:@"_renameOrigin can only be called with WKWebsiteDataTypeLocalStorage right now."];
+    _websiteDataStore->renameOriginInWebsiteData(oldName, newName, WebKit::toWebsiteDataTypes(dataTypes), [completionHandler = makeBlockPtr(completionHandler)] {
+        completionHandler();
+    });
+}
+
 - (id <_WKWebsiteDataStoreDelegate>)_delegate
 {
     return _delegate.get().get();

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


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h	2020-05-01 23:38:22 UTC (rev 261038)
@@ -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)_renameOrigin:(NSURL *)oldName to:(NSURL *)newName 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 (261037 => 261038)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2020-05-01 23:38:22 UTC (rev 261038)
@@ -217,6 +217,11 @@
     send(Messages::NetworkProcess::DeleteWebsiteDataForOrigins(sessionID, dataTypes, origins, cookieHostNames, HSTSCacheHostNames, registrableDomains, callbackID), 0);
 }
 
+void NetworkProcessProxy::renameOriginInWebsiteData(PAL::SessionID sessionID, const URL& oldName, const URL& newName, OptionSet<WebsiteDataType> dataTypes, CompletionHandler<void()>&& completionHandler)
+{
+    sendWithAsyncReply(Messages::NetworkProcess::RenameOriginInWebsiteData(sessionID, oldName, newName, dataTypes), WTFMove(completionHandler));
+}
+
 void NetworkProcessProxy::networkProcessCrashed()
 {
     clearCallbackStates();

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h (261037 => 261038)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h	2020-05-01 23:38:22 UTC (rev 261038)
@@ -108,6 +108,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, const Vector<RegistrableDomain>&, CompletionHandler<void()>&&);
+    void renameOriginInWebsiteData(PAL::SessionID, const URL&, const URL&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&);
 
     void getLocalStorageDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);
 

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp (261037 => 261038)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp	2020-05-01 23:38:22 UTC (rev 261038)
@@ -2407,4 +2407,15 @@
     }
 }
 
+void WebsiteDataStore::renameOriginInWebsiteData(URL&& oldName, URL&& newName, OptionSet<WebsiteDataType> dataTypes, CompletionHandler<void()>&& completionHandler)
+{
+    auto callbackAggregator = CallbackAggregator::create(WTFMove(completionHandler));
+    for (auto& processPool : WebProcessPool::allProcessPools()) {
+        if (auto* networkProcess = processPool->networkProcess()) {
+            networkProcess->addSession(*this);
+            networkProcess->renameOriginInWebsiteData(m_sessionID, oldName, newName, dataTypes, [callbackAggregator = callbackAggregator.copyRef()] { });
+        }
+    }
 }
+
+}

Modified: trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h (261037 => 261038)


--- trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.h	2020-05-01 23:38:22 UTC (rev 261038)
@@ -258,6 +258,8 @@
 
     API::HTTPCookieStore& cookieStore();
 
+    void renameOriginInWebsiteData(URL&&, URL&&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&);
+
 #if ENABLE(DEVICE_ORIENTATION)
     WebDeviceOrientationAndMotionAccessController& deviceOrientationAndMotionAccessController() { return m_deviceOrientationAndMotionAccessController; }
 #endif

Modified: trunk/Tools/ChangeLog (261037 => 261038)


--- trunk/Tools/ChangeLog	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Tools/ChangeLog	2020-05-01 23:38:22 UTC (rev 261038)
@@ -1,3 +1,14 @@
+2020-05-01  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-05-01  Wenson Hsieh  <wenson_hs...@apple.com>
 
         Add a test for webkit.org/b/211311

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm (261037 => 261038)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2020-05-01 23:12:07 UTC (rev 261037)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm	2020-05-01 23:38:22 UTC (rev 261038)
@@ -517,6 +517,35 @@
     EXPECT_TRUE(dataStore._configuration.persistent);
 }
 
+TEST(WebKit, WebsiteDataStoreRenameOrigin)
+{
+    TestWKWebView *webView = [[[TestWKWebView alloc] init] autorelease];
+    [webView synchronouslyLoadHTMLString:@"<script>localStorage.setItem('testkey', 'testvalue')</script>" baseURL:[NSURL URLWithString:@"https://example.com/"]];
+    
+    __block bool done = false;
+    NSURL *exampleURL = [NSURL URLWithString:@"https://example.com/"];
+    NSURL *webKitURL = [NSURL URLWithString:@"https://webkit.org/"];
+    WKWebsiteDataStore *dataStore = webView.configuration.websiteDataStore;
+    NSSet *localStorageSet = [NSSet setWithObject:WKWebsiteDataTypeLocalStorage];
+    [dataStore _renameOrigin:exampleURL to:webKitURL forDataOfTypes:localStorageSet completionHandler:^{
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+
+    [webView synchronouslyLoadHTMLString:@"hello" baseURL:webKitURL];
+    EXPECT_WK_STREQ([webView objectByEvaluatingJavaScript:@"localStorage.getItem('testkey')"], "testvalue");
+    [webView synchronouslyLoadHTMLString:@"hello" baseURL:exampleURL];
+    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