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 32using namespace EWK2UnitTest; 33using namespace WTF; 34 35extern EWK2UnitTestEnvironment* environment; 36 37static const char title1[] = "Page1"; 38static const char title2[] = "Page2"; 39static const char title3[] = "Page3"; 40 41static void serverCallbackNavigation(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer) 42{ 43 if (message->method != SOUP_METHOD_GET) { 44 soup_message_set_status(message, SOUP_STATUS_NOT_IMPLEMENTED); 45 return; 46 } 47 48 soup_message_set_status(message, SOUP_STATUS_OK); 49 50 Eina_Strbuf* body = eina_strbuf_new(); 51 eina_strbuf_append_printf(body, "<html><title>%s</title><body>%s</body></html>", path + 1, path + 1); 52 const size_t bodyLength = eina_strbuf_length_get(body); 53 soup_message_body_append(message->response_body, SOUP_MEMORY_TAKE, eina_strbuf_string_steal(body), bodyLength); 54 eina_strbuf_free(body); 55 56 soup_message_body_complete(message->response_body); 57} 58 59class EWK2BackForwardListTest : public EWK2UnitTestBase { 60protected: 61 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 69 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 79 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}; 86 87TEST_F(EWK2BackForwardListTest, ewk_back_forward_list_current_item_get) 88{ 89 const char* url = environment->defaultTestPageUrl(); 90 ASSERT_TRUE(loadUrlSync(url)); 91 Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView()); 92 ASSERT_TRUE(backForwardList); 93 94 Ewk_Back_Forward_List_Item* currentItem = ewk_back_forward_list_current_item_get(backForwardList); 95 checkItem(currentItem, ewk_view_title_get(webView()), url, url); 96 97 Ewk_Back_Forward_List_Item* anotherCurrentItem = ewk_back_forward_list_current_item_get(backForwardList); 98 ASSERT_EQ(currentItem, anotherCurrentItem); 99} 100 101TEST_F(EWK2BackForwardListTest, ewk_back_forward_list_previous_item_get) 102{ 103 WKEinaSharedString url1 = environment->urlForResource("/Page1.html").data(); 104 ewk_view_url_set(webView(), url1); 105 ASSERT_TRUE(waitUntilTitleChangedTo(title1)); 106 ASSERT_STREQ(title1, ewk_view_title_get(webView())); 107 108 ewk_view_url_set(webView(), environment->urlForResource("/Page2.html").data()); 109 ASSERT_TRUE(waitUntilTitleChangedTo(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(EWK2BackForwardListTest, ewk_back_forward_list_next_item_get) 123{ 124 ewk_view_url_set(webView(), environment->urlForResource("/Page1.html").data()); 125 ASSERT_TRUE(waitUntilTitleChangedTo(title1)); 126 ASSERT_STREQ(title1, ewk_view_title_get(webView())); 127 128 WKEinaSharedString url2 = environment->urlForResource("/Page2.html").data(); 129 ewk_view_url_set(webView(), url2); 130 ASSERT_TRUE(waitUntilTitleChangedTo(title2)); 131 ASSERT_STREQ(title2, ewk_view_title_get(webView())); 132 133 // Go back to Page1. 134 ewk_view_back(webView()); 135 ASSERT_TRUE(waitUntilTitleChangedTo(title1)); 136 137 Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView()); 138 ASSERT_TRUE(backForwardList); 139 140 Ewk_Back_Forward_List_Item* nextItem = ewk_back_forward_list_next_item_get(backForwardList); 141 checkItem(nextItem, title2, url2, url2); 142 143 Ewk_Back_Forward_List_Item* anotherNextItem = ewk_back_forward_list_next_item_get(backForwardList); 144 ASSERT_EQ(nextItem, anotherNextItem); 145} 146 147TEST_F(EWK2BackForwardListTest, ewk_back_forward_list_item_at_index_get) 148{ 149 WKEinaSharedString url1 = environment->urlForResource("/Page1.html").data(); 150 ewk_view_url_set(webView(), url1); 151 ASSERT_TRUE(waitUntilTitleChangedTo(title1)); 152 ASSERT_STREQ(title1, ewk_view_title_get(webView())); 153 154 ewk_view_url_set(webView(), environment->urlForResource("/Page2.html").data()); 155 ASSERT_TRUE(waitUntilTitleChangedTo(title2)); 156 ASSERT_STREQ(title2, ewk_view_title_get(webView())); 157 158 Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView()); 159 ASSERT_TRUE(backForwardList); 160 161 Ewk_Back_Forward_List_Item* previousItem = ewk_back_forward_list_item_at_index_get(backForwardList, -1); 162 checkItem(previousItem, title1, url1, url1); 163 164 Ewk_Back_Forward_List_Item* anotherPreviousItem = ewk_back_forward_list_item_at_index_get(backForwardList, -1); 165 ASSERT_EQ(previousItem, anotherPreviousItem); 166 167 Ewk_Back_Forward_List_Item* nonExistingItem = ewk_back_forward_list_item_at_index_get(backForwardList, 10); 168 ASSERT_FALSE(nonExistingItem); 169} 170 171TEST_F(EWK2BackForwardListTest, ewk_back_forward_list_count) 172{ 173 ewk_view_url_set(webView(), environment->urlForResource("/Page1.html").data()); 174 ASSERT_TRUE(waitUntilTitleChangedTo(title1)); 175 ASSERT_STREQ(title1, ewk_view_title_get(webView())); 176 177 ewk_view_url_set(webView(), environment->urlForResource("/Page2.html").data()); 178 ASSERT_TRUE(waitUntilTitleChangedTo(title2)); 179 ASSERT_STREQ(title2, ewk_view_title_get(webView())); 180 181 Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView()); 182 ASSERT_TRUE(backForwardList); 183 184 EXPECT_EQ(2, ewk_back_forward_list_count(backForwardList)); 185} 186 187TEST_F(EWK2BackForwardListTest, ewk_back_forward_list_n_back_items_copy) 188{ 189 WKEinaSharedString url1 = environment->urlForResource("/Page1.html").data(); 190 ewk_view_url_set(webView(), url1); 191 ASSERT_TRUE(waitUntilTitleChangedTo(title1)); 192 ASSERT_STREQ(title1, ewk_view_title_get(webView())); 193 194 WKEinaSharedString url2 = environment->urlForResource("/Page2.html").data(); 195 ewk_view_url_set(webView(), url2); 196 ASSERT_TRUE(waitUntilTitleChangedTo(title2)); 197 ASSERT_STREQ(title2, ewk_view_title_get(webView())); 198 199 ewk_view_url_set(webView(), environment->urlForResource("/Page3.html").data()); 200 ASSERT_TRUE(waitUntilTitleChangedTo(title3)); 201 ASSERT_STREQ(title3, ewk_view_title_get(webView())); 202 203 Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView()); 204 ASSERT_TRUE(backForwardList); 205 206 Eina_List* backList = ewk_back_forward_list_n_back_items_copy(backForwardList, 1); 207 ASSERT_TRUE(backList); 208 ASSERT_EQ(1, eina_list_count(backList)); 209 checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(backList, 0)), title2, url2, url2); 210 freeEinaList(backList); 211 212 // Check '0' limit. 213 backList = ewk_back_forward_list_n_back_items_copy(backForwardList, 0); 214 ASSERT_FALSE(backList); 215 216 backList = ewk_back_forward_list_n_back_items_copy(backForwardList, -1); 217 ASSERT_TRUE(backList); 218 ASSERT_EQ(2, eina_list_count(backList)); 219 checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(backList, 0)), title1, url1, url1); 220 checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(backList, 1)), title2, url2, url2); 221 freeEinaList(backList); 222} 223 224TEST_F(EWK2BackForwardListTest, ewk_back_forward_list_n_forward_items_copy) 225{ 226 ewk_view_url_set(webView(), environment->urlForResource("/Page1.html").data()); 227 ASSERT_TRUE(waitUntilTitleChangedTo(title1)); 228 ASSERT_STREQ(title1, ewk_view_title_get(webView())); 229 230 WKEinaSharedString url2 = environment->urlForResource("/Page2.html").data(); 231 ewk_view_url_set(webView(), url2); 232 ASSERT_TRUE(waitUntilTitleChangedTo(title2)); 233 ASSERT_STREQ(title2, ewk_view_title_get(webView())); 234 235 WKEinaSharedString url3 = environment->urlForResource("/Page3.html").data(); 236 ewk_view_url_set(webView(), url3); 237 ASSERT_TRUE(waitUntilTitleChangedTo(title3)); 238 ASSERT_STREQ(title3, ewk_view_title_get(webView())); 239 240 // Go back to Page1. 241 ewk_view_back(webView()); 242 ASSERT_TRUE(waitUntilTitleChangedTo(title2)); 243 ewk_view_back(webView()); 244 ASSERT_TRUE(waitUntilTitleChangedTo(title1)); 245 246 Ewk_Back_Forward_List* backForwardList = ewk_view_back_forward_list_get(webView()); 247 ASSERT_TRUE(backForwardList); 248 249 Eina_List* forwardList = ewk_back_forward_list_n_forward_items_copy(backForwardList, 1); 250 ASSERT_TRUE(forwardList); 251 ASSERT_EQ(1, eina_list_count(forwardList)); 252 checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(forwardList, 0)), title2, url2, url2); 253 freeEinaList(forwardList); 254 255 // Check '0' limit. 256 forwardList = ewk_back_forward_list_n_forward_items_copy(backForwardList, 0); 257 ASSERT_FALSE(forwardList); 258 259 forwardList = ewk_back_forward_list_n_forward_items_copy(backForwardList, -1); 260 ASSERT_TRUE(forwardList); 261 ASSERT_EQ(2, eina_list_count(forwardList)); 262 checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(forwardList, 0)), title2, url2, url2); 263 checkItem(static_cast<Ewk_Back_Forward_List_Item*>(eina_list_nth(forwardList, 1)), title3, url3, url3); 264 freeEinaList(forwardList); 265} 266