Changeset 265149 in webkit


Ignore:
Timestamp:
Jul 31, 2020 10:44:19 AM (4 years ago)
Author:
commit-queue@webkit.org
Message:

-[WKWebsiteDataStore _renameOrigin:] needs to support IndexedDB renames
https://bugs.webkit.org/show_bug.cgi?id=214905
<rdar://problem/66247978>

Patch by Sihui Liu <sihui_liu@appe.com> on 2020-07-31
Reviewed by Alex Christensen.

Source/WebCore:

To do the renaming, we close all existing databases whose top origin is old origin, and move all files in
directory of old origin to that of new origin.

API test: WebKit.WebsiteDataStoreRenameOriginForIndexedDatabase

  • Modules/indexeddb/server/IDBServer.cpp:

(WebCore::IDBServer::IDBServer::closeDatabasesForOrigins):
(WebCore::IDBServer::IDBServer::closeAndDeleteDatabasesForOrigins):
(WebCore::IDBServer::IDBServer::renameOrigin):

  • Modules/indexeddb/server/IDBServer.h:

Source/WebKit:

  • NetworkProcess/IndexedDB/WebIDBServer.cpp:

(WebKit::WebIDBServer::renameOrigin):

  • NetworkProcess/IndexedDB/WebIDBServer.h:
  • NetworkProcess/NetworkProcess.cpp:

(WebKit::NetworkProcess::renameOriginInWebsiteData):

  • UIProcess/API/Cocoa/WKWebsiteDataStore.mm:

(-[WKWebsiteDataStore _renameOrigin:to:forDataOfTypes:completionHandler:]):

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm:

(TEST):

Location:
trunk
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r265148 r265149  
     12020-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
    1202020-07-31  Chris Fleizach  <cfleizach@apple.com>
    221
  • trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp

    r264790 r265149  
    563563}
    564564
    565 void IDBServer::closeAndDeleteDatabasesForOrigins(const Vector<SecurityOriginData>& origins)
     565void IDBServer::closeDatabasesForOrigins(const Vector<SecurityOriginData>& targetOrigins, Function<bool(const SecurityOriginData&, const ClientOrigin&)>&& filter)
    566566{
    567567    ASSERT(!isMainThread());
     
    570570    HashSet<UniqueIDBDatabase*> openDatabases;
    571571    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());
    579578    }
    580579
     
    583582        m_uniqueIDBDatabaseMap.remove(database->identifier());
    584583    }
     584}
     585
     586void 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    });
    585594
    586595    if (!m_databaseDirectoryPath.isEmpty()) {
     
    695704}
    696705
     706void 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
    697720StorageQuotaManager::Decision IDBServer::requestSpace(const ClientOrigin& origin, uint64_t taskSize)
    698721{
  • trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h

    r263157 r265149  
    104104    WEBCORE_EXPORT void closeAndDeleteDatabasesModifiedSince(WallTime);
    105105    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&);
    106108
    107109    StorageQuotaManager::Decision requestSpace(const ClientOrigin&, uint64_t taskSize);
  • trunk/Source/WebKit/ChangeLog

    r265144 r265149  
     12020-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
    1172020-07-31  Ryan Haddad  <ryanhaddad@apple.com>
    218
  • trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp

    r263157 r265149  
    9090}
    9191
     92void 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
    92105void WebIDBServer::suspend(ShouldForceStop shouldForceStop)
    93106{
  • trunk/Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h

    r264119 r265149  
    5050    void closeAndDeleteDatabasesModifiedSince(WallTime, CompletionHandler<void()>&& callback);
    5151    void closeAndDeleteDatabasesForOrigins(const Vector<WebCore::SecurityOriginData>&, CompletionHandler<void()>&& callback);
     52    void renameOrigin(const WebCore::SecurityOriginData&, const WebCore::SecurityOriginData&, CompletionHandler<void()>&&);
    5253
    5354    enum class ShouldForceStop : bool { No, Yes };
  • trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp

    r265087 r265149  
    25522552{
    25532553    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;
    25542559
    25552560    if (dataTypes.contains(WebsiteDataType::LocalStorage)) {
     
    25572562            m_storageManagerSet->renameOrigin(sessionID, oldName, newName, [aggregator] { });
    25582563    }
     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
    25592572}
    25602573
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm

    r263874 r265149  
    609609        return completionHandler();
    610610
    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
    613615    _websiteDataStore->renameOriginInWebsiteData(oldName, newName, WebKit::toWebsiteDataTypes(dataTypes), [completionHandler = makeBlockPtr(completionHandler)] {
    614616        completionHandler();
  • trunk/Tools/ChangeLog

    r265143 r265149  
     12020-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
    1122020-07-31  Jonathan Bedard  <jbedard@apple.com>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsiteDataStoreCustomPaths.mm

    r264724 r265149  
    549549}
    550550
     551TEST(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
    551617TEST(WebKit, WebsiteDataStoreRenameOrigin)
    552618{
Note: See TracChangeset for help on using the changeset viewer.