WebKitBackForwardList.cpp [plain text]
#include "config.h"
#include "WebKitBackForwardList.h"
#include "WebKitBackForwardListPrivate.h"
#include "WebKitMarshal.h"
#include "WebKitPrivate.h"
#include <wtf/gobject/GRefPtr.h>
enum {
CHANGED,
LAST_SIGNAL
};
typedef HashMap<WKBackForwardListItemRef, GRefPtr<WebKitBackForwardListItem> > BackForwardListItemsMap;
struct _WebKitBackForwardListPrivate {
WKBackForwardListRef wkList;
BackForwardListItemsMap itemsMap;
};
static guint signals[LAST_SIGNAL] = { 0, };
G_DEFINE_TYPE(WebKitBackForwardList, webkit_back_forward_list, G_TYPE_OBJECT)
static void webkitBackForwardListFinalize(GObject* object)
{
WEBKIT_BACK_FORWARD_LIST(object)->priv->~WebKitBackForwardListPrivate();
G_OBJECT_CLASS(webkit_back_forward_list_parent_class)->finalize(object);
}
static void webkit_back_forward_list_init(WebKitBackForwardList* list)
{
WebKitBackForwardListPrivate* priv = G_TYPE_INSTANCE_GET_PRIVATE(list, WEBKIT_TYPE_BACK_FORWARD_LIST, WebKitBackForwardListPrivate);
list->priv = priv;
new (priv) WebKitBackForwardListPrivate();
}
static void webkit_back_forward_list_class_init(WebKitBackForwardListClass* listClass)
{
GObjectClass* gObjectClass = G_OBJECT_CLASS(listClass);
gObjectClass->finalize = webkitBackForwardListFinalize;
signals[CHANGED] =
g_signal_new("changed",
G_TYPE_FROM_CLASS(listClass),
G_SIGNAL_RUN_LAST,
0, 0, 0,
webkit_marshal_VOID__OBJECT_POINTER,
G_TYPE_NONE, 2,
WEBKIT_TYPE_BACK_FORWARD_LIST_ITEM,
G_TYPE_POINTER);
g_type_class_add_private(listClass, sizeof(WebKitBackForwardListPrivate));
}
static WebKitBackForwardListItem* webkitBackForwardListGetOrCreateItem(WebKitBackForwardList* list, WKBackForwardListItemRef wkListItem)
{
if (!wkListItem)
return 0;
WebKitBackForwardListPrivate* priv = list->priv;
GRefPtr<WebKitBackForwardListItem> listItem = priv->itemsMap.get(wkListItem);
if (listItem)
return listItem.get();
listItem = webkitBackForwardListItemGetOrCreate(wkListItem);
priv->itemsMap.set(wkListItem, listItem);
return listItem.get();
}
static GList* webkitBackForwardListCreateList(WebKitBackForwardList* list, WKArrayRef wkList)
{
if (!wkList)
return 0;
GList* returnValue = 0;
for (size_t i = 0; i < WKArrayGetSize(wkList); ++i) {
WKBackForwardListItemRef wkItem = static_cast<WKBackForwardListItemRef>(WKArrayGetItemAtIndex(wkList, i));
returnValue = g_list_prepend(returnValue, webkitBackForwardListGetOrCreateItem(list, wkItem));
}
return returnValue;
}
WebKitBackForwardList* webkitBackForwardListCreate(WKBackForwardListRef wkList)
{
WebKitBackForwardList* list = WEBKIT_BACK_FORWARD_LIST(g_object_new(WEBKIT_TYPE_BACK_FORWARD_LIST, NULL));
list->priv->wkList = wkList;
return list;
}
void webkitBackForwardListChanged(WebKitBackForwardList* backForwardList, WKBackForwardListItemRef wkAddedItem, WKArrayRef wkRemovedItems)
{
WebKitBackForwardListItem* addedItem = webkitBackForwardListGetOrCreateItem(backForwardList, wkAddedItem);
GList* removedItems = 0;
size_t removedItemsSize = wkRemovedItems ? WKArrayGetSize(wkRemovedItems) : 0;
WebKitBackForwardListPrivate* priv = backForwardList->priv;
for (size_t i = 0; i < removedItemsSize; ++i) {
WKBackForwardListItemRef wkItem = static_cast<WKBackForwardListItemRef>(WKArrayGetItemAtIndex(wkRemovedItems, i));
removedItems = g_list_prepend(removedItems, g_object_ref(G_OBJECT(priv->itemsMap.get(wkItem).get())));
priv->itemsMap.remove(wkItem);
}
g_signal_emit(backForwardList, signals[CHANGED], 0, addedItem, removedItems, NULL);
g_list_free_full(removedItems, static_cast<GDestroyNotify>(g_object_unref));
}
WebKitBackForwardListItem* webkit_back_forward_list_get_current_item(WebKitBackForwardList* backForwardList)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
return webkitBackForwardListGetOrCreateItem(backForwardList, WKBackForwardListGetCurrentItem(backForwardList->priv->wkList));
}
WebKitBackForwardListItem* webkit_back_forward_list_get_back_item(WebKitBackForwardList* backForwardList)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
return webkitBackForwardListGetOrCreateItem(backForwardList, WKBackForwardListGetBackItem(backForwardList->priv->wkList));
}
WebKitBackForwardListItem* webkit_back_forward_list_get_forward_item(WebKitBackForwardList* backForwardList)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
return webkitBackForwardListGetOrCreateItem(backForwardList, WKBackForwardListGetForwardItem(backForwardList->priv->wkList));
}
WebKitBackForwardListItem* webkit_back_forward_list_get_nth_item(WebKitBackForwardList* backForwardList, gint index)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
return webkitBackForwardListGetOrCreateItem(backForwardList, WKBackForwardListGetItemAtIndex(backForwardList->priv->wkList, index));
}
guint webkit_back_forward_list_get_length(WebKitBackForwardList* backForwardList)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
WebKitBackForwardListPrivate* priv = backForwardList->priv;
guint currentItem = webkit_back_forward_list_get_current_item(backForwardList) ? 1 : 0;
return WKBackForwardListGetBackListCount(priv->wkList) + WKBackForwardListGetForwardListCount(priv->wkList) + currentItem;
}
GList* webkit_back_forward_list_get_back_list(WebKitBackForwardList* backForwardList)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
guint limit = WKBackForwardListGetBackListCount(backForwardList->priv->wkList);
return webkitBackForwardListCreateList(backForwardList, WKBackForwardListCopyBackListWithLimit(backForwardList->priv->wkList, limit));
}
GList* webkit_back_forward_list_get_back_list_with_limit(WebKitBackForwardList* backForwardList, guint limit)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
return webkitBackForwardListCreateList(backForwardList, WKBackForwardListCopyBackListWithLimit(backForwardList->priv->wkList, limit));
}
GList* webkit_back_forward_list_get_forward_list(WebKitBackForwardList* backForwardList)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
guint limit = WKBackForwardListGetForwardListCount(backForwardList->priv->wkList);
return webkitBackForwardListCreateList(backForwardList, WKBackForwardListCopyForwardListWithLimit(backForwardList->priv->wkList, limit));
}
GList* webkit_back_forward_list_get_forward_list_with_limit(WebKitBackForwardList* backForwardList, guint limit)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
return webkitBackForwardListCreateList(backForwardList, WKBackForwardListCopyForwardListWithLimit(backForwardList->priv->wkList, limit));
}