WebKitBackForwardList.cpp [plain text]
#include "config.h"
#include "WebKitBackForwardList.h"
#include "WebKitBackForwardListPrivate.h"
#include "WebKitMarshal.h"
#include "WebKitPrivate.h"
#include <wtf/gobject/GRefPtr.h>
using namespace WebKit;
enum {
CHANGED,
LAST_SIGNAL
};
typedef HashMap<WebBackForwardListItem*, GRefPtr<WebKitBackForwardListItem> > BackForwardListItemsMap;
struct _WebKitBackForwardListPrivate {
WebBackForwardList* backForwardItems;
BackForwardListItemsMap itemsMap;
};
static guint signals[LAST_SIGNAL] = { 0, };
WEBKIT_DEFINE_TYPE(WebKitBackForwardList, webkit_back_forward_list, G_TYPE_OBJECT)
static void webkit_back_forward_list_class_init(WebKitBackForwardListClass* listClass)
{
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);
}
static WebKitBackForwardListItem* webkitBackForwardListGetOrCreateItem(WebKitBackForwardList* list, WebBackForwardListItem* webListItem)
{
if (!webListItem)
return 0;
WebKitBackForwardListPrivate* priv = list->priv;
GRefPtr<WebKitBackForwardListItem> listItem = priv->itemsMap.get(webListItem);
if (listItem)
return listItem.get();
listItem = webkitBackForwardListItemGetOrCreate(webListItem);
priv->itemsMap.set(webListItem, listItem);
return listItem.get();
}
static GList* webkitBackForwardListCreateList(WebKitBackForwardList* list, API::Array* backForwardItems)
{
if (!backForwardItems)
return 0;
GList* returnValue = 0;
for (size_t i = 0; i < backForwardItems->size(); ++i) {
WebBackForwardListItem* webItem = static_cast<WebBackForwardListItem*>(backForwardItems->at(i));
returnValue = g_list_prepend(returnValue, webkitBackForwardListGetOrCreateItem(list, webItem));
}
return returnValue;
}
WebKitBackForwardList* webkitBackForwardListCreate(WebBackForwardList* backForwardItems)
{
WebKitBackForwardList* list = WEBKIT_BACK_FORWARD_LIST(g_object_new(WEBKIT_TYPE_BACK_FORWARD_LIST, NULL));
list->priv->backForwardItems = backForwardItems;
return list;
}
void webkitBackForwardListChanged(WebKitBackForwardList* backForwardList, WebBackForwardListItem* webAddedItem, API::Array* webRemovedItems)
{
WebKitBackForwardListItem* addedItem = webkitBackForwardListGetOrCreateItem(backForwardList, webAddedItem);
GList* removedItems = 0;
size_t removedItemsSize = webRemovedItems ? webRemovedItems->size() : 0;
WebKitBackForwardListPrivate* priv = backForwardList->priv;
for (size_t i = 0; i < removedItemsSize; ++i) {
WebBackForwardListItem* webItem = static_cast<WebBackForwardListItem*>(webRemovedItems->at(i));
removedItems = g_list_prepend(removedItems, g_object_ref(G_OBJECT(priv->itemsMap.get(webItem).get())));
priv->itemsMap.remove(webItem);
}
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, backForwardList->priv->backForwardItems->currentItem());
}
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, backForwardList->priv->backForwardItems->backItem());
}
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, backForwardList->priv->backForwardItems->forwardItem());
}
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, backForwardList->priv->backForwardItems->itemAtIndex(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 priv->backForwardItems->backListCount() + priv->backForwardItems->forwardListCount() + currentItem;
}
GList* webkit_back_forward_list_get_back_list(WebKitBackForwardList* backForwardList)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
return webkit_back_forward_list_get_back_list_with_limit(backForwardList, backForwardList->priv->backForwardItems->backListCount());
}
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);
WebKitBackForwardListPrivate* priv = backForwardList->priv;
RefPtr<API::Array> apiArray = priv->backForwardItems->backListAsAPIArrayWithLimit(limit);
return webkitBackForwardListCreateList(backForwardList, apiArray.get());
}
GList* webkit_back_forward_list_get_forward_list(WebKitBackForwardList* backForwardList)
{
g_return_val_if_fail(WEBKIT_IS_BACK_FORWARD_LIST(backForwardList), 0);
return webkit_back_forward_list_get_forward_list_with_limit(backForwardList, backForwardList->priv->backForwardItems->forwardListCount());
}
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);
WebKitBackForwardListPrivate* priv = backForwardList->priv;
RefPtr<API::Array> apiArray = priv->backForwardItems->forwardListAsAPIArrayWithLimit(limit);
return webkitBackForwardListCreateList(backForwardList, apiArray.get());
}