WebKit/gtk/webkit/webkitwebbackforwardlist.cpp
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2008 Jan Michael C. Alonzo
       
     3  * Copyright (C) 2009 Igalia S.L.
       
     4  *
       
     5  * This library is free software; you can redistribute it and/or
       
     6  * modify it under the terms of the GNU Library General Public
       
     7  * License as published by the Free Software Foundation; either
       
     8  * version 2 of the License, or (at your option) any later version.
       
     9  *
       
    10  * This library is distributed in the hope that it will be useful,
       
    11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    13  * Library General Public License for more details.
       
    14  *
       
    15  * You should have received a copy of the GNU Library General Public License
       
    16  * along with this library; see the file COPYING.LIB.  If not, write to
       
    17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
       
    18  * Boston, MA 02110-1301, USA.
       
    19  */
       
    20 
       
    21 #include "config.h"
       
    22 
       
    23 #include "webkitwebbackforwardlist.h"
       
    24 #include "webkitprivate.h"
       
    25 #include "webkitwebhistoryitem.h"
       
    26 #include "webkitwebview.h"
       
    27 
       
    28 #include <glib.h>
       
    29 
       
    30 #include "BackForwardList.h"
       
    31 #include "HistoryItem.h"
       
    32 
       
    33 /**
       
    34  * SECTION:webkitwebbackforwardlist
       
    35  * @short_description: The history of a #WebKitWebView
       
    36  * @see_also: #WebKitWebView, #WebKitWebHistoryItem
       
    37  *
       
    38  * <informalexample><programlisting>
       
    39  * /<!-- -->* Get the WebKitWebBackForwardList from the WebKitWebView *<!-- -->/
       
    40  * WebKitWebBackForwardList *back_forward_list = webkit_web_view_get_back_forward_list (my_web_view);
       
    41  * WebKitWebHistoryItem *item = webkit_web_back_forward_list_get_current_item (back_forward_list);
       
    42  *
       
    43  * /<!-- -->* Do something with a WebKitWebHistoryItem *<!-- -->/
       
    44  * g_print("%p", item);
       
    45  *
       
    46  * /<!-- -->* Control some parameters *<!-- -->/
       
    47  * WebKitWebBackForwardList *back_forward_list = webkit_web_view_get_back_forward_list (my_web_view);
       
    48  * webkit_web_back_forward_list_set_limit (back_forward_list, 30);
       
    49  * </programlisting></informalexample>
       
    50  *
       
    51  */
       
    52 
       
    53 using namespace WebKit;
       
    54 
       
    55 struct _WebKitWebBackForwardListPrivate {
       
    56     WebCore::BackForwardList* backForwardList;
       
    57     gboolean disposed;
       
    58 };
       
    59 
       
    60 #define WEBKIT_WEB_BACK_FORWARD_LIST_GET_PRIVATE(obj)    (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_BACK_FORWARD_LIST, WebKitWebBackForwardListPrivate))
       
    61 
       
    62 G_DEFINE_TYPE(WebKitWebBackForwardList, webkit_web_back_forward_list, G_TYPE_OBJECT);
       
    63 
       
    64 static void webkit_web_back_forward_list_dispose(GObject* object)
       
    65 {
       
    66     WebKitWebBackForwardList* list = WEBKIT_WEB_BACK_FORWARD_LIST(object);
       
    67     WebCore::BackForwardList* backForwardList = core(list);
       
    68     WebKitWebBackForwardListPrivate* priv = list->priv;
       
    69 
       
    70     if (!priv->disposed) {
       
    71         priv->disposed = true;
       
    72 
       
    73         WebCore::HistoryItemVector items = backForwardList->entries();
       
    74         GHashTable* table = webkit_history_items();
       
    75         for (unsigned i = 0; i < items.size(); i++)
       
    76             g_hash_table_remove(table, items[i].get());
       
    77     }
       
    78 
       
    79     G_OBJECT_CLASS(webkit_web_back_forward_list_parent_class)->dispose(object);
       
    80 }
       
    81 
       
    82 static void webkit_web_back_forward_list_class_init(WebKitWebBackForwardListClass* klass)
       
    83 {
       
    84     GObjectClass* object_class = G_OBJECT_CLASS(klass);
       
    85 
       
    86     object_class->dispose = webkit_web_back_forward_list_dispose;
       
    87 
       
    88     webkit_init();
       
    89 
       
    90     g_type_class_add_private(klass, sizeof(WebKitWebBackForwardListPrivate));
       
    91 }
       
    92 
       
    93 static void webkit_web_back_forward_list_init(WebKitWebBackForwardList* webBackForwardList)
       
    94 {
       
    95     webBackForwardList->priv = WEBKIT_WEB_BACK_FORWARD_LIST_GET_PRIVATE(webBackForwardList);
       
    96 }
       
    97 
       
    98 /**
       
    99  * webkit_web_back_forward_list_new_with_web_view:
       
   100  * @web_view: the back forward list's #WebKitWebView
       
   101  *
       
   102  * Creates an instance of the back forward list with a controlling #WebKitWebView
       
   103  *
       
   104  * Return value: a #WebKitWebBackForwardList
       
   105  */
       
   106 WebKitWebBackForwardList* webkit_web_back_forward_list_new_with_web_view(WebKitWebView* webView)
       
   107 {
       
   108     g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), NULL);
       
   109 
       
   110     WebKitWebBackForwardList* webBackForwardList;
       
   111 
       
   112     webBackForwardList = WEBKIT_WEB_BACK_FORWARD_LIST(g_object_new(WEBKIT_TYPE_WEB_BACK_FORWARD_LIST, NULL));
       
   113     WebKitWebBackForwardListPrivate* priv = webBackForwardList->priv;
       
   114 
       
   115     priv->backForwardList = core(webView)->backForwardList();
       
   116     priv->backForwardList->setEnabled(TRUE);
       
   117 
       
   118     return webBackForwardList;
       
   119 }
       
   120 
       
   121 /**
       
   122  * webkit_web_back_forward_list_go_forward:
       
   123  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   124  *
       
   125  * Steps forward in the back forward list
       
   126  */
       
   127 void webkit_web_back_forward_list_go_forward(WebKitWebBackForwardList* webBackForwardList)
       
   128 {
       
   129     g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
       
   130 
       
   131     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   132     if (backForwardList->enabled())
       
   133         backForwardList->goForward();
       
   134 }
       
   135 
       
   136 /**
       
   137  * webkit_web_back_forward_list_go_back:
       
   138  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   139  *
       
   140  * Steps backward in the back forward list
       
   141  */
       
   142 void webkit_web_back_forward_list_go_back(WebKitWebBackForwardList* webBackForwardList)
       
   143 {
       
   144     g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
       
   145 
       
   146     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   147     if (backForwardList->enabled())
       
   148         backForwardList->goBack();
       
   149 }
       
   150 
       
   151 /**
       
   152  * webkit_web_back_forward_list_contains_item:
       
   153  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   154  * @history_item: the #WebKitWebHistoryItem to check
       
   155  *
       
   156  * Checks if @web_history_item is in the back forward list
       
   157  *
       
   158  * Return: %TRUE if @web_history_item is in the back forward list, %FALSE if it doesn't
       
   159  */
       
   160 gboolean webkit_web_back_forward_list_contains_item(WebKitWebBackForwardList* webBackForwardList, WebKitWebHistoryItem* webHistoryItem)
       
   161 {
       
   162     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), FALSE);
       
   163     g_return_val_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem), FALSE);
       
   164 
       
   165     WebCore::HistoryItem* historyItem = core(webHistoryItem);
       
   166 
       
   167     g_return_val_if_fail(historyItem != NULL, FALSE);
       
   168 
       
   169     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   170 
       
   171     return (backForwardList->enabled() ? backForwardList->containsItem(historyItem) : FALSE);
       
   172 }
       
   173 
       
   174 /**
       
   175  * webkit_web_back_forward_list_go_to_item:
       
   176  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   177  * @history_item: the #WebKitWebHistoryItem to go to
       
   178  *
       
   179  * Go to the specified @web_history_item in the back forward list
       
   180  */
       
   181 void webkit_web_back_forward_list_go_to_item(WebKitWebBackForwardList* webBackForwardList, WebKitWebHistoryItem* webHistoryItem)
       
   182 {
       
   183     g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
       
   184     g_return_if_fail(WEBKIT_IS_WEB_HISTORY_ITEM(webHistoryItem));
       
   185 
       
   186     WebCore::HistoryItem* historyItem = core(webHistoryItem);
       
   187     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   188 
       
   189     if (backForwardList->enabled() && historyItem)
       
   190         backForwardList->goToItem(historyItem);
       
   191 }
       
   192 
       
   193 /**
       
   194  * webkit_web_back_forward_list_get_forward_list_with_limit:
       
   195  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   196  * @limit: the number of items to retrieve
       
   197  *
       
   198  * Returns a list of items that succeed the current item, limited by @limit
       
   199  *
       
   200  * Return value: a #GList of items succeeding the current item, limited by @limit
       
   201  */
       
   202 GList* webkit_web_back_forward_list_get_forward_list_with_limit(WebKitWebBackForwardList* webBackForwardList, gint limit)
       
   203 {
       
   204     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
       
   205 
       
   206     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   207     if (!backForwardList || !backForwardList->enabled())
       
   208         return NULL;
       
   209 
       
   210     WebCore::HistoryItemVector items;
       
   211     GList* forwardItems = { 0 };
       
   212 
       
   213     backForwardList->forwardListWithLimit(limit, items);
       
   214 
       
   215     for (unsigned i = 0; i < items.size(); i++) {
       
   216         WebKitWebHistoryItem* webHistoryItem = kit(items[i]);
       
   217         forwardItems = g_list_prepend(forwardItems, webHistoryItem);
       
   218     }
       
   219 
       
   220     return forwardItems;
       
   221 }
       
   222 
       
   223 /**
       
   224  * webkit_web_back_forward_list_get_back_list_with_limit:
       
   225  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   226  * @limit: the number of items to retrieve
       
   227  *
       
   228  * Returns a list of items that precede the current item, limited by @limit
       
   229  *
       
   230  * Return value: a #GList of items preceding the current item, limited by @limit
       
   231  */
       
   232 GList* webkit_web_back_forward_list_get_back_list_with_limit(WebKitWebBackForwardList* webBackForwardList, gint limit)
       
   233 {
       
   234     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
       
   235 
       
   236     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   237     if (!backForwardList || !backForwardList->enabled())
       
   238         return NULL;
       
   239 
       
   240     WebCore::HistoryItemVector items;
       
   241     GList* backItems = { 0 };
       
   242 
       
   243     backForwardList->backListWithLimit(limit, items);
       
   244 
       
   245     for (unsigned i = 0; i < items.size(); i++) {
       
   246         WebKitWebHistoryItem* webHistoryItem = kit(items[i]);
       
   247         backItems = g_list_prepend(backItems, webHistoryItem);
       
   248     }
       
   249 
       
   250     return backItems;
       
   251 }
       
   252 
       
   253 /**
       
   254  * webkit_web_back_forward_list_get_back_item:
       
   255  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   256  *
       
   257  * Returns the item that precedes the current item
       
   258  *
       
   259  * Return value: the #WebKitWebHistoryItem preceding the current item
       
   260  */
       
   261 WebKitWebHistoryItem* webkit_web_back_forward_list_get_back_item(WebKitWebBackForwardList* webBackForwardList)
       
   262 {
       
   263     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
       
   264 
       
   265     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   266     if (!backForwardList || !backForwardList->enabled())
       
   267         return NULL;
       
   268 
       
   269     WebCore::HistoryItem* historyItem = backForwardList->backItem();
       
   270 
       
   271     return (historyItem ? kit(historyItem) : NULL);
       
   272 }
       
   273 
       
   274 /**
       
   275  * webkit_web_back_forward_list_get_current_item:
       
   276  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   277  *
       
   278  * Returns the current item.
       
   279  *
       
   280  * Returns a NULL value if the back forward list is empty
       
   281  *
       
   282  * Return value: a #WebKitWebHistoryItem
       
   283  */
       
   284 WebKitWebHistoryItem* webkit_web_back_forward_list_get_current_item(WebKitWebBackForwardList* webBackForwardList)
       
   285 {
       
   286     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
       
   287 
       
   288     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   289     if (!backForwardList || !backForwardList->enabled())
       
   290         return NULL;
       
   291 
       
   292     WebCore::HistoryItem* historyItem = backForwardList->currentItem();
       
   293 
       
   294     return (historyItem ? kit(historyItem) : NULL);
       
   295 }
       
   296 
       
   297 /**
       
   298  * webkit_web_back_forward_list_get_forward_item:
       
   299  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   300  *
       
   301  * Returns the item that succeeds the current item.
       
   302  *
       
   303  * Returns a NULL value if there nothing that succeeds the current item
       
   304  *
       
   305  * Return value: a #WebKitWebHistoryItem
       
   306  */
       
   307 WebKitWebHistoryItem* webkit_web_back_forward_list_get_forward_item(WebKitWebBackForwardList* webBackForwardList)
       
   308 {
       
   309     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
       
   310 
       
   311     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   312     if (!backForwardList || !backForwardList->enabled())
       
   313         return NULL;
       
   314 
       
   315     WebCore::HistoryItem* historyItem = backForwardList->forwardItem();
       
   316 
       
   317     return (historyItem ? kit(historyItem) : NULL);
       
   318 }
       
   319 
       
   320 /**
       
   321  * webkit_web_back_forward_list_get_nth_item:
       
   322  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   323  * @index: the index of the item
       
   324  *
       
   325  * Returns the item at a given index relative to the current item.
       
   326  *
       
   327  * Return value: the #WebKitWebHistoryItem located at the specified index relative to the current item
       
   328  */
       
   329 WebKitWebHistoryItem* webkit_web_back_forward_list_get_nth_item(WebKitWebBackForwardList* webBackForwardList, gint index)
       
   330 {
       
   331     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
       
   332 
       
   333     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   334     if (!backForwardList)
       
   335         return NULL;
       
   336 
       
   337     WebCore::HistoryItem* historyItem = backForwardList->itemAtIndex(index);
       
   338 
       
   339     return (historyItem ? kit(historyItem) : NULL);
       
   340 }
       
   341 
       
   342 /**
       
   343  * webkit_web_back_forward_list_get_back_length:
       
   344  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   345  *
       
   346  * Returns the number of items that preced the current item.
       
   347  *
       
   348  * Return value: a #gint corresponding to the number of items preceding the current item
       
   349  */
       
   350 gint webkit_web_back_forward_list_get_back_length(WebKitWebBackForwardList* webBackForwardList)
       
   351 {
       
   352     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), 0);
       
   353 
       
   354     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   355     if (!backForwardList || !backForwardList->enabled())
       
   356         return 0;
       
   357 
       
   358     return backForwardList->backListCount();
       
   359 }
       
   360 
       
   361 /**
       
   362  * webkit_web_back_forward_list_get_forward_length:
       
   363  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   364  *
       
   365  * Returns the number of items that succeed the current item.
       
   366  *
       
   367  * Return value: a #gint corresponding to the nuber of items succeeding the current item
       
   368  */
       
   369 gint webkit_web_back_forward_list_get_forward_length(WebKitWebBackForwardList* webBackForwardList)
       
   370 {
       
   371     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), 0);
       
   372 
       
   373     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   374     if (!backForwardList || !backForwardList->enabled())
       
   375         return 0;
       
   376 
       
   377     return backForwardList->forwardListCount();
       
   378 }
       
   379 
       
   380 /**
       
   381  * webkit_web_back_forward_list_get_limit:
       
   382  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   383  *
       
   384  * Returns the maximum limit of the back forward list.
       
   385  *
       
   386  * Return value: a #gint indicating the number of #WebKitWebHistoryItem the back forward list can hold
       
   387  */
       
   388 gint webkit_web_back_forward_list_get_limit(WebKitWebBackForwardList* webBackForwardList)
       
   389 {
       
   390     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), 0);
       
   391 
       
   392     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   393     if (!backForwardList || !backForwardList->enabled())
       
   394         return 0;
       
   395 
       
   396     return backForwardList->capacity();
       
   397 }
       
   398 
       
   399 /**
       
   400  * webkit_web_back_forward_list_set_limit:
       
   401  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   402  * @limit: the limit to set the back forward list to
       
   403  *
       
   404  * Sets the maximum limit of the back forward list. If the back forward list
       
   405  * exceeds its capacity, items will be removed everytime a new item has been
       
   406  * added.
       
   407  */
       
   408 void webkit_web_back_forward_list_set_limit(WebKitWebBackForwardList* webBackForwardList, gint limit)
       
   409 {
       
   410     g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
       
   411 
       
   412     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   413     if (backForwardList)
       
   414         backForwardList->setCapacity(limit);
       
   415 }
       
   416 
       
   417 /**
       
   418  * webkit_web_back_forward_list_add_item:
       
   419  * @web_back_forward_list: a #WebKitWebBackForwardList
       
   420  * @history_item: the #WebKitWebHistoryItem to add
       
   421  *
       
   422  * Adds the item to the #WebKitWebBackForwardList.
       
   423  *
       
   424  * The @webBackForwardList will add a reference to the @webHistoryItem, so you
       
   425  * don't need to keep a reference once you've added it to the list.
       
   426  *
       
   427  * Since: 1.1.1
       
   428  */
       
   429 void webkit_web_back_forward_list_add_item(WebKitWebBackForwardList *webBackForwardList, WebKitWebHistoryItem *webHistoryItem)
       
   430 {
       
   431     g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
       
   432 
       
   433     g_object_ref(webHistoryItem);
       
   434 
       
   435     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   436     WebCore::HistoryItem* historyItem = core(webHistoryItem);
       
   437 
       
   438     backForwardList->addItem(historyItem);
       
   439 }
       
   440 
       
   441 /**
       
   442  * webkit_web_back_forward_list_clear:
       
   443  * @webBackForwardList:  a #WebKitWebBackForwardList
       
   444  *
       
   445  * Clears the @webBackForwardList by removing all its elements. Note that not even
       
   446  * the current page is kept in list when cleared so you would have to add it later.
       
   447  *
       
   448  * Since: 1.3.1
       
   449  **/
       
   450 void webkit_web_back_forward_list_clear(WebKitWebBackForwardList* webBackForwardList)
       
   451 {
       
   452     g_return_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList));
       
   453 
       
   454     WebCore::BackForwardList* backForwardList = core(webBackForwardList);
       
   455     if (!backForwardList || !backForwardList->enabled() || !backForwardList->entries().size())
       
   456         return;
       
   457 
       
   458     // Clear the current list by setting capacity to 0
       
   459     int capacity = backForwardList->capacity();
       
   460     backForwardList->setCapacity(0);
       
   461     backForwardList->setCapacity(capacity);
       
   462 }
       
   463 
       
   464 WebCore::BackForwardList* WebKit::core(WebKitWebBackForwardList* webBackForwardList)
       
   465 {
       
   466     g_return_val_if_fail(WEBKIT_IS_WEB_BACK_FORWARD_LIST(webBackForwardList), NULL);
       
   467 
       
   468     return webBackForwardList->priv ? webBackForwardList->priv->backForwardList : 0;
       
   469 }