1/*
2 * Copyright (C) 2012 Intel Corporation. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
27
28#include "UnitTestUtils/EWK2UnitTestBase.h"
29#include "UnitTestUtils/EWK2UnitTestServer.h"
30#include "WKEinaSharedString.h"
31#include <wtf/OwnPtr.h>
32#include <wtf/PassOwnPtr.h>
33
34using namespace EWK2UnitTest;
35using namespace WTF;
36
37extern EWK2UnitTestEnvironment* environment;
38
39static const char title1[] = "Page1";
40static const char title2[] = "Page2";
41static const char title3[] = "Page3";
42
43static void serverCallbackNavigation(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
44{
45    if (message->method != SOUP_METHOD_GET) {
46        soup_message_set_status(message, SOUP_STATUS_NOT_IMPLEMENTED);
47        return;
48    }
49
50    soup_message_set_status(message, SOUP_STATUS_OK);
51
52    Eina_Strbuf* body = eina_strbuf_new();
53    eina_strbuf_append_printf(body, "<html><title>%s</title><body>%s</body></html>", path + 1, path + 1);
54    const size_t bodyLength = eina_strbuf_length_get(body);
55    soup_message_body_append(message->response_body, SOUP_MEMORY_TAKE, eina_strbuf_string_steal(body), bodyLength);
56    eina_strbuf_free(body);
57
58    soup_message_body_complete(message->response_body);
59}
60
61static inline void checkItem(Ewk_Back_Forward_List_Item* item, const char* title, const char* url, const char* originalURL)
62{
63    ASSERT_TRUE(item);
64    EXPECT_STREQ(url, ewk_back_forward_list_item_url_get(item));
65    EXPECT_STREQ(title, ewk_back_forward_list_item_title_get(item));
66    EXPECT_STREQ(originalURL, ewk_back_forward_list_item_original_url_get(item));
67}
68
69static inline WKEinaSharedString urlFromTitle(EWK2UnitTestServer* httpServer, const char* title)
70{
71    Eina_Strbuf* path = eina_strbuf_new();
72    eina_strbuf_append_printf(path, "/%s", title);
73    WKEinaSharedString res = httpServer->getURLForPath(eina_strbuf_string_get(path)).data();
74    eina_strbuf_free(path);
75
76    return res;
77}
78
79static inline void freeEinaList(Eina_List* list)
80{
81    void* data = 0;
82    EINA_LIST_FREE(list, data)
83        ewk_object_unref(static_cast<Ewk_Object*>(data));
84}
85
86TEST_F(EWK2UnitTestBase, ewk_back_forward_list_current_item_get)
87{
88    const char* url = environment->defaultTestPageUrl();
89    ASSERT_TRUE(loadUrlSync(url));
90    Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView());
91    ASSERT_TRUE(backForwardList);
92
93    Ewk_Back_Forward_List_Item* currentItem = ewk_back_forward_list_current_item_get(backForwardList);
94    checkItem(currentItem, ewk_view_title_get(webView()), url, url);
95
96    Ewk_Back_Forward_List_Item* anotherCurrentItem = ewk_back_forward_list_current_item_get(backForwardList);
97    ASSERT_EQ(currentItem, anotherCurrentItem);
98}
99
100TEST_F(EWK2UnitTestBase, ewk_back_forward_list_previous_item_get)
101{
102    OwnPtr<EWK2UnitTestServer> httpServer = adoptPtr(new EWK2UnitTestServer);
103    httpServer->run(serverCallbackNavigation);
104
105    WKEinaSharedString url1 = urlFromTitle(httpServer.get(), title1);
106    ASSERT_TRUE(loadUrlSync(url1));
107    ASSERT_STREQ(title1, ewk_view_title_get(webView()));
108
109    ASSERT_TRUE(loadUrlSync(urlFromTitle(httpServer.get(), title2)));
110    ASSERT_STREQ(title2, ewk_view_title_get(webView()));
111
112    Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView());
113    ASSERT_TRUE(backForwardList);
114
115    Ewk_Back_Forward_List_Item* previousItem = ewk_back_forward_list_previous_item_get(backForwardList);
116    checkItem(previousItem, title1, url1, url1);
117
118    Ewk_Back_Forward_List_Item* anotherPreviousItem = ewk_back_forward_list_previous_item_get(backForwardList);
119    ASSERT_EQ(previousItem, anotherPreviousItem);
120}
121
122TEST_F(EWK2UnitTestBase, ewk_back_forward_list_next_item_get)
123{
124    OwnPtr<EWK2UnitTestServer> httpServer = adoptPtr(new EWK2UnitTestServer);
125    httpServer->run(serverCallbackNavigation);
126
127    ASSERT_TRUE(loadUrlSync(urlFromTitle(httpServer.get(), title1)));
128    ASSERT_STREQ(title1, ewk_view_title_get(webView()));
129
130    WKEinaSharedString url2 = urlFromTitle(httpServer.get(), title2);
131    ASSERT_TRUE(loadUrlSync(url2));
132    ASSERT_STREQ(title2, ewk_view_title_get(webView()));
133
134    // Go back to Page1.
135    ewk_view_back(webView());
136    ASSERT_TRUE(waitUntilTitleChangedTo(title1));
137
138    Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView());
139    ASSERT_TRUE(backForwardList);
140
141    Ewk_Back_Forward_List_Item* nextItem = ewk_back_forward_list_next_item_get(backForwardList);
142    checkItem(nextItem, title2, url2, url2);
143
144    Ewk_Back_Forward_List_Item* anotherNextItem = ewk_back_forward_list_next_item_get(backForwardList);
145    ASSERT_EQ(nextItem, anotherNextItem);
146}
147
148TEST_F(EWK2UnitTestBase, ewk_back_forward_list_item_at_index_get)
149{
150    OwnPtr<EWK2UnitTestServer> httpServer = adoptPtr(new EWK2UnitTestServer);
151    httpServer->run(serverCallbackNavigation);
152
153    WKEinaSharedString url1 = urlFromTitle(httpServer.get(), title1);
154    ASSERT_TRUE(loadUrlSync(url1));
155    ASSERT_STREQ(title1, ewk_view_title_get(webView()));
156
157    ASSERT_TRUE(loadUrlSync(urlFromTitle(httpServer.get(), title2)));
158    ASSERT_STREQ(title2, ewk_view_title_get(webView()));
159
160    Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView());
161    ASSERT_TRUE(backForwardList);
162
163    Ewk_Back_Forward_List_Item* previousItem = ewk_back_forward_list_item_at_index_get(backForwardList, -1);
164    checkItem(previousItem, title1, url1, url1);
165
166    Ewk_Back_Forward_List_Item* anotherPreviousItem = ewk_back_forward_list_item_at_index_get(backForwardList, -1);
167    ASSERT_EQ(previousItem, anotherPreviousItem);
168
169    Ewk_Back_Forward_List_Item* nonExistingItem = ewk_back_forward_list_item_at_index_get(backForwardList, 10);
170    ASSERT_FALSE(nonExistingItem);
171}
172
173TEST_F(EWK2UnitTestBase, ewk_back_forward_list_count)
174{
175    OwnPtr<EWK2UnitTestServer> httpServer = adoptPtr(new EWK2UnitTestServer);
176    httpServer->run(serverCallbackNavigation);
177
178    ASSERT_TRUE(loadUrlSync(urlFromTitle(httpServer.get(), title1)));
179    ASSERT_STREQ(title1, ewk_view_title_get(webView()));
180
181    ASSERT_TRUE(loadUrlSync(urlFromTitle(httpServer.get(), title2)));
182    ASSERT_STREQ(title2, ewk_view_title_get(webView()));
183
184    Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView());
185    ASSERT_TRUE(backForwardList);
186
187    EXPECT_EQ(2, ewk_back_forward_list_count(backForwardList));
188}
189
190TEST_F(EWK2UnitTestBase, ewk_back_forward_list_n_back_items_copy)
191{
192    OwnPtr<EWK2UnitTestServer> httpServer = adoptPtr(new EWK2UnitTestServer);
193    httpServer->run(serverCallbackNavigation);
194
195    WKEinaSharedString url1 = urlFromTitle(httpServer.get(), title1);
196    ASSERT_TRUE(loadUrlSync(url1));
197    ASSERT_STREQ(title1, ewk_view_title_get(webView()));
198
199    WKEinaSharedString url2 = urlFromTitle(httpServer.get(), title2);
200    ASSERT_TRUE(loadUrlSync(url2));
201    ASSERT_STREQ(title2, ewk_view_title_get(webView()));
202
203    ASSERT_TRUE(loadUrlSync(urlFromTitle(httpServer.get(), title3)));
204    ASSERT_STREQ(title3, ewk_view_title_get(webView()));
205
206    Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView());
207    ASSERT_TRUE(backForwardList);
208
209    Eina_List* backList = ewk_back_forward_list_n_back_items_copy(backForwardList, 1);
210    ASSERT_TRUE(backList);
211    ASSERT_EQ(1, eina_list_count(backList));
212    checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(backList, 0)), title2, url2, url2);
213    freeEinaList(backList);
214
215    // Check '0' limit.
216    backList = ewk_back_forward_list_n_back_items_copy(backForwardList, 0);
217    ASSERT_FALSE(backList);
218
219    backList = ewk_back_forward_list_n_back_items_copy(backForwardList, -1);
220    ASSERT_TRUE(backList);
221    ASSERT_EQ(2, eina_list_count(backList));
222    checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(backList, 0)), title1, url1, url1);
223    checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(backList, 1)), title2, url2, url2);
224    freeEinaList(backList);
225}
226
227TEST_F(EWK2UnitTestBase, ewk_back_forward_list_n_forward_items_copy)
228{
229    OwnPtr<EWK2UnitTestServer> httpServer = adoptPtr(new EWK2UnitTestServer);
230    httpServer->run(serverCallbackNavigation);
231
232    ASSERT_TRUE(loadUrlSync(urlFromTitle(httpServer.get(), title1)));
233    ASSERT_STREQ(title1, ewk_view_title_get(webView()));
234
235    WKEinaSharedString url2 = urlFromTitle(httpServer.get(), title2);
236    ASSERT_TRUE(loadUrlSync(url2));
237    ASSERT_STREQ(title2, ewk_view_title_get(webView()));
238
239    WKEinaSharedString url3 = urlFromTitle(httpServer.get(), title3);
240    ASSERT_TRUE(loadUrlSync(url3));
241    ASSERT_STREQ(title3, ewk_view_title_get(webView()));
242
243    // Go back to Page1.
244    ewk_view_back(webView());
245    ASSERT_TRUE(waitUntilTitleChangedTo(title2));
246    ewk_view_back(webView());
247    ASSERT_TRUE(waitUntilTitleChangedTo(title1));
248
249    Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView());
250    ASSERT_TRUE(backForwardList);
251
252    Eina_List* forwardList = ewk_back_forward_list_n_forward_items_copy(backForwardList, 1);
253    ASSERT_TRUE(forwardList);
254    ASSERT_EQ(1, eina_list_count(forwardList));
255    checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(forwardList, 0)), title2, url2, url2);
256    freeEinaList(forwardList);
257
258    // Check '0' limit.
259    forwardList = ewk_back_forward_list_n_forward_items_copy(backForwardList, 0);
260    ASSERT_FALSE(forwardList);
261
262    forwardList = ewk_back_forward_list_n_forward_items_copy(backForwardList, -1);
263    ASSERT_TRUE(forwardList);
264    ASSERT_EQ(2, eina_list_count(forwardList));
265    checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(forwardList, 0)), title2, url2, url2);
266    checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(forwardList, 1)), title3, url3, url3);
267    freeEinaList(forwardList);
268}
269