ewk_database_manager.cpp [plain text]
#include "config.h"
#include "ewk_database_manager.h"
#include "APIWebsiteDataStore.h"
#include "GenericCallback.h"
#include "WKAPICast.h"
#include "WKArray.h"
#include "ewk_database_manager_private.h"
#include "ewk_security_origin_private.h"
#include <WebCore/DatabaseTracker.h>
#include <WebCore/OriginLock.h>
#include <WebCore/SecurityOrigin.h>
using namespace WebKit;
typedef GenericCallback<API::Array*> ArrayCallback;
EwkDatabaseManager::EwkDatabaseManager()
{
}
void EwkDatabaseManager::getDatabaseOrigins(Ewk_Database_Manager_Get_Database_Origins_Function callback, void* context) const
{
if (!callback)
return;
RefPtr<ArrayCallback> arrayCallback = ArrayCallback::create(toGenericCallbackFunction(context, callback));
Vector<RefPtr<WebCore::SecurityOrigin>> origins;
Vector<RefPtr<API::Object>> securityOrigins;
WebCore::DatabaseTracker::trackerWithDatabasePath(API::WebsiteDataStore::defaultWebSQLDatabaseDirectory())->origins(origins);
securityOrigins.reserveInitialCapacity(origins.size());
for (const auto& originIdentifier : origins)
securityOrigins.uncheckedAppend(API::SecurityOrigin::create(*originIdentifier));
arrayCallback->performCallbackWithReturnValue(API::Array::create(WTFMove(securityOrigins)).ptr());
}
Eina_List* EwkDatabaseManager::createOriginList(WKArrayRef origins) const
{
Eina_List* originList = 0;
const size_t length = WKArrayGetSize(origins);
for (size_t i = 0; i < length; ++i) {
WKSecurityOriginRef wkOriginRef = static_cast<WKSecurityOriginRef>(WKArrayGetItemAtIndex(origins, i));
RefPtr<EwkSecurityOrigin> origin = m_wrapperCache.get(wkOriginRef);
if (!origin) {
origin = EwkSecurityOrigin::create(wkOriginRef);
m_wrapperCache.set(wkOriginRef, origin);
}
originList = eina_list_append(originList, origin.leakRef());
}
return originList;
}
struct EwkDatabaseOriginsAsyncData {
const Ewk_Database_Manager* manager;
Ewk_Database_Origins_Async_Get_Cb callback;
void* userData;
EwkDatabaseOriginsAsyncData(const Ewk_Database_Manager* manager, Ewk_Database_Origins_Async_Get_Cb callback, void* userData)
: manager(manager)
, callback(callback)
, userData(userData)
{ }
};
static void getDatabaseOriginsCallback(WKArrayRef origins, WKErrorRef, void* context)
{
auto webDatabaseContext = std::unique_ptr<EwkDatabaseOriginsAsyncData>(static_cast<EwkDatabaseOriginsAsyncData*>(context));
Eina_List* originList = webDatabaseContext->manager->createOriginList(origins);
webDatabaseContext->callback(originList, webDatabaseContext->userData);
}
Eina_Bool ewk_database_manager_origins_async_get(const Ewk_Database_Manager* ewkDatabaseManager, Ewk_Database_Origins_Async_Get_Cb callback, void* userData)
{
EINA_SAFETY_ON_NULL_RETURN_VAL(ewkDatabaseManager, false);
EINA_SAFETY_ON_NULL_RETURN_VAL(callback, false);
EwkDatabaseOriginsAsyncData* context = new EwkDatabaseOriginsAsyncData(ewkDatabaseManager, callback, userData);
ewkDatabaseManager->getDatabaseOrigins(getDatabaseOriginsCallback, context);
return true;
}