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;