diff options
author | Ben Murdoch <benm@google.com> | 2011-05-13 16:23:25 +0100 |
---|---|---|
committer | Ben Murdoch <benm@google.com> | 2011-05-16 11:35:02 +0100 |
commit | 65f03d4f644ce73618e5f4f50dd694b26f55ae12 (patch) | |
tree | f478babb801e720de7bfaee23443ffe029f58731 /Source/WebKit/gtk/webkit/webkitwebhistoryitem.cpp | |
parent | 47de4a2fb7262c7ebdb9cd133ad2c54c187454d0 (diff) | |
download | external_webkit-65f03d4f644ce73618e5f4f50dd694b26f55ae12.zip external_webkit-65f03d4f644ce73618e5f4f50dd694b26f55ae12.tar.gz external_webkit-65f03d4f644ce73618e5f4f50dd694b26f55ae12.tar.bz2 |
Merge WebKit at r75993: Initial merge by git.
Change-Id: I602bbdc3974787a3b0450456a30a7868286921c3
Diffstat (limited to 'Source/WebKit/gtk/webkit/webkitwebhistoryitem.cpp')
-rw-r--r-- | Source/WebKit/gtk/webkit/webkitwebhistoryitem.cpp | 529 |
1 files changed, 529 insertions, 0 deletions
diff --git a/Source/WebKit/gtk/webkit/webkitwebhistoryitem.cpp b/Source/WebKit/gtk/webkit/webkitwebhistoryitem.cpp new file mode 100644 index 0000000..eabdc49 --- /dev/null +++ b/Source/WebKit/gtk/webkit/webkitwebhistoryitem.cpp @@ -0,0 +1,529 @@ +/* + * Copyright (C) 2008, 2009 Jan Michael C. Alonzo + * Copyright (C) 2009 Igalia S.L. + * + * 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 "webkitwebhistoryitem.h" + +#include "HistoryItem.h" +#include "PlatformString.h" +#include "webkitglobalsprivate.h" +#include "webkitwebhistoryitemprivate.h" +#include <glib.h> +#include <glib/gi18n-lib.h> +#include <wtf/text/CString.h> + +/** + * SECTION:webkitwebhistoryitem + * @short_description: One item of the #WebKitWebBackForwardList and or global history + * @see_also: #WebKitWebBackForwardList + * + * A history item consists out of a title and a uri. It can be part of the + * #WebKitWebBackForwardList and the global history. The global history is used + * for coloring the links of visited sites. #WebKitWebHistoryItem's constructed with + * #webkit_web_history_item_new and #webkit_web_history_item_new_with_data are + * automatically added to the global history. + * + * <informalexample><programlisting> + * /<!-- -->* Inject a visited page into the global history *<!-- -->/ + * webkit_web_history_item_new_with_data("http://www.gnome.org/", "GNOME: The Free Software Desktop Project"); + * webkit_web_history_item_new_with_data("http://www.webkit.org/", "The WebKit Open Source Project"); + * </programlisting></informalexample> + * + */ + +using namespace WebKit; + +struct _WebKitWebHistoryItemPrivate { + WebCore::HistoryItem* historyItem; + + WTF::CString title; + WTF::CString alternateTitle; + WTF::CString uri; + WTF::CString originalUri; + + gboolean disposed; +}; + +enum { + PROP_0, + + PROP_TITLE, + PROP_ALTERNATE_TITLE, + PROP_URI, + PROP_ORIGINAL_URI, + PROP_LAST_VISITED_TIME +}; + +G_DEFINE_TYPE(WebKitWebHistoryItem, webkit_web_history_item, G_TYPE_OBJECT); + +static void webkit_web_history_item_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec); + +static void webkit_web_history_item_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec); + +GHashTable* webkit_history_items() +{ + static GHashTable* historyItems = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref); + return historyItems; +} + +void webkit_history_item_add(WebKitWebHistoryItem* webHistoryItem, WebCore::HistoryItem* historyItem) +{ + g_return_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem)); + + GHashTable* table = webkit_history_items(); + g_hash_table_insert(table, historyItem, webHistoryItem); +} + +static void webkit_web_history_item_dispose(GObject* object) +{ + WebKitWebHistoryItem* webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(object); + WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv; + + if (!priv->disposed) { + WebCore::HistoryItem* item = core(webHistoryItem); + item->deref(); + priv->disposed = true; + } + + G_OBJECT_CLASS(webkit_web_history_item_parent_class)->dispose(object); +} + +static void webkit_web_history_item_finalize(GObject* object) +{ + WebKitWebHistoryItem* webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(object); + WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv; + + priv->title = WTF::CString(); + priv->alternateTitle = WTF::CString(); + priv->uri = WTF::CString(); + priv->originalUri = WTF::CString(); + + G_OBJECT_CLASS(webkit_web_history_item_parent_class)->finalize(object); +} + +static void webkit_web_history_item_class_init(WebKitWebHistoryItemClass* klass) +{ + GObjectClass* gobject_class = G_OBJECT_CLASS(klass); + + gobject_class->dispose = webkit_web_history_item_dispose; + gobject_class->finalize = webkit_web_history_item_finalize; + gobject_class->set_property = webkit_web_history_item_set_property; + gobject_class->get_property = webkit_web_history_item_get_property; + + webkitInit(); + + /** + * WebKitWebHistoryItem:title: + * + * The title of the history item. + * + * Since: 1.0.2 + */ + g_object_class_install_property(gobject_class, + PROP_TITLE, + g_param_spec_string( + "title", + _("Title"), + _("The title of the history item"), + NULL, + WEBKIT_PARAM_READABLE)); + + /** + * WebKitWebHistoryItem:alternate-title: + * + * The alternate title of the history item. + * + * Since: 1.0.2 + */ + g_object_class_install_property(gobject_class, + PROP_ALTERNATE_TITLE, + g_param_spec_string( + "alternate-title", + _("Alternate Title"), + _("The alternate title of the history item"), + NULL, + WEBKIT_PARAM_READWRITE)); + + /** + * WebKitWebHistoryItem:uri: + * + * The URI of the history item. + * + * Since: 1.0.2 + */ + g_object_class_install_property(gobject_class, + PROP_URI, + g_param_spec_string( + "uri", + _("URI"), + _("The URI of the history item"), + NULL, + WEBKIT_PARAM_READABLE)); + + /** + * WebKitWebHistoryItem:original-uri: + * + * The original URI of the history item. + * + * Since: 1.0.2 + */ + g_object_class_install_property(gobject_class, + PROP_ORIGINAL_URI, + g_param_spec_string( + "original-uri", + _("Original URI"), + _("The original URI of the history item"), + NULL, + WEBKIT_PARAM_READABLE)); + + /** + * WebKitWebHistoryItem:last-visited-time: + * + * The time at which the history item was last visited. + * + * Since: 1.0.2 + */ + g_object_class_install_property(gobject_class, + PROP_LAST_VISITED_TIME, + g_param_spec_double( + "last-visited-time", + _("Last visited Time"), + _("The time at which the history item was last visited"), + 0, G_MAXDOUBLE, 0, + WEBKIT_PARAM_READABLE)); + + g_type_class_add_private(gobject_class, sizeof(WebKitWebHistoryItemPrivate)); +} + +static void webkit_web_history_item_init(WebKitWebHistoryItem* webHistoryItem) +{ + webHistoryItem->priv = G_TYPE_INSTANCE_GET_PRIVATE(webHistoryItem, WEBKIT_TYPE_WEB_HISTORY_ITEM, WebKitWebHistoryItemPrivate); +} + +static void webkit_web_history_item_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) +{ + WebKitWebHistoryItem* webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(object); + + switch(prop_id) { + case PROP_ALTERNATE_TITLE: + webkit_web_history_item_set_alternate_title(webHistoryItem, g_value_get_string(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void webkit_web_history_item_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec) +{ + WebKitWebHistoryItem* webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(object); + + switch (prop_id) { + case PROP_TITLE: + g_value_set_string(value, webkit_web_history_item_get_title(webHistoryItem)); + break; + case PROP_ALTERNATE_TITLE: + g_value_set_string(value, webkit_web_history_item_get_alternate_title(webHistoryItem)); + break; + case PROP_URI: + g_value_set_string(value, webkit_web_history_item_get_uri(webHistoryItem)); + break; + case PROP_ORIGINAL_URI: + g_value_set_string(value, webkit_web_history_item_get_original_uri(webHistoryItem)); + break; + case PROP_LAST_VISITED_TIME: + g_value_set_double(value, webkit_web_history_item_get_last_visited_time(webHistoryItem)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +/* Helper function to create a new WebHistoryItem instance when needed */ +WebKitWebHistoryItem* webkit_web_history_item_new_with_core_item(PassRefPtr<WebCore::HistoryItem> historyItem) +{ + return kit(historyItem); +} + + +/** + * webkit_web_history_item_new: + * + * Creates a new #WebKitWebHistoryItem instance + * + * Return value: the new #WebKitWebHistoryItem + */ +WebKitWebHistoryItem* webkit_web_history_item_new() +{ + WebKitWebHistoryItem* webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(g_object_new(WEBKIT_TYPE_WEB_HISTORY_ITEM, NULL)); + WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv; + + RefPtr<WebCore::HistoryItem> item = WebCore::HistoryItem::create(); + priv->historyItem = item.release().releaseRef(); + webkit_history_item_add(webHistoryItem, priv->historyItem); + + return webHistoryItem; +} + +/** + * webkit_web_history_item_new_with_data: + * @uri: the uri of the page + * @title: the title of the page + * + * Creates a new #WebKitWebHistoryItem with the given URI and title + * + * Return value: the new #WebKitWebHistoryItem + */ +WebKitWebHistoryItem* webkit_web_history_item_new_with_data(const gchar* uri, const gchar* title) +{ + WebKitWebHistoryItem* webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(g_object_new(WEBKIT_TYPE_WEB_HISTORY_ITEM, NULL)); + WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv; + + WebCore::KURL historyUri(WebCore::KURL(), uri); + WTF::String historyTitle = WTF::String::fromUTF8(title); + RefPtr<WebCore::HistoryItem> item = WebCore::HistoryItem::create(historyUri, historyTitle, 0); + priv->historyItem = item.release().releaseRef(); + webkit_history_item_add(webHistoryItem, priv->historyItem); + + return webHistoryItem; +} + +/** + * webkit_web_history_item_get_title: + * @web_history_item: a #WebKitWebHistoryItem + * + * Returns: the page title of @web_history_item + */ +G_CONST_RETURN gchar* webkit_web_history_item_get_title(WebKitWebHistoryItem* webHistoryItem) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL); + + WebCore::HistoryItem* item = core(webHistoryItem); + + g_return_val_if_fail(item, NULL); + + WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv; + priv->title = item->title().utf8(); + + return priv->title.data(); +} + +/** + * webkit_web_history_item_get_alternate_title: + * @web_history_item: a #WebKitWebHistoryItem + * + * Returns the alternate title of @web_history_item + * + * Return value: the alternate title of @web_history_item + */ +G_CONST_RETURN gchar* webkit_web_history_item_get_alternate_title(WebKitWebHistoryItem* webHistoryItem) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL); + + WebCore::HistoryItem* item = core(webHistoryItem); + + g_return_val_if_fail(item, NULL); + + WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv; + priv->alternateTitle = item->alternateTitle().utf8(); + + return priv->alternateTitle.data(); +} + +/** + * webkit_web_history_item_set_alternate_title: + * @web_history_item: a #WebKitWebHistoryItem + * @title: the alternate title for @this history item + * + * Sets an alternate title for @web_history_item + */ +void webkit_web_history_item_set_alternate_title(WebKitWebHistoryItem* webHistoryItem, const gchar* title) +{ + g_return_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem)); + g_return_if_fail(title); + + WebCore::HistoryItem* item = core(webHistoryItem); + + item->setAlternateTitle(WTF::String::fromUTF8(title)); + g_object_notify(G_OBJECT(webHistoryItem), "alternate-title"); +} + +/** + * webkit_web_history_item_get_uri: + * @web_history_item: a #WebKitWebHistoryItem + * + * Returns the URI of @this + * + * Return value: the URI of @web_history_item + */ +G_CONST_RETURN gchar* webkit_web_history_item_get_uri(WebKitWebHistoryItem* webHistoryItem) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL); + + WebCore::HistoryItem* item = core(WEBKIT_WEB_HISTORY_ITEM(webHistoryItem)); + + g_return_val_if_fail(item, NULL); + + WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv; + priv->uri = item->urlString().utf8(); + + return priv->uri.data(); +} + +/** + * webkit_web_history_item_get_original_uri: + * @web_history_item: a #WebKitWebHistoryItem + * + * Returns the original URI of @web_history_item. + * + * Return value: the original URI of @web_history_item + */ +G_CONST_RETURN gchar* webkit_web_history_item_get_original_uri(WebKitWebHistoryItem* webHistoryItem) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL); + + WebCore::HistoryItem* item = core(WEBKIT_WEB_HISTORY_ITEM(webHistoryItem)); + + g_return_val_if_fail(item, NULL); + + WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv; + priv->originalUri = item->originalURLString().utf8(); + + return webHistoryItem->priv->originalUri.data(); +} + +/** + * webkit_web_history_item_get_last_visisted_time : + * @web_history_item: a #WebKitWebHistoryItem + * + * Returns the last time @web_history_item was visited + * + * Return value: the time in seconds this @web_history_item was last visited + */ +gdouble webkit_web_history_item_get_last_visited_time(WebKitWebHistoryItem* webHistoryItem) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), 0); + + WebCore::HistoryItem* item = core(WEBKIT_WEB_HISTORY_ITEM(webHistoryItem)); + + g_return_val_if_fail(item, 0); + + return item->lastVisitedTime(); +} + +/** + * webkit_web_history_item_copy: + * @web_history_item: a #WebKitWebHistoryItem + * + * Makes a copy of the item for use with other WebView objects. + * + * Since: 1.1.18 + * + * Return value: (transfer full): the new #WebKitWebHistoryItem. + */ +WebKitWebHistoryItem* webkit_web_history_item_copy(WebKitWebHistoryItem* self) +{ + WebKitWebHistoryItemPrivate* selfPrivate = self->priv; + + WebKitWebHistoryItem* item = WEBKIT_WEB_HISTORY_ITEM(g_object_new(WEBKIT_TYPE_WEB_HISTORY_ITEM, 0)); + WebKitWebHistoryItemPrivate* priv = item->priv; + + priv->title = selfPrivate->title; + priv->alternateTitle = selfPrivate->alternateTitle; + priv->uri = selfPrivate->uri; + priv->originalUri = selfPrivate->originalUri; + + priv->historyItem = selfPrivate->historyItem->copy().releaseRef(); + + return item; +} + +/* private methods */ + +G_CONST_RETURN gchar* webkit_web_history_item_get_target(WebKitWebHistoryItem* webHistoryItem) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL); + + WebCore::HistoryItem* item = core(webHistoryItem); + + g_return_val_if_fail(item, NULL); + + WTF::CString t = item->target().utf8(); + return g_strdup(t.data()); +} + +gboolean webkit_web_history_item_is_target_item(WebKitWebHistoryItem* webHistoryItem) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), false); + + WebCore::HistoryItem* item = core(webHistoryItem); + + g_return_val_if_fail(item, false); + + return item->isTargetItem(); +} + +GList* webkit_web_history_item_get_children(WebKitWebHistoryItem* webHistoryItem) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL); + + WebCore::HistoryItem* item = core(webHistoryItem); + + g_return_val_if_fail(item, NULL); + + const WebCore::HistoryItemVector& children = item->children(); + if (!children.size()) + return NULL; + + unsigned size = children.size(); + GList* kids = NULL; + for (unsigned i = 0; i < size; ++i) + kids = g_list_prepend(kids, kit(children[i].get())); + + return g_list_reverse(kids); +} + +WebCore::HistoryItem* WebKit::core(WebKitWebHistoryItem* webHistoryItem) +{ + g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), NULL); + + return webHistoryItem->priv->historyItem; +} + +WebKitWebHistoryItem* WebKit::kit(PassRefPtr<WebCore::HistoryItem> historyItem) +{ + g_return_val_if_fail(historyItem, NULL); + + RefPtr<WebCore::HistoryItem> item = historyItem; + GHashTable* table = webkit_history_items(); + WebKitWebHistoryItem* webHistoryItem = (WebKitWebHistoryItem*) g_hash_table_lookup(table, item.get()); + + if (!webHistoryItem) { + webHistoryItem = WEBKIT_WEB_HISTORY_ITEM(g_object_new(WEBKIT_TYPE_WEB_HISTORY_ITEM, NULL)); + WebKitWebHistoryItemPrivate* priv = webHistoryItem->priv; + + priv->historyItem = item.release().releaseRef(); + webkit_history_item_add(webHistoryItem, priv->historyItem); + } + + return webHistoryItem; +} + |