summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp')
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp122
1 files changed, 57 insertions, 65 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp
index d50533b91..af274b97d 100644
--- a/Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp
+++ b/Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp
@@ -35,6 +35,26 @@
using namespace WebKit;
+/**
+ * SECTION: WebKitFaviconDatabase
+ * @Short_description: A WebKit favicon database
+ * @Title: WebKitFaviconDatabase
+ *
+ * #WebKitFaviconDatabase provides access to the icons associated with
+ * web sites.
+ *
+ * WebKit will automatically look for available icons in <link>
+ * elements on opened pages as well as an existing favicon.ico and
+ * load the images found into a memory cache if possible. That cache
+ * is frozen to an on-disk database for persistence.
+ *
+ * If #WebKitSettings:enable-private-browsing is %TRUE, new icons
+ * won't be added to the on-disk database and no existing icons will
+ * be deleted from it. Nevertheless, WebKit will still store them in
+ * the in-memory cache during the current execution.
+ *
+ */
+
enum {
FAVICON_CHANGED,
@@ -43,7 +63,7 @@ enum {
static guint signals[LAST_SIGNAL] = { 0, };
-typedef Vector<GRefPtr<GSimpleAsyncResult> > PendingIconRequestVector;
+typedef Vector<GRefPtr<GTask> > PendingIconRequestVector;
typedef HashMap<String, PendingIconRequestVector*> PendingIconRequestMap;
struct _WebKitFaviconDatabasePrivate {
@@ -110,7 +130,7 @@ struct GetFaviconSurfaceAsyncData {
};
WEBKIT_DEFINE_ASYNC_DATA_STRUCT(GetFaviconSurfaceAsyncData)
-static cairo_surface_t* getIconSurfaceSynchronously(WebKitFaviconDatabase* database, const String& pageURL, GError** error)
+static PassRefPtr<cairo_surface_t> getIconSurfaceSynchronously(WebKitFaviconDatabase* database, const String& pageURL, GError** error)
{
ASSERT(isMainThread());
@@ -122,13 +142,13 @@ static cairo_surface_t* getIconSurfaceSynchronously(WebKitFaviconDatabase* datab
return 0;
}
- WebCore::NativeImagePtr icon = iconImage->nativeImageForCurrentFrame();
- if (!icon) {
+ RefPtr<cairo_surface_t> surface = iconImage->nativeImageForCurrentFrame();
+ if (!surface) {
g_set_error(error, WEBKIT_FAVICON_DATABASE_ERROR, WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_NOT_FOUND, _("Page %s does not have a favicon"), pageURL.utf8().data());
return 0;
}
- return icon->surface();
+ return surface.release();
}
static void deletePendingIconRequests(WebKitFaviconDatabase* database, PendingIconRequestVector* requests, const String& pageURL)
@@ -147,18 +167,15 @@ static void processPendingIconsForPageURL(WebKitFaviconDatabase* database, const
RefPtr<cairo_surface_t> icon = getIconSurfaceSynchronously(database, pageURL, &error.outPtr());
for (size_t i = 0; i < pendingIconRequests->size(); ++i) {
- GSimpleAsyncResult* result = pendingIconRequests->at(i).get();
- GetFaviconSurfaceAsyncData* data = static_cast<GetFaviconSurfaceAsyncData*>(g_simple_async_result_get_op_res_gpointer(result));
- if (!g_cancellable_is_cancelled(data->cancellable.get())) {
- if (error)
- g_simple_async_result_take_error(result, error.release());
- else {
- data->icon = icon;
- data->shouldReleaseIconForPageURL = false;
- }
+ GTask* task = pendingIconRequests->at(i).get();
+ if (error)
+ g_task_return_error(task, error.release());
+ else {
+ GetFaviconSurfaceAsyncData* data = static_cast<GetFaviconSurfaceAsyncData*>(g_task_get_task_data(task));
+ data->icon = icon;
+ data->shouldReleaseIconForPageURL = false;
+ g_task_return_boolean(task, TRUE);
}
-
- g_simple_async_result_complete(result);
}
deletePendingIconRequests(database, pendingIconRequests, pageURL);
}
@@ -218,28 +235,6 @@ static PendingIconRequestVector* getOrCreatePendingIconRequests(WebKitFaviconDat
return icons;
}
-static void setErrorForAsyncResult(GSimpleAsyncResult* result, WebKitFaviconDatabaseError error, const String& pageURL = String())
-{
- ASSERT(result);
-
- switch (error) {
- case WEBKIT_FAVICON_DATABASE_ERROR_NOT_INITIALIZED:
- g_simple_async_result_set_error(result, WEBKIT_FAVICON_DATABASE_ERROR, error, _("Favicons database not initialized yet"));
- break;
-
- case WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_NOT_FOUND:
- g_simple_async_result_set_error(result, WEBKIT_FAVICON_DATABASE_ERROR, error, _("Page %s does not have a favicon"), pageURL.utf8().data());
- break;
-
- case WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_UNKNOWN:
- g_simple_async_result_set_error(result, WEBKIT_FAVICON_DATABASE_ERROR, error, _("Unknown favicon for page %s"), pageURL.utf8().data());
- break;
-
- default:
- ASSERT_NOT_REACHED();
- }
-}
-
GQuark webkit_favicon_database_error_quark(void)
{
return g_quark_from_static_string("WebKitFaviconDatabaseError");
@@ -267,29 +262,27 @@ void webkit_favicon_database_get_favicon(WebKitFaviconDatabase* database, const
g_return_if_fail(WEBKIT_IS_FAVICON_DATABASE(database));
g_return_if_fail(pageURI);
- GRefPtr<GSimpleAsyncResult> result = adoptGRef(g_simple_async_result_new(G_OBJECT(database), callback, userData, reinterpret_cast<gpointer>(webkit_favicon_database_get_favicon)));
- g_simple_async_result_set_check_cancellable(result.get(), cancellable);
-
- GetFaviconSurfaceAsyncData* data = createGetFaviconSurfaceAsyncData();
- g_simple_async_result_set_op_res_gpointer(result.get(), data, reinterpret_cast<GDestroyNotify>(destroyGetFaviconSurfaceAsyncData));
- data->faviconDatabase = database;
- data->pageURL = String::fromUTF8(pageURI);
- data->cancellable = cancellable;
-
WebKitFaviconDatabasePrivate* priv = database->priv;
WebIconDatabase* iconDatabaseImpl = priv->iconDatabase.get();
if (!iconDatabaseImpl->isOpen()) {
- setErrorForAsyncResult(result.get(), WEBKIT_FAVICON_DATABASE_ERROR_NOT_INITIALIZED);
- g_simple_async_result_complete_in_idle(result.get());
+ g_task_report_new_error(database, callback, userData, 0,
+ WEBKIT_FAVICON_DATABASE_ERROR, WEBKIT_FAVICON_DATABASE_ERROR_NOT_INITIALIZED, _("Favicons database not initialized yet"));
return;
}
- if (data->pageURL.isEmpty() || data->pageURL.startsWith("about:")) {
- setErrorForAsyncResult(result.get(), WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_NOT_FOUND, data->pageURL);
- g_simple_async_result_complete_in_idle(result.get());
+ if (g_str_has_prefix(pageURI, "about:")) {
+ g_task_report_new_error(database, callback, userData, 0,
+ WEBKIT_FAVICON_DATABASE_ERROR, WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_NOT_FOUND, _("Page %s does not have a favicon"), pageURI);
return;
}
+ GRefPtr<GTask> task = adoptGRef(g_task_new(database, cancellable, callback, userData));
+
+ GetFaviconSurfaceAsyncData* data = createGetFaviconSurfaceAsyncData();
+ data->faviconDatabase = database;
+ data->pageURL = String::fromUTF8(pageURI);
+ g_task_set_task_data(task.get(), data, reinterpret_cast<GDestroyNotify>(destroyGetFaviconSurfaceAsyncData));
+
priv->iconDatabase->retainIconForPageURL(data->pageURL);
// We ask for the icon directly. If we don't get the icon data now,
@@ -297,7 +290,7 @@ void webkit_favicon_database_get_favicon(WebKitFaviconDatabase* database, const
GOwnPtr<GError> error;
data->icon = getIconSurfaceSynchronously(database, data->pageURL, &error.outPtr());
if (data->icon) {
- g_simple_async_result_complete_in_idle(result.get());
+ g_task_return_boolean(task.get(), TRUE);
return;
}
@@ -305,8 +298,7 @@ void webkit_favicon_database_get_favicon(WebKitFaviconDatabase* database, const
data->shouldReleaseIconForPageURL = true;
if (g_error_matches(error.get(), WEBKIT_FAVICON_DATABASE_ERROR, WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_NOT_FOUND)) {
- g_simple_async_result_take_error(result.get(), error.release());
- g_simple_async_result_complete_in_idle(result.get());
+ g_task_return_error(task.get(), error.release());
return;
}
@@ -317,14 +309,14 @@ void webkit_favicon_database_get_favicon(WebKitFaviconDatabase* database, const
String iconURLForPageURL;
iconDatabaseImpl->synchronousIconURLForPageURL(data->pageURL, iconURLForPageURL);
if (!iconURLForPageURL.isEmpty() || !iconDatabaseImpl->isUrlImportCompleted()) {
- PendingIconRequestVector* icons = getOrCreatePendingIconRequests(database, data->pageURL);
- ASSERT(icons);
- icons->append(result);
+ PendingIconRequestVector* iconRequests = getOrCreatePendingIconRequests(database, data->pageURL);
+ ASSERT(iconRequests);
+ iconRequests->append(task);
return;
}
- setErrorForAsyncResult(result.get(), WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_UNKNOWN, data->pageURL);
- g_simple_async_result_complete_in_idle(result.get());
+ g_task_return_new_error(task.get(), WEBKIT_FAVICON_DATABASE_ERROR, WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_UNKNOWN,
+ _("Unknown favicon for page %s"), pageURI);
}
/**
@@ -340,14 +332,14 @@ void webkit_favicon_database_get_favicon(WebKitFaviconDatabase* database, const
*/
cairo_surface_t* webkit_favicon_database_get_favicon_finish(WebKitFaviconDatabase* database, GAsyncResult* result, GError** error)
{
- GSimpleAsyncResult* simpleResult = G_SIMPLE_ASYNC_RESULT(result);
- g_warn_if_fail(g_simple_async_result_get_source_tag(simpleResult) == webkit_favicon_database_get_favicon);
+ g_return_val_if_fail(WEBKIT_IS_FAVICON_DATABASE(database), 0);
+ g_return_val_if_fail(g_task_is_valid(result, database), 0);
- if (g_simple_async_result_propagate_error(simpleResult, error))
+ GTask* task = G_TASK(result);
+ if (!g_task_propagate_boolean(task, error))
return 0;
- GetFaviconSurfaceAsyncData* data = static_cast<GetFaviconSurfaceAsyncData*>(g_simple_async_result_get_op_res_gpointer(simpleResult));
- ASSERT(data);
+ GetFaviconSurfaceAsyncData* data = static_cast<GetFaviconSurfaceAsyncData*>(g_task_get_task_data(task));
return cairo_surface_reference(data->icon.get());
}