1/*
2 * Copyright (C) 2008 Holger Hans Peter Freyther
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Library General Public License for more details.
13 *
14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB.  If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
18 */
19
20#include "autotoolsconfig.h"
21#include <glib.h>
22#include <gtk/gtk.h>
23#include <webkit/webkit.h>
24
25static void test_webkit_web_history_item_lifetime(void)
26{
27    WebKitWebView* webView;
28    WebKitWebBackForwardList* backForwardList;
29    WebKitWebHistoryItem* currentItem;
30    WebKitWebHistoryItem* forwardItem;
31    WebKitWebHistoryItem* backItem;
32    WebKitWebHistoryItem* nthItem;
33    WebKitWebHistoryItem* item1;
34    WebKitWebHistoryItem* item2;
35    WebKitWebHistoryItem* item3;
36    WebKitWebHistoryItem* item4;
37    GList* backList = NULL;
38    GList* forwardList = NULL;
39    g_test_bug("19898");
40
41    webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
42    g_object_ref_sink(webView);
43    backForwardList = webkit_web_view_get_back_forward_list(webView);
44    g_assert_cmpint(G_OBJECT(backForwardList)->ref_count, ==, 1);
45
46    /* add test items */
47    item1 = webkit_web_history_item_new_with_data("http://example.com/1/", "Site 1");
48    webkit_web_back_forward_list_add_item(backForwardList, item1);
49    g_object_unref(item1);
50
51    item2 = webkit_web_history_item_new_with_data("http://example.com/2/", "Site 2");
52    webkit_web_back_forward_list_add_item(backForwardList, item2);
53    g_object_unref(item2);
54
55    item3 = webkit_web_history_item_new_with_data("http://example.com/3/", "Site 3");
56    webkit_web_back_forward_list_add_item(backForwardList, item3);
57    g_object_unref(item3);
58
59    item4 = webkit_web_history_item_new_with_data("http://example.com/4/", "Site 4");
60    webkit_web_back_forward_list_add_item(backForwardList, item4);
61    g_object_unref(item4);
62
63    /* make sure these functions don't add unnecessary ref to the history item */
64    backItem = webkit_web_back_forward_list_get_back_item(backForwardList);
65    g_object_ref(backItem);
66    g_assert_cmpint(G_OBJECT(backItem)->ref_count, ==, 2);
67    g_object_unref(backItem);
68    g_assert_cmpint(G_OBJECT(backItem)->ref_count, ==, 1);
69
70    currentItem = webkit_web_back_forward_list_get_current_item(backForwardList);
71    g_object_ref(currentItem);
72    g_assert_cmpint(G_OBJECT(currentItem)->ref_count, ==, 2);
73    g_object_unref(currentItem);
74    g_assert_cmpint(G_OBJECT(currentItem)->ref_count, ==, 1);
75
76    webkit_web_back_forward_list_go_to_item(backForwardList, item2);
77    forwardItem = webkit_web_back_forward_list_get_forward_item(backForwardList);
78    g_object_ref(forwardItem);
79    g_assert_cmpint(G_OBJECT(forwardItem)->ref_count, ==, 2);
80    g_object_unref(forwardItem);
81    g_assert_cmpint(G_OBJECT(forwardItem)->ref_count, ==, 1);
82
83    nthItem = webkit_web_back_forward_list_get_nth_item(backForwardList, 1);
84    g_object_ref(nthItem);
85    g_assert_cmpint(G_OBJECT(nthItem)->ref_count, ==, 2);
86    g_object_unref(nthItem);
87    g_assert_cmpint(G_OBJECT(nthItem)->ref_count, ==, 1);
88
89    backList = webkit_web_back_forward_list_get_back_list_with_limit(backForwardList, 5);
90    for (; backList; backList = backList->next)
91        g_assert_cmpint(G_OBJECT(backList->data)->ref_count, ==, 1);
92
93    forwardList = webkit_web_back_forward_list_get_forward_list_with_limit(backForwardList, 5);
94    for (; forwardList; forwardList = forwardList->next)
95        g_assert_cmpint(G_OBJECT(forwardList->data)->ref_count, ==, 1);
96
97    g_list_free(forwardList);
98    g_list_free(backList);
99    g_assert_cmpint(G_OBJECT(item1)->ref_count, ==, 1);
100    g_assert_cmpint(G_OBJECT(item2)->ref_count, ==, 1);
101    g_assert_cmpint(G_OBJECT(item3)->ref_count, ==, 1);
102    g_assert_cmpint(G_OBJECT(item4)->ref_count, ==, 1);
103    g_assert_cmpint(G_OBJECT(backForwardList)->ref_count, ==, 1);
104    g_object_unref(webView);
105}
106
107static void test_webkit_web_back_forward_list_order(void)
108{
109    WebKitWebView* webView;
110    WebKitWebBackForwardList* webBackForwardList;
111    WebKitWebHistoryItem* item1;
112    WebKitWebHistoryItem* item2;
113    WebKitWebHistoryItem* item3;
114    WebKitWebHistoryItem* item4;
115    WebKitWebHistoryItem* currentItem;
116    GList* backList = NULL;
117    GList* forwardList = NULL;
118    g_test_bug("22694");
119
120    webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
121    g_object_ref_sink(webView);
122
123    webkit_web_view_set_maintains_back_forward_list(webView, TRUE);
124    webBackForwardList = webkit_web_view_get_back_forward_list(webView);
125    g_assert(webBackForwardList);
126
127    // Check that there is no item.
128    g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList));
129    g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0);
130    g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0);
131    g_assert(!webkit_web_view_can_go_forward(webView));
132    g_assert(!webkit_web_view_can_go_back(webView));
133
134    // Add a new items
135    item1 = webkit_web_history_item_new_with_data("http://example.com/1/", "Site 1");
136    webkit_web_back_forward_list_add_item(webBackForwardList, item1);
137    g_object_unref(item1);
138    g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, item1));
139
140    item2 = webkit_web_history_item_new_with_data("http://example.com/2/", "Site 2");
141    webkit_web_back_forward_list_add_item(webBackForwardList, item2);
142    g_object_unref(item2);
143    g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, item2));
144
145    item3 = webkit_web_history_item_new_with_data("http://example.com/3/", "Site 3");
146    webkit_web_back_forward_list_add_item(webBackForwardList, item3);
147    g_object_unref(item3);
148    g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, item3));
149
150    item4 = webkit_web_history_item_new_with_data("http://example.com/4/", "Site 4");
151    webkit_web_back_forward_list_add_item(webBackForwardList, item4);
152    g_object_unref(item4);
153    g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, item4));
154
155    // check the back list order
156    backList = webkit_web_back_forward_list_get_back_list_with_limit(webBackForwardList, 5);
157    g_assert(backList);
158
159    currentItem = WEBKIT_WEB_HISTORY_ITEM(backList->data);
160    g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/3/");
161    g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 3");
162    backList = backList->next;
163
164    currentItem = WEBKIT_WEB_HISTORY_ITEM(backList->data);
165    g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/2/");
166    g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 2");
167    backList = backList->next;
168
169    currentItem = WEBKIT_WEB_HISTORY_ITEM(backList->data);
170    g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/1/");
171    g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 1");
172    g_list_free(backList);
173
174    // check the forward list order
175    g_assert(webkit_web_view_go_to_back_forward_item(webView, item1));
176    forwardList = webkit_web_back_forward_list_get_forward_list_with_limit(webBackForwardList,5);
177    g_assert(forwardList);
178
179    currentItem = WEBKIT_WEB_HISTORY_ITEM(forwardList->data);
180    g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/4/");
181    g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 4");
182    forwardList = forwardList->next;
183
184    currentItem = WEBKIT_WEB_HISTORY_ITEM(forwardList->data);
185    g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/3/");
186    g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 3");
187    forwardList = forwardList->next;
188
189    currentItem = WEBKIT_WEB_HISTORY_ITEM(forwardList->data);
190    g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/2/");
191    g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Site 2");
192
193    g_list_free(forwardList);
194    g_object_unref(webView);
195}
196
197static void test_webkit_web_back_forward_list_add_item(void)
198{
199    WebKitWebView* webView;
200    WebKitWebBackForwardList* webBackForwardList;
201    WebKitWebHistoryItem* addItem1;
202    WebKitWebHistoryItem* addItem2;
203    WebKitWebHistoryItem* backItem;
204    WebKitWebHistoryItem* currentItem;
205    g_test_bug("22988");
206
207    webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
208    g_object_ref_sink(webView);
209
210    webkit_web_view_set_maintains_back_forward_list(webView, TRUE);
211    webBackForwardList = webkit_web_view_get_back_forward_list(webView);
212    g_assert(webBackForwardList);
213
214    // Check that there is no item.
215    g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList));
216    g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0);
217    g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0);
218    g_assert(!webkit_web_view_can_go_forward(webView));
219    g_assert(!webkit_web_view_can_go_back(webView));
220
221    // Add a new item
222    addItem1 = webkit_web_history_item_new_with_data("http://example.com/", "Added site");
223    webkit_web_back_forward_list_add_item(webBackForwardList, addItem1);
224    g_object_unref(addItem1);
225    g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, addItem1));
226
227    // Check that the added item is the current item.
228    currentItem = webkit_web_back_forward_list_get_current_item(webBackForwardList);
229    g_assert(currentItem);
230    g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0);
231    g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0);
232    g_assert(!webkit_web_view_can_go_forward(webView));
233    g_assert(!webkit_web_view_can_go_back(webView));
234    g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/");
235    g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Added site");
236
237    // Add another item.
238    addItem2 = webkit_web_history_item_new_with_data("http://example.com/2/", "Added site 2");
239    webkit_web_back_forward_list_add_item(webBackForwardList, addItem2);
240    g_object_unref(addItem2);
241    g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, addItem2));
242
243    // Check that the added item is new current item.
244    currentItem = webkit_web_back_forward_list_get_current_item(webBackForwardList);
245    g_assert(currentItem);
246    g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0);
247    g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 1);
248    g_assert(!webkit_web_view_can_go_forward(webView));
249    g_assert(webkit_web_view_can_go_back(webView));
250    g_assert_cmpstr(webkit_web_history_item_get_uri(currentItem), ==, "http://example.com/2/");
251    g_assert_cmpstr(webkit_web_history_item_get_title(currentItem), ==, "Added site 2");
252
253    backItem = webkit_web_back_forward_list_get_back_item(webBackForwardList);
254    g_assert(backItem);
255    g_assert_cmpstr(webkit_web_history_item_get_uri(backItem), ==, "http://example.com/");
256    g_assert_cmpstr(webkit_web_history_item_get_title(backItem), ==, "Added site");
257
258    // Go to the first added item.
259    g_assert(webkit_web_view_go_to_back_forward_item(webView, addItem1));
260    g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 1);
261    g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0);
262    g_assert(webkit_web_view_can_go_forward(webView));
263    g_assert(!webkit_web_view_can_go_back(webView));
264
265    g_object_unref(webView);
266}
267
268static void test_webkit_web_back_forward_list_clear(void)
269{
270    WebKitWebView* webView;
271    WebKitWebBackForwardList* webBackForwardList;
272    WebKitWebHistoryItem* addItem;
273    g_test_bug("36173");
274
275    webView = WEBKIT_WEB_VIEW(webkit_web_view_new());
276    g_object_ref_sink(webView);
277
278    webBackForwardList = webkit_web_view_get_back_forward_list(webView);
279    g_assert(webBackForwardList);
280
281    // Check that there is no item.
282    g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0);
283    g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0);
284    g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList));
285    g_assert(!webkit_web_view_can_go_forward(webView));
286    g_assert(!webkit_web_view_can_go_back(webView));
287
288    // Check that clearing the empty list does not modify counters
289    webkit_web_back_forward_list_clear(webBackForwardList);
290    g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0);
291    g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0);
292    g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList));
293    g_assert(!webkit_web_view_can_go_forward(webView));
294    g_assert(!webkit_web_view_can_go_back(webView));
295
296    // Add a new item
297    addItem = webkit_web_history_item_new_with_data("http://example.com/", "Added site");
298    webkit_web_back_forward_list_add_item(webBackForwardList, addItem);
299    g_object_unref(addItem);
300    g_assert(webkit_web_back_forward_list_contains_item(webBackForwardList, addItem));
301
302    // Check that after clearing the list the added item is no longer in the list
303    webkit_web_back_forward_list_clear(webBackForwardList);
304    g_assert(!webkit_web_back_forward_list_contains_item(webBackForwardList, addItem));
305
306    // Check that after clearing it, the list is empty
307    g_assert_cmpint(webkit_web_back_forward_list_get_forward_length(webBackForwardList), ==, 0);
308    g_assert_cmpint(webkit_web_back_forward_list_get_back_length(webBackForwardList), ==, 0);
309    g_assert(!webkit_web_back_forward_list_get_current_item(webBackForwardList));
310    g_assert(!webkit_web_view_can_go_forward(webView));
311    g_assert(!webkit_web_view_can_go_back(webView));
312
313    g_object_unref(webView);
314}
315
316int main(int argc, char** argv)
317{
318    gtk_test_init(&argc, &argv, NULL);
319
320    g_test_bug_base("https://bugs.webkit.org/");
321    g_test_add_func("/webkit/webbackforwardlist/add_item", test_webkit_web_back_forward_list_add_item);
322    g_test_add_func("/webkit/webbackforwardlist/list_order", test_webkit_web_back_forward_list_order);
323    g_test_add_func("/webkit/webhistoryitem/lifetime", test_webkit_web_history_item_lifetime);
324    g_test_add_func("/webkit/webbackforwardlist/clear", test_webkit_web_back_forward_list_clear);
325    return g_test_run ();
326}
327