summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-10-16 14:56:46 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2012-10-16 14:57:30 +0200
commitb297e0fa5c217c9467033b7c8b46891a52870120 (patch)
tree43fc14689295e9e64f2719d05aad94e3049f6cd7 /Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp
parent69d517dbfa69903d8593cc1737f0474b21e3251e (diff)
downloadqtwebkit-b297e0fa5c217c9467033b7c8b46891a52870120.tar.gz
Revert "Imported WebKit commit 0dc6cd75e1d4836eaffbb520be96fac4847cc9d2 (http://svn.webkit.org/repository/webkit/trunk@131300)"
This reverts commit 5466563f4b5b6b86523e3f89bb7f77e5b5270c78. Caused OOM issues on some CI machines :(
Diffstat (limited to 'Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp')
-rw-r--r--Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp391
1 files changed, 0 insertions, 391 deletions
diff --git a/Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp b/Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp
deleted file mode 100644
index cb016ab09..000000000
--- a/Source/WebKit2/UIProcess/API/gtk/WebKitFaviconDatabase.cpp
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Copyright (C) 2012 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 "WebKitFaviconDatabase.h"
-
-#include "WebKitFaviconDatabasePrivate.h"
-#include "WebKitPrivate.h"
-#include <WebCore/FileSystem.h>
-#include <WebCore/Image.h>
-#include <WebCore/IntSize.h>
-#include <WebCore/RefPtrCairo.h>
-#include <glib/gi18n-lib.h>
-#include <wtf/MainThread.h>
-#include <wtf/gobject/GOwnPtr.h>
-#include <wtf/gobject/GRefPtr.h>
-#include <wtf/text/CString.h>
-
-using namespace WebKit;
-
-enum {
- ICON_READY,
-
- LAST_SIGNAL
-};
-
-static guint signals[LAST_SIGNAL] = { 0, };
-
-typedef Vector<GRefPtr<GSimpleAsyncResult> > PendingIconRequestVector;
-typedef HashMap<String, PendingIconRequestVector*> PendingIconRequestMap;
-
-struct _WebKitFaviconDatabasePrivate {
- RefPtr<WebIconDatabase> iconDatabase;
- PendingIconRequestMap pendingIconRequests;
-};
-
-G_DEFINE_TYPE(WebKitFaviconDatabase, webkit_favicon_database, G_TYPE_OBJECT)
-
-static void webkit_favicon_database_init(WebKitFaviconDatabase* manager)
-{
- WebKitFaviconDatabasePrivate* priv = G_TYPE_INSTANCE_GET_PRIVATE(manager, WEBKIT_TYPE_FAVICON_DATABASE, WebKitFaviconDatabasePrivate);
- manager->priv = priv;
- new (priv) WebKitFaviconDatabasePrivate();
-}
-
-static void webkitFaviconDatabaseDispose(GObject* object)
-{
- WebKitFaviconDatabase* database = WEBKIT_FAVICON_DATABASE(object);
-
- WebKitFaviconDatabasePrivate* priv = database->priv;
- if (priv->iconDatabase->isOpen())
- priv->iconDatabase->close();
-
- G_OBJECT_CLASS(webkit_favicon_database_parent_class)->dispose(object);
-}
-
-static void webkitFaviconDatabaseFinalize(GObject* object)
-{
- WebKitFaviconDatabase* database = WEBKIT_FAVICON_DATABASE(object);
- database->priv->~WebKitFaviconDatabasePrivate();
- G_OBJECT_CLASS(webkit_favicon_database_parent_class)->finalize(object);
-}
-
-static void webkit_favicon_database_class_init(WebKitFaviconDatabaseClass* faviconDatabaseClass)
-{
- GObjectClass* gObjectClass = G_OBJECT_CLASS(faviconDatabaseClass);
- gObjectClass->dispose = webkitFaviconDatabaseDispose;
- gObjectClass->finalize = webkitFaviconDatabaseFinalize;
-
- /**
- * WebKitFaviconDatabase::favicon-ready:
- * @database: the object on which the signal is emitted
- * @page_uri: the URI of the Web page containing the icon.
- *
- * This signal gets emitted when the favicon of @page_uri is
- * ready. This means that the favicon's data is ready to be used
- * by the application, either because it has been loaded from the
- * network, if it's the first time it gets retrieved, or because
- * it has been already imported from the icon database.
- */
- signals[ICON_READY] =
- g_signal_new("favicon-ready",
- G_TYPE_FROM_CLASS(faviconDatabaseClass),
- G_SIGNAL_RUN_LAST,
- 0, 0, 0,
- g_cclosure_marshal_VOID__STRING,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
-
- g_type_class_add_private(faviconDatabaseClass, sizeof(WebKitFaviconDatabasePrivate));
-}
-
-struct GetFaviconSurfaceAsyncData {
- GRefPtr<WebKitFaviconDatabase> faviconDatabase;
- String pageURL;
- RefPtr<cairo_surface_t> icon;
- GOwnPtr<GError> error;
- GRefPtr<GCancellable> cancellable;
-};
-WEBKIT_DEFINE_ASYNC_DATA_STRUCT(GetFaviconSurfaceAsyncData)
-
-static cairo_surface_t* getIconSurfaceSynchronously(WebKitFaviconDatabase* database, const String& pageURL, GError** error)
-{
- ASSERT(isMainThread());
-
- database->priv->iconDatabase->retainIconForPageURL(pageURL);
-
- // The exact size we pass is irrelevant to the iconDatabase code.
- // We must pass something greater than 0x0 to get an icon.
- WebCore::Image* iconImage = database->priv->iconDatabase->imageForPageURL(pageURL, WebCore::IntSize(1, 1));
- if (!iconImage) {
- g_set_error(error, WEBKIT_FAVICON_DATABASE_ERROR, WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_UNKNOWN, _("Unknown favicon for page %s"), pageURL.utf8().data());
- database->priv->iconDatabase->releaseIconForPageURL(pageURL);
- return 0;
- }
-
- WebCore::NativeImagePtr icon = iconImage->nativeImageForCurrentFrame();
- if (!icon) {
- 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());
- database->priv->iconDatabase->releaseIconForPageURL(pageURL);
- return 0;
- }
-
- return icon->surface();
-}
-
-static void deletePendingIconRequests(WebKitFaviconDatabase* database, PendingIconRequestVector* requests, const String& pageURL)
-{
- database->priv->pendingIconRequests.remove(pageURL);
- delete requests;
-}
-
-static void processPendingIconsForPageURL(WebKitFaviconDatabase* database, const String& pageURL)
-{
- PendingIconRequestVector* pendingIconRequests = database->priv->pendingIconRequests.get(pageURL);
- if (!pendingIconRequests)
- return;
-
- GOwnPtr<GError> error;
- 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_propagate_error(&data->error.outPtr(), error.release());
- else
- data->icon = icon;
- }
-
- g_simple_async_result_complete(result);
- }
- deletePendingIconRequests(database, pendingIconRequests, pageURL);
-}
-
-static void iconDataReadyForPageURLCallback(WKIconDatabaseRef wkIconDatabase, WKURLRef wkPageURL, const void* clientInfo)
-{
- ASSERT(isMainThread());
-
- WebKitFaviconDatabase* database = WEBKIT_FAVICON_DATABASE(clientInfo);
- String pageURL = toImpl(wkPageURL)->string();
-
- processPendingIconsForPageURL(database, pageURL);
- g_signal_emit(database, signals[ICON_READY], 0, pageURL.utf8().data());
-}
-
-WebKitFaviconDatabase* webkitFaviconDatabaseCreate(WebIconDatabase* iconDatabase)
-{
- WebKitFaviconDatabase* faviconDatabase = WEBKIT_FAVICON_DATABASE(g_object_new(WEBKIT_TYPE_FAVICON_DATABASE, NULL));
- faviconDatabase->priv->iconDatabase = iconDatabase;
-
- WKIconDatabaseClient wkIconDatabaseClient = {
- kWKIconDatabaseClientCurrentVersion,
- faviconDatabase, // clientInfo
- 0, // didChangeIconForPageURLCallback
- 0, // didRemoveAllIconsCallback
- iconDataReadyForPageURLCallback,
- };
- WKIconDatabaseSetIconDatabaseClient(toAPI(iconDatabase), &wkIconDatabaseClient);
- return faviconDatabase;
-}
-
-cairo_surface_t* webkitFaviconDatabaseGetFavicon(WebKitFaviconDatabase* database, const CString& pageURL)
-{
- ASSERT(WEBKIT_IS_FAVICON_DATABASE(database));
- ASSERT(!pageURL.isNull());
-
- cairo_surface_t* iconSurface = getIconSurfaceSynchronously(database, String::fromUTF8(pageURL.data()), 0);
- if (!iconSurface)
- return 0;
-
- return cairo_surface_reference(iconSurface);
-}
-
-static PendingIconRequestVector* getOrCreatePendingIconRequests(WebKitFaviconDatabase* database, const String& pageURL)
-{
- PendingIconRequestVector* icons = database->priv->pendingIconRequests.get(pageURL);
- if (!icons) {
- icons = new PendingIconRequestVector;
- database->priv->pendingIconRequests.set(pageURL, icons);
- }
-
- 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");
-}
-
-/**
- * webkit_favicon_database_get_favicon:
- * @database: a #WebKitFaviconDatabase
- * @page_uri: URI of the page for which we want to retrieve the favicon
- * @cancellable: (allow-none): A #GCancellable or %NULL.
- * @callback: (scope async): A #GAsyncReadyCallback to call when the request is
- * satisfied or %NULL if you don't care about the result.
- * @user_data: (closure): The data to pass to @callback.
- *
- * Asynchronously obtains a #cairo_surface_t of the favicon for the
- * given page URI. It returns the cached icon if it's in the database
- * asynchronously waiting for the icon to be read from the database.
- *
- * This is an asynchronous method. When the operation is finished, callback will
- * be invoked. You can then call webkit_favicon_database_get_favicon_finish()
- * to get the result of the operation.
- */
-void webkit_favicon_database_get_favicon(WebKitFaviconDatabase* database, const gchar* pageURI, GCancellable* cancellable, GAsyncReadyCallback callback, gpointer userData)
-{
- 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());
- 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());
- return;
- }
-
- // We ask for the icon directly. If we don't get the icon data now,
- // we'll be notified later (even if the database is still importing icons).
- GOwnPtr<GError> error;
- data->icon = getIconSurfaceSynchronously(database, data->pageURL, &error.outPtr());
- if (data->icon) {
- g_simple_async_result_complete_in_idle(result.get());
- return;
- }
-
- 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());
- return;
- }
-
- // If there's not a valid icon, but there's an iconURL registered,
- // or it's still not registered but the import process hasn't
- // finished yet, we need to wait for iconDataReadyForPage to be
- // called before making and informed decision.
- String iconURLForPageURL;
- iconDatabaseImpl->synchronousIconURLForPageURL(data->pageURL, iconURLForPageURL);
- if (!iconURLForPageURL.isEmpty() || !iconDatabaseImpl->isUrlImportCompleted()) {
- PendingIconRequestVector* icons = getOrCreatePendingIconRequests(database, data->pageURL);
- ASSERT(icons);
- icons->append(result);
- return;
- }
-
- setErrorForAsyncResult(result.get(), WEBKIT_FAVICON_DATABASE_ERROR_FAVICON_UNKNOWN, data->pageURL);
- g_simple_async_result_complete_in_idle(result.get());
-}
-
-/**
- * webkit_favicon_database_get_favicon_finish:
- * @database: a #WebKitFaviconDatabase
- * @result: A #GAsyncResult obtained from the #GAsyncReadyCallback passed to webkit_favicon_database_get_favicon()
- * @error: (allow-none): Return location for error or %NULL.
- *
- * Finishes an operation started with webkit_favicon_database_get_favicon().
- *
- * Returns: (transfer full): a new reference to a #cairo_surface_t, or
- * %NULL in case of error.
- */
-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);
-
- if (g_simple_async_result_propagate_error(simpleResult, error))
- return 0;
-
- GetFaviconSurfaceAsyncData* data = static_cast<GetFaviconSurfaceAsyncData*>(g_simple_async_result_get_op_res_gpointer(simpleResult));
- ASSERT(data);
- if (data->error) {
- g_propagate_error(error, data->error.release());
- return 0;
- }
-
- return cairo_surface_reference(data->icon.get());
-}
-
-/**
- * webkit_favicon_database_get_favicon_uri:
- * @database: a #WebKitFaviconDatabase
- * @page_uri: URI of the page containing the icon
- *
- * Obtains the URI of the favicon for the given @page_uri.
- *
- * Returns: a newly allocated URI for the favicon, or %NULL if the
- * database doesn't have a favicon for @page_uri.
- */
-gchar* webkit_favicon_database_get_favicon_uri(WebKitFaviconDatabase* database, const gchar* pageURL)
-{
- g_return_val_if_fail(WEBKIT_IS_FAVICON_DATABASE(database), 0);
- g_return_val_if_fail(pageURL, 0);
- ASSERT(isMainThread());
-
- String iconURLForPageURL;
- database->priv->iconDatabase->synchronousIconURLForPageURL(String::fromUTF8(pageURL), iconURLForPageURL);
- if (iconURLForPageURL.isEmpty())
- return 0;
-
- return g_strdup(iconURLForPageURL.utf8().data());
-}
-
-/**
- * webkit_favicon_database_clear:
- * @database: a #WebKitFaviconDatabase
- *
- * Clears all icons from the database.
- */
-void webkit_favicon_database_clear(WebKitFaviconDatabase* database)
-{
- g_return_if_fail(WEBKIT_IS_FAVICON_DATABASE(database));
-
- database->priv->iconDatabase->removeAllIcons();
-}