diff options
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp')
-rw-r--r-- | Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp | 122 |
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()); } |