summaryrefslogtreecommitdiffstats
path: root/Source/WebKit/gtk/webkit/webkiticondatabase.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit/gtk/webkit/webkiticondatabase.cpp')
-rw-r--r--Source/WebKit/gtk/webkit/webkiticondatabase.cpp317
1 files changed, 317 insertions, 0 deletions
diff --git a/Source/WebKit/gtk/webkit/webkiticondatabase.cpp b/Source/WebKit/gtk/webkit/webkiticondatabase.cpp
new file mode 100644
index 0000000..397bd51
--- /dev/null
+++ b/Source/WebKit/gtk/webkit/webkiticondatabase.cpp
@@ -0,0 +1,317 @@
+/*
+ * Copyright (C) 2011 Christian Dywan <christian@lanedo.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 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 "webkiticondatabase.h"
+
+#include "DatabaseDetails.h"
+#include "DatabaseTracker.h"
+#include "FileSystem.h"
+#include "IconDatabase.h"
+#include "Image.h"
+#include "IntSize.h"
+#include "webkitglobalsprivate.h"
+#include "webkitmarshal.h"
+#include "webkitsecurityoriginprivate.h"
+#include "webkitwebframe.h"
+#include <glib/gi18n-lib.h>
+#include <wtf/gobject/GOwnPtr.h>
+#include <wtf/text/CString.h>
+
+/**
+ * SECTION:webkitwebdatabase
+ * @short_description: A WebKit web application database
+ *
+ * #WebKitIconDatabase provides access to website icons, as shown
+ * in tab labels, window captions or bookmarks. All views share
+ * the same icon database.
+ *
+ * The icon database is enabled by default and stored in
+ * ~/.local/share/webkit/icondatabase, depending on XDG_DATA_HOME.
+ *
+ * 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 the memory cache if possible. The signal "icon-loaded"
+ * will be emitted when any icon is found and loaded.
+ * Old Icons are automatically cleaned up after 4 days.
+ *
+ * webkit_icon_database_set_path() can be used to change the location
+ * of the database and also to disable it by passing %NULL.
+ *
+ * If WebKitWebSettings::enable-private-browsing is %TRUE new icons
+ * won't be added to the database on disk and no existing icons will
+ * be deleted from it.
+ *
+ * Since: 1.3.13
+ */
+
+using namespace WebKit;
+
+enum {
+ PROP_0,
+
+ PROP_PATH,
+};
+
+enum {
+ ICON_LOADED,
+
+ LAST_SIGNAL
+};
+
+static guint webkit_icon_database_signals[LAST_SIGNAL] = { 0, };
+
+G_DEFINE_TYPE(WebKitIconDatabase, webkit_icon_database, G_TYPE_OBJECT);
+
+struct _WebKitIconDatabasePrivate {
+ GOwnPtr<gchar> path;
+};
+
+static void webkit_icon_database_finalize(GObject* object)
+{
+ // Call C++ destructors, the reverse of 'placement new syntax'
+ WEBKIT_ICON_DATABASE(object)->priv->~WebKitIconDatabasePrivate();
+
+ G_OBJECT_CLASS(webkit_icon_database_parent_class)->finalize(object);
+}
+
+static void webkit_icon_database_dispose(GObject* object)
+{
+ G_OBJECT_CLASS(webkit_icon_database_parent_class)->dispose(object);
+}
+
+static void webkit_icon_database_set_property(GObject* object, guint propId, const GValue* value, GParamSpec* pspec)
+{
+ WebKitIconDatabase* database = WEBKIT_ICON_DATABASE(object);
+
+ switch (propId) {
+ case PROP_PATH:
+ webkit_icon_database_set_path(database, g_value_get_string(value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, pspec);
+ break;
+ }
+}
+
+static void webkit_icon_database_get_property(GObject* object, guint propId, GValue* value, GParamSpec* pspec)
+{
+ WebKitIconDatabase* database = WEBKIT_ICON_DATABASE(object);
+
+ switch (propId) {
+ case PROP_PATH:
+ g_value_set_string(value, webkit_icon_database_get_path(database));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, pspec);
+ break;
+ }
+}
+
+static void webkit_icon_database_class_init(WebKitIconDatabaseClass* klass)
+{
+ webkitInit();
+
+ GObjectClass* gobjectClass = G_OBJECT_CLASS(klass);
+ gobjectClass->dispose = webkit_icon_database_dispose;
+ gobjectClass->finalize = webkit_icon_database_finalize;
+ gobjectClass->set_property = webkit_icon_database_set_property;
+ gobjectClass->get_property = webkit_icon_database_get_property;
+
+ /**
+ * WebKitIconDatabase:path:
+ *
+ * The absolute path of the icon database folder.
+ *
+ * Since: 1.3.13
+ */
+ g_object_class_install_property(gobjectClass, PROP_PATH,
+ g_param_spec_string("path",
+ _("Path"),
+ _("The absolute path of the icon database folder"),
+ NULL,
+ WEBKIT_PARAM_READWRITE));
+
+ /**
+ * WebKitIconDatabase::icon-loaded:
+ * @database: the object on which the signal is emitted
+ * @frame: the frame containing the icon
+ * @frame_uri: the URI of the frame containing the icon
+ *
+ * This signal is emitted when a favicon is available for a page,
+ * or a child frame.
+ * See WebKitWebView::icon-loaded if you only need the favicon for
+ * the main frame of a particular #WebKitWebView.
+ *
+ * Since: 1.3.13
+ */
+ webkit_icon_database_signals[ICON_LOADED] = g_signal_new("icon-loaded",
+ G_TYPE_FROM_CLASS(klass),
+ (GSignalFlags)G_SIGNAL_RUN_LAST,
+ 0,
+ NULL,
+ NULL,
+ webkit_marshal_VOID__OBJECT_STRING,
+ G_TYPE_NONE, 2,
+ WEBKIT_TYPE_WEB_FRAME,
+ G_TYPE_STRING);
+
+ g_type_class_add_private(klass, sizeof(WebKitIconDatabasePrivate));
+}
+
+static void webkit_icon_database_init(WebKitIconDatabase* database)
+{
+ database->priv = G_TYPE_INSTANCE_GET_PRIVATE(database, WEBKIT_TYPE_ICON_DATABASE, WebKitIconDatabasePrivate);
+ // 'placement new syntax', see webkitwebview.cpp
+ new (database->priv) WebKitIconDatabasePrivate();
+}
+
+/**
+ * webkit_icon_database_get_path:
+ * @database: a #WebKitIconDatabase
+ *
+ * Determines the absolute path to the database folder on disk.
+ *
+ * Returns: the absolute path of the database folder, or %NULL
+ *
+ * Since: 1.3.13
+ **/
+G_CONST_RETURN gchar* webkit_icon_database_get_path(WebKitIconDatabase* database)
+{
+ g_return_val_if_fail(WEBKIT_IS_ICON_DATABASE(database), 0);
+
+ return database->priv->path.get();
+}
+
+static void closeIconDatabaseOnExit()
+{
+ if (WebCore::iconDatabase().isEnabled()) {
+ WebCore::iconDatabase().setEnabled(false);
+ WebCore::iconDatabase().close();
+ }
+}
+
+/**
+ * webkit_icon_database_set_path:
+ * @database: a #WebKitIconDatabase
+ * @path: an absolute path to the icon database folder
+ *
+ * Specifies the absolute path to the database folder on disk.
+ *
+ * Passing %NULL or "" disables the icon database.
+ *
+ * Since: 1.3.13
+ **/
+void webkit_icon_database_set_path(WebKitIconDatabase* database, const gchar* path)
+{
+ g_return_if_fail(WEBKIT_IS_ICON_DATABASE(database));
+
+ if (database->priv->path.get())
+ WebCore::iconDatabase().close();
+
+ if (!(path && path[0])) {
+ database->priv->path.set(0);
+ WebCore::iconDatabase().setEnabled(false);
+ return;
+ }
+
+ database->priv->path.set(g_strdup(path));
+
+ WebCore::iconDatabase().setEnabled(true);
+ WebCore::iconDatabase().open(WebCore::filenameToString(database->priv->path.get()), WebCore::IconDatabase::defaultDatabaseFilename());
+
+ static bool initialized = false;
+ if (!initialized) {
+ atexit(closeIconDatabaseOnExit);
+ initialized = true;
+ }
+}
+
+/**
+ * webkit_icon_database_get_icon_uri:
+ * @database: a #WebKitIconDatabase
+ * @page_uri: URI of the page containing the icon
+ *
+ * Obtains the URI for the favicon for the given page URI.
+ * See also webkit_web_view_get_icon_uri().
+ *
+ * Returns: a newly allocated URI for the favicon, or %NULL
+ *
+ * Since: 1.3.13
+ **/
+gchar* webkit_icon_database_get_icon_uri(WebKitIconDatabase* database, const gchar* pageURI)
+{
+ g_return_val_if_fail(WEBKIT_IS_ICON_DATABASE(database), 0);
+ g_return_val_if_fail(pageURI, 0);
+
+ String pageURL = String::fromUTF8(pageURI);
+ return g_strdup(WebCore::iconDatabase().synchronousIconURLForPageURL(pageURL).utf8().data());
+}
+
+/**
+ * webkit_icon_database_get_icon_pixbuf:
+ * @database: a #WebKitIconDatabase
+ * @page_uri: URI of the page containing the icon
+ *
+ * Obtains a #GdkPixbuf of the favicon for the given page URI, or
+ * a default icon if there is no icon for the given page. Use
+ * webkit_icon_database_get_icon_uri() if you need to distinguish these cases.
+ * Usually you want to connect to WebKitIconDatabase::icon-loaded and call this
+ * method in the callback.
+ *
+ * The pixbuf will have the largest size provided by the server and should
+ * be resized before it is displayed.
+ * See also webkit_web_view_get_icon_pixbuf().
+ *
+ * Returns: (transfer full): a new reference to a #GdkPixbuf, or %NULL
+ *
+ * Since: 1.3.13
+ **/
+GdkPixbuf* webkit_icon_database_get_icon_pixbuf(WebKitIconDatabase* database, const gchar* pageURI)
+{
+ g_return_val_if_fail(WEBKIT_IS_ICON_DATABASE(database), 0);
+ g_return_val_if_fail(pageURI, 0);
+
+ String pageURL = String::fromUTF8(pageURI);
+ // The exact size we pass is irrelevant to the WebCore::iconDatabase code.
+ // We must pass something greater than 0, 0 to get a pixbuf.
+ WebCore::Image* icon = WebCore::iconDatabase().synchronousIconForPageURL(pageURL, WebCore::IntSize(16, 16));
+ if (!icon)
+ return 0;
+ GdkPixbuf* pixbuf = icon->getGdkPixbuf();
+ if (!pixbuf)
+ return 0;
+ return static_cast<GdkPixbuf*>(g_object_ref(pixbuf));
+}
+
+/**
+ * webkit_icon_database_clear():
+ * @database: a #WebKitIconDatabase
+ *
+ * Clears all icons from the database.
+ *
+ * Since: 1.3.13
+ **/
+void webkit_icon_database_clear(WebKitIconDatabase* database)
+{
+ g_return_if_fail(WEBKIT_IS_ICON_DATABASE(database));
+
+ WebCore::iconDatabase().removeAllIcons();
+}
+