Changeset 261038 in webkit


Ignore:
Timestamp:
May 1, 2020 4:38:22 PM (4 years ago)
Author:
commit-queue@webkit.org
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 <achristensen@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):

Location:
trunk
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r261034 r261038  
     12020-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
    1382020-05-01  Chris Dumez  <cdumez@apple.com>
    239
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r260928 r261038  
    24612461}
    24622462
     2463void 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
    24632473#if ENABLE(SERVICE_WORKER)
    24642474void NetworkProcess::forEachSWServer(const Function<void(SWServer&)>& callback)
     
    26482658    if (!m_storageManagerSet->contains(sessionID)) {
    26492659        LOG_ERROR("Cannot get local storage information for an unknown session");
     2660        completionHandler({ });
    26502661        return;
    26512662    }
    26522663
    2653     m_storageManagerSet->getLocalStorageOriginDetails(sessionID, [completionHandler = WTFMove(completionHandler)](auto&& details) mutable {
    2654         completionHandler(WTFMove(details));
    2655     });
     2664    m_storageManagerSet->getLocalStorageOriginDetails(sessionID, WTFMove(completionHandler));
    26562665}
    26572666
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.h

    r260900 r261038  
    293293
    294294    void resetQuota(PAL::SessionID, CompletionHandler<void()>&&);
     295    void renameOriginInWebsiteData(PAL::SessionID, const URL&, const URL&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&);
    295296
    296297#if ENABLE(SERVICE_WORKER)
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.messages.in

    r260900 r261038  
    4747    DeleteWebsiteData(PAL::SessionID sessionID, OptionSet<WebKit::WebsiteDataType> websiteDataTypes, WallTime modifiedSince, WebKit::CallbackID callbackID)
    4848    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
    4950
    5051    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  
    7171}
    7272
     73void 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
    7382Vector<SecurityOriginData> LocalStorageNamespace::ephemeralOrigins() const
    7483{
  • trunk/Source/WebKit/NetworkProcess/WebStorage/LocalStorageNamespace.h

    r258914 r261038  
    5353    void clearStorageAreasMatchingOrigin(const WebCore::SecurityOriginData&);
    5454    void clearAllStorageAreas();
     55    void flushAndClose(const WebCore::SecurityOriginData&);
    5556
    5657    Vector<WebCore::SecurityOriginData> ephemeralOrigins() const;
  • trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp

    r258914 r261038  
    211211}
    212212
     213void StorageArea::close()
     214{
     215    if (!m_localStorageDatabase)
     216        return;
     217
     218    m_localStorageDatabase->close();
     219}
     220
    213221} // namespace WebKit
  • trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.h

    r258914 r261038  
    7272
    7373    void syncToDatabase();
     74    void close();
    7475
    7576private:
  • trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.cpp

    r258914 r261038  
    4141#include <memory>
    4242#include <wtf/CrossThreadCopier.h>
     43#include <wtf/FileSystem.h>
    4344#include <wtf/WorkQueue.h>
    4445
     
    156157}
    157158
     159void 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
    158177void StorageManager::deleteLocalStorageOriginsModifiedSince(WallTime time)
    159178{
  • trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManager.h

    r258914 r261038  
    7070    void deleteLocalStorageEntriesForOrigins(const Vector<WebCore::SecurityOriginData>&);
    7171    Vector<LocalStorageDatabaseTracker::OriginDetails> getLocalStorageOriginDetailsCrossThreadCopy() const;
     72    void renameOrigin(const URL&, const URL&);
    7273
    7374    void clearStorageNamespaces();
  • trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.cpp

    r258914 r261038  
    294294}
    295295
     296void 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
    296308void StorageManagerSet::connectToLocalStorageArea(IPC::Connection& connection, PAL::SessionID sessionID, StorageNamespaceIdentifier storageNamespaceID, SecurityOriginData&& originData, ConnectToStorageAreaCallback&& completionHandler)
    297309{
  • trunk/Source/WebKit/NetworkProcess/WebStorage/StorageManagerSet.h

    r258914 r261038  
    7070    void deleteLocalStorageForOrigins(PAL::SessionID, const Vector<WebCore::SecurityOriginData>&, DeleteCallback&&);
    7171    void getLocalStorageOriginDetails(PAL::SessionID, GetOriginDetailsCallback&&);
     72    void renameOrigin(PAL::SessionID, const URL&, const URL&, CompletionHandler<void()>&&);
    7273
    7374    void didReceiveMessage(IPC::Connection&, IPC::Decoder&);
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm

    r260900 r261038  
    589589}
    590590
     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
    591603- (id <_WKWebsiteDataStoreDelegate>)_delegate
    592604{
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStorePrivate.h

    r260900 r261038  
    8181- (void)_appBoundDomains:(void (^)(NSArray<NSString *> *))completionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
    8282
     83- (void)_renameOrigin:(NSURL *)oldName to:(NSURL *)newName forDataOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(void))completionHandler;
     84
    8385@property (nullable, nonatomic, weak) id <_WKWebsiteDataStoreDelegate> _delegate WK_API_AVAILABLE(macos(10.15), ios(13.0));
    8486@property (nonatomic, readonly, copy) _WKWebsiteDataStoreConfiguration *_configuration;
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp

    r260900 r261038  
    218218}
    219219
     220void 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
    220225void NetworkProcessProxy::networkProcessCrashed()
    221226{
  • trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.h

    r260928 r261038  
    109109    void deleteWebsiteData(PAL::SessionID, OptionSet<WebsiteDataType>, WallTime modifiedSince, CompletionHandler<void()>&& completionHandler);
    110110    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()>&&);
    111112
    112113    void getLocalStorageDetails(PAL::SessionID, CompletionHandler<void(Vector<LocalStorageDatabaseTracker::OriginDetails>&&)>&&);
  • trunk/Source/WebKit/UIProcess/WebsiteData/WebsiteDataStore.cpp

    r260900 r261038  
    24082408}
    24092409
    2410 }
     2410void 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  
    259259    API::HTTPCookieStore& cookieStore();
    260260
     261    void renameOriginInWebsiteData(URL&&, URL&&, OptionSet<WebsiteDataType>, CompletionHandler<void()>&&);
     262
    261263#if ENABLE(DEVICE_ORIENTATION)
    262264    WebDeviceOrientationAndMotionAccessController& deviceOrientationAndMotionAccessController() { return m_deviceOrientationAndMotionAccessController; }
  • trunk/Tools/ChangeLog

    r261037 r261038  
     12020-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
    1122020-05-01  Wenson Hsieh  <wenson_hsieh@apple.com>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm

    r259843 r261038  
    518518}
    519519
     520TEST(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
    520549TEST(WebKit, NetworkCacheDirectory)
    521550{
Note: See TracChangeset for help on using the changeset viewer.