diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp | 95 |
1 files changed, 87 insertions, 8 deletions
diff --git a/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp b/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp index d33c056bf..e412511f6 100644 --- a/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp +++ b/Source/WebKit2/UIProcess/API/C/WKKeyValueStorageManager.cpp @@ -26,27 +26,106 @@ #include "config.h" #include "WKKeyValueStorageManager.h" +#include "APIDictionary.h" +#include "APIWebsiteDataStore.h" +#include "StorageManager.h" #include "WKAPICast.h" -#include "WebKeyValueStorageManager.h" +#include "WebsiteDataStore.h" +#include <wtf/RunLoop.h> using namespace WebKit; WKTypeID WKKeyValueStorageManagerGetTypeID() { - return toAPI(WebKeyValueStorageManager::APIType); + return toAPI(API::WebsiteDataStore::APIType); } -void WKKeyValueStorageManagerGetKeyValueStorageOrigins(WKKeyValueStorageManagerRef keyValueStorageManagerRef, void* context, WKKeyValueStorageManagerGetKeyValueStorageOriginsFunction callback) +WKStringRef WKKeyValueStorageManagerGetOriginKey() { - toImpl(keyValueStorageManagerRef)->getKeyValueStorageOrigins(ArrayCallback::create(context, callback)); + static API::String& key = API::String::create("WebKeyValueStorageManagerStorageDetailsOriginKey").leakRef(); + return toAPI(&key); } -void WKKeyValueStorageManagerDeleteEntriesForOrigin(WKKeyValueStorageManagerRef keyValueStorageManagerRef, WKSecurityOriginRef originRef) +WKStringRef WKKeyValueStorageManagerGetCreationTimeKey() { - toImpl(keyValueStorageManagerRef)->deleteEntriesForOrigin(toImpl(originRef)); + static API::String& key = API::String::create("WebKeyValueStorageManagerStorageDetailsCreationTimeKey").leakRef(); + return toAPI(&key); } -void WKKeyValueStorageManagerDeleteAllEntries(WKKeyValueStorageManagerRef keyValueStorageManagerRef) +WKStringRef WKKeyValueStorageManagerGetModificationTimeKey() { - toImpl(keyValueStorageManagerRef)->deleteAllEntries(); + static API::String& key = API::String::create("WebKeyValueStorageManagerStorageDetailsModificationTimeKey").leakRef(); + return toAPI(&key); +} + +void WKKeyValueStorageManagerGetKeyValueStorageOrigins(WKKeyValueStorageManagerRef keyValueStorageManager, void* context, WKKeyValueStorageManagerGetKeyValueStorageOriginsFunction callback) + +{ + StorageManager* storageManager = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore().storageManager(); + if (!storageManager) { + RunLoop::main().dispatch([context, callback] { + callback(toAPI(API::Array::create().ptr()), nullptr, context); + }); + return; + } + + storageManager->getLocalStorageOrigins([context, callback](HashSet<RefPtr<WebCore::SecurityOrigin>>&& securityOrigins) { + Vector<RefPtr<API::Object>> webSecurityOrigins; + webSecurityOrigins.reserveInitialCapacity(securityOrigins.size()); + for (auto& origin : securityOrigins) + webSecurityOrigins.uncheckedAppend(API::SecurityOrigin::create(*origin)); + + callback(toAPI(API::Array::create(WTFMove(webSecurityOrigins)).ptr()), nullptr, context); + }); +} + +void WKKeyValueStorageManagerGetStorageDetailsByOrigin(WKKeyValueStorageManagerRef keyValueStorageManager, void* context, WKKeyValueStorageManagerGetStorageDetailsByOriginFunction callback) +{ + StorageManager* storageManager = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore().storageManager(); + if (!storageManager) { + RunLoop::main().dispatch([context, callback] { + callback(toAPI(API::Array::create().ptr()), nullptr, context); + }); + return; + } + + storageManager->getLocalStorageOriginDetails([context, callback](Vector<LocalStorageDatabaseTracker::OriginDetails> storageDetails) { + HashMap<String, RefPtr<API::Object>> detailsMap; + Vector<RefPtr<API::Object>> result; + result.reserveInitialCapacity(storageDetails.size()); + + for (const auto& originDetails : storageDetails) { + HashMap<String, RefPtr<API::Object>> detailsMap; + + RefPtr<API::Object> origin = API::SecurityOrigin::create(WebCore::SecurityOrigin::createFromDatabaseIdentifier(originDetails.originIdentifier)); + + detailsMap.set(toImpl(WKKeyValueStorageManagerGetOriginKey())->string(), origin); + if (originDetails.creationTime) + detailsMap.set(toImpl(WKKeyValueStorageManagerGetCreationTimeKey())->string(), API::Double::create(originDetails.creationTime.valueOr(0))); + if (originDetails.modificationTime) + detailsMap.set(toImpl(WKKeyValueStorageManagerGetModificationTimeKey())->string(), API::Double::create(originDetails.modificationTime.valueOr(0))); + + result.uncheckedAppend(API::Dictionary::create(WTFMove(detailsMap))); + } + + callback(toAPI(API::Array::create(WTFMove(result)).ptr()), nullptr, context); + }); +} + +void WKKeyValueStorageManagerDeleteEntriesForOrigin(WKKeyValueStorageManagerRef keyValueStorageManager, WKSecurityOriginRef origin) +{ + StorageManager* storageManager = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore().storageManager(); + if (!storageManager) + return; + + storageManager->deleteLocalStorageEntriesForOrigin(toImpl(origin)->securityOrigin()); +} + +void WKKeyValueStorageManagerDeleteAllEntries(WKKeyValueStorageManagerRef keyValueStorageManager) +{ + StorageManager* storageManager = toImpl(reinterpret_cast<WKWebsiteDataStoreRef>(keyValueStorageManager))->websiteDataStore().storageManager(); + if (!storageManager) + return; + + storageManager->deleteLocalStorageOriginsModifiedSince(std::chrono::system_clock::time_point::min(), [] { }); } |