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