WebKitWebsiteData.cpp [plain text]
#include "config.h"
#include "WebKitWebsiteData.h"
#include "WebKitSecurityOriginPrivate.h"
#include "WebKitWebsiteDataPrivate.h"
#include <glib/gi18n-lib.h>
#include <wtf/HashTable.h>
#include <wtf/Vector.h>
using namespace WebKit;
struct _WebKitWebsiteData {
explicit _WebKitWebsiteData(WebsiteDataRecord&& websiteDataDecord)
: record(WTFMove(websiteDataDecord))
{
}
WebsiteDataRecord record;
CString displayName;
int referenceCount { 1 };
};
G_DEFINE_BOXED_TYPE(WebKitWebsiteData, webkit_website_data, webkit_website_data_ref, webkit_website_data_unref)
static bool recordContainsSupportedDataTypes(const WebsiteDataRecord& record)
{
static const OptionSet<WebsiteDataType> typesSupported = {
WebsiteDataType::MemoryCache,
WebsiteDataType::DiskCache,
WebsiteDataType::OfflineWebApplicationCache,
WebsiteDataType::SessionStorage,
WebsiteDataType::LocalStorage,
WebsiteDataType::WebSQLDatabases,
WebsiteDataType::IndexedDBDatabases,
#if ENABLE(NETSCAPE_PLUGIN_API)
WebsiteDataType::PlugInData,
#endif
WebsiteDataType::Cookies
};
return record.types.contains(typesSupported);
}
static WebKitWebsiteDataTypes toWebKitWebsiteDataTypes(OptionSet<WebsiteDataType> types)
{
uint32_t returnValue = 0;
if (types.contains(WebsiteDataType::MemoryCache))
returnValue |= WEBKIT_WEBSITE_DATA_MEMORY_CACHE;
if (types.contains(WebsiteDataType::DiskCache))
returnValue |= WEBKIT_WEBSITE_DATA_DISK_CACHE;
if (types.contains(WebsiteDataType::OfflineWebApplicationCache))
returnValue |= WEBKIT_WEBSITE_DATA_OFFLINE_APPLICATION_CACHE;
if (types.contains(WebsiteDataType::SessionStorage))
returnValue |= WEBKIT_WEBSITE_DATA_SESSION_STORAGE;
if (types.contains(WebsiteDataType::LocalStorage))
returnValue |= WEBKIT_WEBSITE_DATA_LOCAL_STORAGE;
if (types.contains(WebsiteDataType::WebSQLDatabases))
returnValue |= WEBKIT_WEBSITE_DATA_WEBSQL_DATABASES;
if (types.contains(WebsiteDataType::IndexedDBDatabases))
returnValue |= WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES;
#if ENABLE(NETSCAPE_PLUGIN_API)
if (types.contains(WebsiteDataType::PlugInData))
returnValue |= WEBKIT_WEBSITE_DATA_PLUGIN_DATA;
#endif
if (types.contains(WebsiteDataType::Cookies))
returnValue |= WEBKIT_WEBSITE_DATA_COOKIES;
return static_cast<WebKitWebsiteDataTypes>(returnValue);
}
WebKitWebsiteData* webkitWebsiteDataCreate(WebsiteDataRecord&& record)
{
if (!recordContainsSupportedDataTypes(record))
return nullptr;
WebKitWebsiteData* websiteData = static_cast<WebKitWebsiteData*>(fastMalloc(sizeof(WebKitWebsiteData)));
new (websiteData) WebKitWebsiteData(WTFMove(record));
return websiteData;
}
const WebKit::WebsiteDataRecord& webkitWebsiteDataGetRecord(WebKitWebsiteData* websiteData)
{
ASSERT(websiteData);
return websiteData->record;
}
WebKitWebsiteData* webkit_website_data_ref(WebKitWebsiteData* websiteData)
{
g_return_val_if_fail(websiteData, nullptr);
g_atomic_int_inc(&websiteData->referenceCount);
return websiteData;
}
void webkit_website_data_unref(WebKitWebsiteData* websiteData)
{
g_return_if_fail(websiteData);
if (g_atomic_int_dec_and_test(&websiteData->referenceCount)) {
websiteData->~WebKitWebsiteData();
fastFree(websiteData);
}
}
const char* webkit_website_data_get_name(WebKitWebsiteData* websiteData)
{
g_return_val_if_fail(websiteData, nullptr);
if (websiteData->displayName.isNull()) {
if (websiteData->record.displayName == "Local documents on your computer")
websiteData->displayName = _("Local files");
else
websiteData->displayName = websiteData->record.displayName.utf8();
}
return websiteData->displayName.data();
}
WebKitWebsiteDataTypes webkit_website_data_get_types(WebKitWebsiteData* websiteData)
{
g_return_val_if_fail(websiteData, static_cast<WebKitWebsiteDataTypes>(0));
return toWebKitWebsiteDataTypes(websiteData->record.types);
}
guint64 webkit_website_data_get_size(WebKitWebsiteData* websiteData, WebKitWebsiteDataTypes types)
{
g_return_val_if_fail(websiteData, 0);
if (!types || !websiteData->record.size)
return 0;
guint64 totalSize = 0;
for (auto type : websiteData->record.size->typeSizes.keys()) {
if (type & types)
totalSize += websiteData->record.size->typeSizes.get(type);
}
return totalSize;
}