summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp')
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp818
1 files changed, 818 insertions, 0 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp
new file mode 100644
index 000000000..ea430653f
--- /dev/null
+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitWebsiteDataManager.cpp
@@ -0,0 +1,818 @@
+/*
+ * Copyright (C) 2015 Igalia S.L.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2,1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "WebKitWebsiteDataManager.h"
+
+#include "APIWebsiteDataStore.h"
+#include "WebKitCookieManagerPrivate.h"
+#include "WebKitWebsiteDataManagerPrivate.h"
+#include "WebKitWebsiteDataPrivate.h"
+#include "WebsiteDataFetchOption.h"
+#include <WebCore/FileSystem.h>
+#include <glib/gi18n-lib.h>
+#include <wtf/glib/GUniquePtr.h>
+
+using namespace WebKit;
+
+/**
+ * SECTION: WebKitWebsiteDataManager
+ * @Short_description: Website data manager
+ * @Title: WebKitWebsiteDataManager
+ * @See_also: #WebKitWebContext, #WebKitWebsiteData
+ *
+ * WebKitWebsiteDataManager allows you to manage the data that websites
+ * can store in the client file system like databases or caches.
+ * You can use WebKitWebsiteDataManager to configure the local directories
+ * where the Website data will be stored, by creating a new manager with
+ * webkit_website_data_manager_new() passing the values you want to set.
+ * You can set all the possible configuration values or only some of them,
+ * a default value will be used automatically for the configuration options
+ * not provided. #WebKitWebsiteDataManager:base-data-directory and
+ * #WebKitWebsiteDataManager:base-cache-directory are two special properties
+ * that can be used to set a common base directory for all Website data and
+ * caches. It's possible to provide both, a base directory and a specific value,
+ * but in that case, the specific value takes precedence over the base directory.
+ * The newly created WebKitWebsiteDataManager must be passed as a construct property
+ * to a #WebKitWebContext, you can use webkit_web_context_new_with_website_data_manager()
+ * to create a new #WebKitWebContext with a WebKitWebsiteDataManager.
+ * In case you don't want to set any specific configuration, you don't need to create
+ * a WebKitWebsiteDataManager, the #WebKitWebContext will create a WebKitWebsiteDataManager
+ * with the default configuration. To get the WebKitWebsiteDataManager of a #WebKitWebContext
+ * you can use webkit_web_context_get_website_data_manager().
+ *
+ * A WebKitWebsiteDataManager can also be ephemeral and then all the directories configuration
+ * is not needed because website data will never persist. You can create an ephemeral WebKitWebsiteDataManager
+ * with webkit_website_data_manager_new_ephemeral(). Then you can pass an ephemeral WebKitWebsiteDataManager to
+ * a #WebKitWebContext to make it ephemeral or use webkit_web_context_new_ephemeral() and the WebKitWebsiteDataManager
+ * will be automatically created by the #WebKitWebContext.
+ *
+ * WebKitWebsiteDataManager can also be used to fetch websites data, remove data
+ * stored by particular websites, or clear data for all websites modified since a given
+ * period of time.
+ *
+ * Since: 2.10
+ */
+
+using namespace WebKit;
+
+enum {
+ PROP_0,
+
+ PROP_BASE_DATA_DIRECTORY,
+ PROP_BASE_CACHE_DIRECTORY,
+ PROP_LOCAL_STORAGE_DIRECTORY,
+ PROP_DISK_CACHE_DIRECTORY,
+ PROP_APPLICATION_CACHE_DIRECTORY,
+ PROP_INDEXEDDB_DIRECTORY,
+ PROP_WEBSQL_DIRECTORY,
+ PROP_IS_EPHEMERAL
+};
+
+struct _WebKitWebsiteDataManagerPrivate {
+ ~_WebKitWebsiteDataManagerPrivate()
+ {
+ ASSERT(processPools.isEmpty());
+ }
+
+ RefPtr<API::WebsiteDataStore> websiteDataStore;
+ GUniquePtr<char> baseDataDirectory;
+ GUniquePtr<char> baseCacheDirectory;
+ GUniquePtr<char> localStorageDirectory;
+ GUniquePtr<char> diskCacheDirectory;
+ GUniquePtr<char> applicationCacheDirectory;
+ GUniquePtr<char> indexedDBDirectory;
+ GUniquePtr<char> webSQLDirectory;
+
+ GRefPtr<WebKitCookieManager> cookieManager;
+ Vector<WebProcessPool*> processPools;
+};
+
+WEBKIT_DEFINE_TYPE(WebKitWebsiteDataManager, webkit_website_data_manager, G_TYPE_OBJECT)
+
+static void webkitWebsiteDataManagerGetProperty(GObject* object, guint propID, GValue* value, GParamSpec* paramSpec)
+{
+ WebKitWebsiteDataManager* manager = WEBKIT_WEBSITE_DATA_MANAGER(object);
+
+ switch (propID) {
+ case PROP_BASE_DATA_DIRECTORY:
+ g_value_set_string(value, webkit_website_data_manager_get_base_data_directory(manager));
+ break;
+ case PROP_BASE_CACHE_DIRECTORY:
+ g_value_set_string(value, webkit_website_data_manager_get_base_cache_directory(manager));
+ break;
+ case PROP_LOCAL_STORAGE_DIRECTORY:
+ g_value_set_string(value, webkit_website_data_manager_get_local_storage_directory(manager));
+ break;
+ case PROP_DISK_CACHE_DIRECTORY:
+ g_value_set_string(value, webkit_website_data_manager_get_disk_cache_directory(manager));
+ break;
+ case PROP_APPLICATION_CACHE_DIRECTORY:
+ g_value_set_string(value, webkit_website_data_manager_get_offline_application_cache_directory(manager));
+ break;
+ case PROP_INDEXEDDB_DIRECTORY:
+ g_value_set_string(value, webkit_website_data_manager_get_indexeddb_directory(manager));
+ break;
+ case PROP_WEBSQL_DIRECTORY:
+ g_value_set_string(value, webkit_website_data_manager_get_websql_directory(manager));
+ break;
+ case PROP_IS_EPHEMERAL:
+ g_value_set_boolean(value, webkit_website_data_manager_is_ephemeral(manager));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propID, paramSpec);
+ }
+}
+
+static void webkitWebsiteDataManagerSetProperty(GObject* object, guint propID, const GValue* value, GParamSpec* paramSpec)
+{
+ WebKitWebsiteDataManager* manager = WEBKIT_WEBSITE_DATA_MANAGER(object);
+
+ switch (propID) {
+ case PROP_BASE_DATA_DIRECTORY:
+ manager->priv->baseDataDirectory.reset(g_value_dup_string(value));
+ break;
+ case PROP_BASE_CACHE_DIRECTORY:
+ manager->priv->baseCacheDirectory.reset(g_value_dup_string(value));
+ break;
+ case PROP_LOCAL_STORAGE_DIRECTORY:
+ manager->priv->localStorageDirectory.reset(g_value_dup_string(value));
+ break;
+ case PROP_DISK_CACHE_DIRECTORY:
+ manager->priv->diskCacheDirectory.reset(g_value_dup_string(value));
+ break;
+ case PROP_APPLICATION_CACHE_DIRECTORY:
+ manager->priv->applicationCacheDirectory.reset(g_value_dup_string(value));
+ break;
+ case PROP_INDEXEDDB_DIRECTORY:
+ manager->priv->indexedDBDirectory.reset(g_value_dup_string(value));
+ break;
+ case PROP_WEBSQL_DIRECTORY:
+ manager->priv->webSQLDirectory.reset(g_value_dup_string(value));
+ break;
+ case PROP_IS_EPHEMERAL:
+ if (g_value_get_boolean(value))
+ manager->priv->websiteDataStore = API::WebsiteDataStore::createNonPersistentDataStore();
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propID, paramSpec);
+ }
+}
+
+static void webkitWebsiteDataManagerConstructed(GObject* object)
+{
+ G_OBJECT_CLASS(webkit_website_data_manager_parent_class)->constructed(object);
+
+ WebKitWebsiteDataManagerPrivate* priv = WEBKIT_WEBSITE_DATA_MANAGER(object)->priv;
+ if (priv->baseDataDirectory) {
+ if (!priv->localStorageDirectory)
+ priv->localStorageDirectory.reset(g_build_filename(priv->baseDataDirectory.get(), "localstorage", nullptr));
+ if (!priv->indexedDBDirectory)
+ priv->indexedDBDirectory.reset(g_build_filename(priv->baseDataDirectory.get(), "databases", "indexeddb", nullptr));
+ if (!priv->webSQLDirectory)
+ priv->webSQLDirectory.reset(g_build_filename(priv->baseDataDirectory.get(), "databases", nullptr));
+ }
+
+ if (priv->baseCacheDirectory) {
+ if (!priv->diskCacheDirectory)
+ priv->diskCacheDirectory.reset(g_strdup(priv->baseCacheDirectory.get()));
+ if (!priv->applicationCacheDirectory)
+ priv->applicationCacheDirectory.reset(g_build_filename(priv->baseCacheDirectory.get(), "applications", nullptr));
+ }
+}
+
+static void webkit_website_data_manager_class_init(WebKitWebsiteDataManagerClass* findClass)
+{
+ GObjectClass* gObjectClass = G_OBJECT_CLASS(findClass);
+
+ gObjectClass->get_property = webkitWebsiteDataManagerGetProperty;
+ gObjectClass->set_property = webkitWebsiteDataManagerSetProperty;
+ gObjectClass->constructed = webkitWebsiteDataManagerConstructed;
+
+ /**
+ * WebKitWebsiteDataManager:base-data-directory:
+ *
+ * The base directory for Website data. This is used as a base directory
+ * for any Website data when no specific data directory has been provided.
+ *
+ * Since: 2.10
+ */
+ g_object_class_install_property(
+ gObjectClass,
+ PROP_BASE_DATA_DIRECTORY,
+ g_param_spec_string(
+ "base-data-directory",
+ _("Base Data Directory"),
+ _("The base directory for Website data"),
+ nullptr,
+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+ /**
+ * WebKitWebsiteDataManager:base-cache-directory:
+ *
+ * The base directory for Website cache. This is used as a base directory
+ * for any Website cache when no specific cache directory has been provided.
+ *
+ * Since: 2.10
+ */
+ g_object_class_install_property(
+ gObjectClass,
+ PROP_BASE_CACHE_DIRECTORY,
+ g_param_spec_string(
+ "base-cache-directory",
+ _("Base Cache Directory"),
+ _("The base directory for Website cache"),
+ nullptr,
+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+ /**
+ * WebKitWebsiteDataManager:local-storage-directory:
+ *
+ * The directory where local storage data will be stored.
+ *
+ * Since: 2.10
+ */
+ g_object_class_install_property(
+ gObjectClass,
+ PROP_LOCAL_STORAGE_DIRECTORY,
+ g_param_spec_string(
+ "local-storage-directory",
+ _("Local Storage Directory"),
+ _("The directory where local storage data will be stored"),
+ nullptr,
+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+ /**
+ * WebKitWebsiteDataManager:disk-cache-directory:
+ *
+ * The directory where HTTP disk cache will be stored.
+ *
+ * Since: 2.10
+ */
+ g_object_class_install_property(
+ gObjectClass,
+ PROP_DISK_CACHE_DIRECTORY,
+ g_param_spec_string(
+ "disk-cache-directory",
+ _("Disk Cache Directory"),
+ _("The directory where HTTP disk cache will be stored"),
+ nullptr,
+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+ /**
+ * WebKitWebsiteDataManager:offline-application-cache-directory:
+ *
+ * The directory where offline web application cache will be stored.
+ *
+ * Since: 2.10
+ */
+ g_object_class_install_property(
+ gObjectClass,
+ PROP_APPLICATION_CACHE_DIRECTORY,
+ g_param_spec_string(
+ "offline-application-cache-directory",
+ _("Offline Web Application Cache Directory"),
+ _("The directory where offline web application cache will be stored"),
+ nullptr,
+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+ /**
+ * WebKitWebsiteDataManager:indexeddb-directory:
+ *
+ * The directory where IndexedDB databases will be stored.
+ *
+ * Since: 2.10
+ */
+ g_object_class_install_property(
+ gObjectClass,
+ PROP_INDEXEDDB_DIRECTORY,
+ g_param_spec_string(
+ "indexeddb-directory",
+ _("IndexedDB Directory"),
+ _("The directory where IndexedDB databases will be stored"),
+ nullptr,
+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+ /**
+ * WebKitWebsiteDataManager:websql-directory:
+ *
+ * The directory where WebSQL databases will be stored.
+ *
+ * Since: 2.10
+ */
+ g_object_class_install_property(
+ gObjectClass,
+ PROP_WEBSQL_DIRECTORY,
+ g_param_spec_string(
+ "websql-directory",
+ _("WebSQL Directory"),
+ _("The directory where WebSQL databases will be stored"),
+ nullptr,
+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+
+ /**
+ * WebKitWebsiteDataManager:is-ephemeral:
+ *
+ * Whether the #WebKitWebsiteDataManager is ephemeral. An ephemeral #WebKitWebsiteDataManager
+ * handles all websites data as non-persistent, and nothing will be written to the client
+ * storage. Note that if you create an ephemeral #WebKitWebsiteDataManager all other construction
+ * parameters to configure data directories will be ignored.
+ *
+ * Since: 2.16
+ */
+ g_object_class_install_property(
+ gObjectClass,
+ PROP_IS_EPHEMERAL,
+ g_param_spec_boolean(
+ "is-ephemeral",
+ "Is Ephemeral",
+ _("Whether the WebKitWebsiteDataManager is ephemeral"),
+ FALSE,
+ static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)));
+}
+
+WebKitWebsiteDataManager* webkitWebsiteDataManagerCreate(WebsiteDataStore::Configuration&& configuration)
+{
+ WebKitWebsiteDataManager* manager = WEBKIT_WEBSITE_DATA_MANAGER(g_object_new(WEBKIT_TYPE_WEBSITE_DATA_MANAGER, nullptr));
+ manager->priv->websiteDataStore = API::WebsiteDataStore::create(WTFMove(configuration));
+
+ return manager;
+}
+
+API::WebsiteDataStore& webkitWebsiteDataManagerGetDataStore(WebKitWebsiteDataManager* manager)
+{
+ WebKitWebsiteDataManagerPrivate* priv = manager->priv;
+ if (!priv->websiteDataStore) {
+ WebsiteDataStore::Configuration configuration;
+ configuration.localStorageDirectory = !priv->localStorageDirectory ?
+ API::WebsiteDataStore::defaultLocalStorageDirectory() : WebCore::stringFromFileSystemRepresentation(priv->localStorageDirectory.get());
+ configuration.networkCacheDirectory = !priv->diskCacheDirectory ?
+ API::WebsiteDataStore::defaultNetworkCacheDirectory() : WebCore::pathByAppendingComponent(WebCore::stringFromFileSystemRepresentation(priv->diskCacheDirectory.get()), networkCacheSubdirectory);
+ configuration.applicationCacheDirectory = !priv->applicationCacheDirectory ?
+ API::WebsiteDataStore::defaultApplicationCacheDirectory() : WebCore::stringFromFileSystemRepresentation(priv->applicationCacheDirectory.get());
+ configuration.webSQLDatabaseDirectory = !priv->webSQLDirectory ?
+ API::WebsiteDataStore::defaultWebSQLDatabaseDirectory() : WebCore::stringFromFileSystemRepresentation(priv->webSQLDirectory.get());
+ configuration.mediaKeysStorageDirectory = API::WebsiteDataStore::defaultMediaKeysStorageDirectory();
+ priv->websiteDataStore = API::WebsiteDataStore::create(WTFMove(configuration));
+ }
+
+ return *priv->websiteDataStore;
+}
+
+void webkitWebsiteDataManagerAddProcessPool(WebKitWebsiteDataManager* manager, WebProcessPool& processPool)
+{
+ ASSERT(!manager->priv->processPools.contains(&processPool));
+ manager->priv->processPools.append(&processPool);
+}
+
+void webkitWebsiteDataManagerRemoveProcessPool(WebKitWebsiteDataManager* manager, WebProcessPool& processPool)
+{
+ ASSERT(manager->priv->processPools.contains(&processPool));
+ manager->priv->processPools.removeFirst(&processPool);
+}
+
+const Vector<WebProcessPool*>& webkitWebsiteDataManagerGetProcessPools(WebKitWebsiteDataManager* manager)
+{
+ return manager->priv->processPools;
+}
+
+/**
+ * webkit_website_data_manager_new:
+ * @first_option_name: name of the first option to set
+ * @...: value of first option, followed by more options, %NULL-terminated
+ *
+ * Creates a new #WebKitWebsiteDataManager with the given options. It must
+ * be passed as construction parameter of a #WebKitWebContext.
+ *
+ * Returns: (transfer full): the newly created #WebKitWebsiteDataManager
+ *
+ * Since: 2.10
+ */
+WebKitWebsiteDataManager* webkit_website_data_manager_new(const gchar* firstOptionName, ...)
+{
+ va_list args;
+ va_start(args, firstOptionName);
+ WebKitWebsiteDataManager* manager = WEBKIT_WEBSITE_DATA_MANAGER(g_object_new_valist(WEBKIT_TYPE_WEBSITE_DATA_MANAGER, firstOptionName, args));
+ va_end(args);
+
+ return manager;
+}
+
+/**
+ * webkit_website_data_manager_new_ephemeral:
+ *
+ * Creates an ephemeral #WebKitWebsiteDataManager. See #WebKitWebsiteDataManager:is-ephemeral for more details.
+ *
+ * Returns: (transfer full): a new ephemeral #WebKitWebsiteDataManager.
+ *
+ * Since: 2.16
+ */
+WebKitWebsiteDataManager* webkit_website_data_manager_new_ephemeral()
+{
+ return WEBKIT_WEBSITE_DATA_MANAGER(g_object_new(WEBKIT_TYPE_WEBSITE_DATA_MANAGER, "is-ephemeral", TRUE, nullptr));
+}
+
+/**
+ * webkit_website_data_manager_is_ephemeral:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get whether a #WebKitWebsiteDataManager is ephemeral. See #WebKitWebsiteDataManager::is-ephemerla for more details.
+ *
+ * Returns: %TRUE if @manager is epheral or %FALSE otherwise.
+ *
+ * Since: 2.16
+ */
+gboolean webkit_website_data_manager_is_ephemeral(WebKitWebsiteDataManager* manager)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), FALSE);
+
+ return manager->priv->websiteDataStore && !manager->priv->websiteDataStore->isPersistent();
+}
+
+/**
+ * webkit_website_data_manager_get_base_data_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:base-data-directory property.
+ *
+ * Returns: (allow-none): the base directory for Website data, or %NULL if
+ * #WebKitWebsiteDataManager:base-data-directory was not provided or @manager is ephemeral.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_base_data_directory(WebKitWebsiteDataManager* manager)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+ if (manager->priv->websiteDataStore && !manager->priv->websiteDataStore->isPersistent())
+ return nullptr;
+
+ return manager->priv->baseDataDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_base_cache_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:base-cache-directory property.
+ *
+ * Returns: (allow-none): the base directory for Website cache, or %NULL if
+ * #WebKitWebsiteDataManager:base-cache-directory was not provided or @manager is ephemeral.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_base_cache_directory(WebKitWebsiteDataManager* manager)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+ if (manager->priv->websiteDataStore && !manager->priv->websiteDataStore->isPersistent())
+ return nullptr;
+
+ return manager->priv->baseCacheDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_local_storage_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:local-storage-directory property.
+ *
+ * Returns: (allow-none): the directory where local storage data is stored or %NULL if @manager is ephemeral.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_local_storage_directory(WebKitWebsiteDataManager* manager)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+ WebKitWebsiteDataManagerPrivate* priv = manager->priv;
+ if (priv->websiteDataStore && !priv->websiteDataStore->isPersistent())
+ return nullptr;
+
+ if (!priv->localStorageDirectory)
+ priv->localStorageDirectory.reset(g_strdup(API::WebsiteDataStore::defaultLocalStorageDirectory().utf8().data()));
+ return priv->localStorageDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_disk_cache_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:disk-cache-directory property.
+ *
+ * Returns: (allow-none): the directory where HTTP disk cache is stored or %NULL if @manager is ephemeral.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_disk_cache_directory(WebKitWebsiteDataManager* manager)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+ WebKitWebsiteDataManagerPrivate* priv = manager->priv;
+ if (priv->websiteDataStore && !priv->websiteDataStore->isPersistent())
+ return nullptr;
+
+ if (!priv->diskCacheDirectory) {
+ // The default directory already has the subdirectory.
+ priv->diskCacheDirectory.reset(g_strdup(WebCore::directoryName(API::WebsiteDataStore::defaultNetworkCacheDirectory()).utf8().data()));
+ }
+ return priv->diskCacheDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_offline_application_cache_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:offline-application-cache-directory property.
+ *
+ * Returns: (allow-none): the directory where offline web application cache is stored or %NULL if @manager is ephemeral.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_offline_application_cache_directory(WebKitWebsiteDataManager* manager)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+ WebKitWebsiteDataManagerPrivate* priv = manager->priv;
+ if (priv->websiteDataStore && !priv->websiteDataStore->isPersistent())
+ return nullptr;
+
+ if (!priv->applicationCacheDirectory)
+ priv->applicationCacheDirectory.reset(g_strdup(API::WebsiteDataStore::defaultApplicationCacheDirectory().utf8().data()));
+ return priv->applicationCacheDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_indexeddb_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:indexeddb-directory property.
+ *
+ * Returns: (allow-none): the directory where IndexedDB databases are stored or %NULL if @manager is ephemeral.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_indexeddb_directory(WebKitWebsiteDataManager* manager)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+ WebKitWebsiteDataManagerPrivate* priv = manager->priv;
+ if (priv->websiteDataStore && !priv->websiteDataStore->isPersistent())
+ return nullptr;
+
+ if (!priv->indexedDBDirectory)
+ priv->indexedDBDirectory.reset(g_strdup(API::WebsiteDataStore::defaultIndexedDBDatabaseDirectory().utf8().data()));
+ return priv->indexedDBDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_websql_directory:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitWebsiteDataManager:websql-directory property.
+ *
+ * Returns: (allow-none): the directory where WebSQL databases are stored or %NULL if @manager is ephemeral.
+ *
+ * Since: 2.10
+ */
+const gchar* webkit_website_data_manager_get_websql_directory(WebKitWebsiteDataManager* manager)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+ WebKitWebsiteDataManagerPrivate* priv = manager->priv;
+ if (priv->websiteDataStore && !priv->websiteDataStore->isPersistent())
+ return nullptr;
+
+ if (!priv->webSQLDirectory)
+ priv->webSQLDirectory.reset(g_strdup(API::WebsiteDataStore::defaultWebSQLDatabaseDirectory().utf8().data()));
+ return priv->webSQLDirectory.get();
+}
+
+/**
+ * webkit_website_data_manager_get_cookie_manager:
+ * @manager: a #WebKitWebsiteDataManager
+ *
+ * Get the #WebKitCookieManager of @manager.
+ *
+ * Returns: (transfer none): a #WebKitCookieManager
+ *
+ * Since: 2.16
+ */
+WebKitCookieManager* webkit_website_data_manager_get_cookie_manager(WebKitWebsiteDataManager* manager)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+
+ if (!manager->priv->cookieManager)
+ manager->priv->cookieManager = adoptGRef(webkitCookieManagerCreate(manager));
+
+ return manager->priv->cookieManager.get();
+}
+
+static OptionSet<WebsiteDataType> toWebsiteDataTypes(WebKitWebsiteDataTypes types)
+{
+ OptionSet<WebsiteDataType> returnValue;
+ if (types & WEBKIT_WEBSITE_DATA_MEMORY_CACHE)
+ returnValue |= WebsiteDataType::MemoryCache;
+ if (types & WEBKIT_WEBSITE_DATA_DISK_CACHE)
+ returnValue |= WebsiteDataType::DiskCache;
+ if (types & WEBKIT_WEBSITE_DATA_OFFLINE_APPLICATION_CACHE)
+ returnValue |= WebsiteDataType::OfflineWebApplicationCache;
+ if (types & WEBKIT_WEBSITE_DATA_SESSION_STORAGE)
+ returnValue |= WebsiteDataType::SessionStorage;
+ if (types & WEBKIT_WEBSITE_DATA_LOCAL_STORAGE)
+ returnValue |= WebsiteDataType::LocalStorage;
+ if (types & WEBKIT_WEBSITE_DATA_WEBSQL_DATABASES)
+ returnValue |= WebsiteDataType::WebSQLDatabases;
+ if (types & WEBKIT_WEBSITE_DATA_INDEXEDDB_DATABASES)
+ returnValue |= WebsiteDataType::IndexedDBDatabases;
+#if ENABLE(NETSCAPE_PLUGIN_API)
+ if (types & WEBKIT_WEBSITE_DATA_PLUGIN_DATA)
+ returnValue |= WebsiteDataType::PlugInData;
+#endif
+ if (types & WEBKIT_WEBSITE_DATA_COOKIES)
+ returnValue |= WebsiteDataType::Cookies;
+ return returnValue;
+}
+
+/**
+ * webkit_website_data_manager_fetch:
+ * @manager: a #WebKitWebsiteDataManager
+ * @types: #WebKitWebsiteDataTypes
+ * @cancellable: (allow-none): a #GCancellable or %NULL to ignore
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
+ *
+ * Asynchronously get the list of #WebKitWebsiteData for the given @types.
+ *
+ * When the operation is finished, @callback will be called. You can then call
+ * webkit_website_data_manager_fetch_finish() to get the result of the operation.
+ *
+ * Since: 2.16
+ */
+void webkit_website_data_manager_fetch(WebKitWebsiteDataManager* manager, WebKitWebsiteDataTypes types, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer userData)
+{
+ g_return_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager));
+
+ GRefPtr<GTask> task = adoptGRef(g_task_new(manager, cancellable, callback, userData));
+ manager->priv->websiteDataStore->websiteDataStore().fetchData(toWebsiteDataTypes(types), WebsiteDataFetchOption::ComputeSizes, [task = WTFMove(task)] (Vector<WebsiteDataRecord> records) {
+ GList* dataList = nullptr;
+ while (!records.isEmpty()) {
+ if (auto* data = webkitWebsiteDataCreate(records.takeLast()))
+ dataList = g_list_prepend(dataList, data);
+ }
+
+ g_task_return_pointer(task.get(), dataList, [](gpointer data) {
+ g_list_free_full(static_cast<GList*>(data), reinterpret_cast<GDestroyNotify>(webkit_website_data_unref));
+ });
+ });
+}
+
+/**
+ * webkit_website_data_manager_fetch_finish:
+ * @manager: a #WebKitWebsiteDataManager
+ * @result: a #GAsyncResult
+ * @error: return location for error or %NULL to ignore
+ *
+ * Finish an asynchronous operation started with webkit_website_data_manager_fetch().
+ *
+ * Returns: (element-type WebKitWebsiteData) (transfer full): a #GList of #WebKitWebsiteData. You must free the #GList with
+ * g_list_free() and unref the #WebKitWebsiteData<!-- -->s with webkit_website_data_unref() when you're done with them.
+ *
+ * Since: 2.16
+ */
+GList* webkit_website_data_manager_fetch_finish(WebKitWebsiteDataManager* manager, GAsyncResult* result, GError** error)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), nullptr);
+ g_return_val_if_fail(g_task_is_valid(result, manager), nullptr);
+
+ return static_cast<GList*>(g_task_propagate_pointer(G_TASK(result), error));
+}
+
+/**
+ * webkit_website_data_manager_remove:
+ * @manager: a #WebKitWebsiteDataManager
+ * @types: #WebKitWebsiteDataTypes
+ * @website_data: (element-type WebKitWebsiteData): a #GList of #WebKitWebsiteData
+ * @cancellable: (allow-none): a #GCancellable or %NULL to ignore
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
+ *
+ * Asynchronously removes the website data of the for the given @types for websites in the given @website_data list.
+ * Use webkit_website_data_manager_clear() if you want to remove the website data for all sites.
+ *
+ * When the operation is finished, @callback will be called. You can then call
+ * webkit_website_data_manager_remove_finish() to get the result of the operation.
+ *
+ * Since: 2.16
+ */
+void webkit_website_data_manager_remove(WebKitWebsiteDataManager* manager, WebKitWebsiteDataTypes types, GList* websiteData, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer userData)
+{
+ g_return_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager));
+ g_return_if_fail(websiteData);
+
+ Vector<WebsiteDataRecord> records;
+ for (GList* item = websiteData; item; item = g_list_next(item)) {
+ WebKitWebsiteData* data = static_cast<WebKitWebsiteData*>(item->data);
+
+ if (webkit_website_data_get_types(data) & types)
+ records.append(webkitWebsiteDataGetRecord(data));
+ }
+
+ GRefPtr<GTask> task = adoptGRef(g_task_new(manager, cancellable, callback, userData));
+ if (records.isEmpty()) {
+ g_task_return_boolean(task.get(), TRUE);
+ return;
+ }
+
+ manager->priv->websiteDataStore->websiteDataStore().removeData(toWebsiteDataTypes(types), records, [task = WTFMove(task)] {
+ g_task_return_boolean(task.get(), TRUE);
+ });
+}
+
+/**
+ * webkit_website_data_manager_remove_finish:
+ * @manager: a #WebKitWebsiteDataManager
+ * @result: a #GAsyncResult
+ * @error: return location for error or %NULL to ignore
+ *
+ * Finish an asynchronous operation started with webkit_website_data_manager_remove().
+ *
+ * Returns: %TRUE if website data resources were succesfully removed, or %FALSE otherwise.
+ *
+ * Since: 2.16
+ */
+gboolean webkit_website_data_manager_remove_finish(WebKitWebsiteDataManager* manager, GAsyncResult* result, GError** error)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), FALSE);
+ g_return_val_if_fail(g_task_is_valid(result, manager), FALSE);
+
+ return g_task_propagate_boolean(G_TASK(result), error);
+}
+
+/**
+ * webkit_website_data_manager_clear:
+ * @manager: a #WebKitWebsiteDataManager
+ * @types: #WebKitWebsiteDataTypes
+ * @timespan: a #GTimeSpan
+ * @cancellable: (allow-none): a #GCancellable or %NULL to ignore
+ * @callback: (scope async): a #GAsyncReadyCallback to call when the request is satisfied
+ * @user_data: (closure): the data to pass to callback function
+ *
+ * Asynchronously clear the website data of the given @types modified in the past @timespan.
+ * If @timespan is 0, all website data will be removed.
+ *
+ * When the operation is finished, @callback will be called. You can then call
+ * webkit_website_data_manager_clear_finish() to get the result of the operation.
+ *
+ * Due to implementation limitations, this function does not currently delete
+ * any stored cookies if @timespan is nonzero. This behavior may change in the
+ * future.
+ *
+ * Since: 2.16
+ */
+void webkit_website_data_manager_clear(WebKitWebsiteDataManager* manager, WebKitWebsiteDataTypes types, GTimeSpan timeSpan, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer userData)
+{
+ g_return_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager));
+
+ std::chrono::system_clock::time_point timePoint = timeSpan ? std::chrono::system_clock::now() - std::chrono::microseconds(timeSpan) : std::chrono::system_clock::from_time_t(0);
+ GRefPtr<GTask> task = adoptGRef(g_task_new(manager, cancellable, callback, userData));
+ manager->priv->websiteDataStore->websiteDataStore().removeData(toWebsiteDataTypes(types), timePoint, [task = WTFMove(task)] {
+ g_task_return_boolean(task.get(), TRUE);
+ });
+}
+
+/**
+ * webkit_website_data_manager_clear_finish:
+ * @manager: a #WebKitWebsiteDataManager
+ * @result: a #GAsyncResult
+ * @error: return location for error or %NULL to ignore
+ *
+ * Finish an asynchronous operation started with webkit_website_data_manager_clear()
+ *
+ * Returns: %TRUE if website data was succesfully cleared, or %FALSE otherwise.
+ *
+ * Since: 2.16
+ */
+gboolean webkit_website_data_manager_clear_finish(WebKitWebsiteDataManager* manager, GAsyncResult* result, GError** error)
+{
+ g_return_val_if_fail(WEBKIT_IS_WEBSITE_DATA_MANAGER(manager), FALSE);
+ g_return_val_if_fail(g_task_is_valid(result, manager), FALSE);
+
+ return g_task_propagate_boolean(G_TASK(result), error);
+}