1/* 2 Copyright (C) 2012 Samsung Electronics 3 Copyright (C) 2012 Intel Corporation. All rights reserved. 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 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 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public License 16 along with this library; if not, write to the Free Software Foundation, 17 Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18*/ 19 20#include "config.h" 21 22#include "UnitTestUtils/EWK2UnitTestBase.h" 23#include "UnitTestUtils/EWK2UnitTestServer.h" 24#include <wtf/text/CString.h> 25#include <wtf/text/WTFString.h> 26 27using namespace EWK2UnitTest; 28 29extern EWK2UnitTestEnvironment* environment; 30 31static bool fullScreenCallbackCalled; 32static bool obtainedPageContents = false; 33static bool scriptExecuteCallbackCalled; 34 35static struct { 36 const char* expectedMessage; 37 bool called; 38} alertCallbackData; 39 40static struct { 41 const char* expectedMessage; 42 bool result; 43 bool called; 44} confirmCallbackData; 45 46static struct { 47 const char* expectedMessage; 48 const char* expectedDefaultValue; 49 const char* result; 50 bool called; 51} promptCallbackData; 52 53class EWK2ViewTest : public EWK2UnitTestBase { 54public: 55 struct VibrationCbData { 56 bool didReceiveVibrate; // Whether the vibration event received. 57 bool didReceiveCancelVibration; // Whether the cancel vibration event received. 58 bool testFinished; 59 unsigned vibrateCalledCount; // Vibrate callbacks count. 60 unsigned expectedVibrationTime; // Expected vibration time. 61 }; 62 63 static void onLoadFinishedForRedirection(void* userData, Evas_Object*, void*) 64 { 65 int* countLoadFinished = static_cast<int*>(userData); 66 (*countLoadFinished)--; 67 } 68 69 static void serverCallbackNavigation(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer) 70 { 71 if (message->method != SOUP_METHOD_GET) { 72 soup_message_set_status(message, SOUP_STATUS_NOT_IMPLEMENTED); 73 return; 74 } 75 76 soup_message_set_status(message, SOUP_STATUS_OK); 77 78 Eina_Strbuf* body = eina_strbuf_new(); 79 eina_strbuf_append_printf(body, "<html><title>%s</title><body>%s</body></html>", path + 1, path + 1); 80 const size_t bodyLength = eina_strbuf_length_get(body); 81 soup_message_body_append(message->response_body, SOUP_MEMORY_TAKE, eina_strbuf_string_steal(body), bodyLength); 82 eina_strbuf_free(body); 83 84 soup_message_body_complete(message->response_body); 85 } 86 87 static void onFormAboutToBeSubmitted(void* userData, Evas_Object*, void* eventInfo) 88 { 89 Ewk_Form_Submission_Request* request = static_cast<Ewk_Form_Submission_Request*>(eventInfo); 90 bool* handled = static_cast<bool*>(userData); 91 92 ASSERT_TRUE(request); 93 94 Eina_List* fieldNames = ewk_form_submission_request_field_names_get(request); 95 ASSERT_TRUE(fieldNames); 96 ASSERT_EQ(3, eina_list_count(fieldNames)); 97 void* data; 98 EINA_LIST_FREE(fieldNames, data) 99 eina_stringshare_del(static_cast<char*>(data)); 100 101 const char* value1 = ewk_form_submission_request_field_value_get(request, "text1"); 102 ASSERT_STREQ("value1", value1); 103 eina_stringshare_del(value1); 104 const char* value2 = ewk_form_submission_request_field_value_get(request, "text2"); 105 ASSERT_STREQ("value2", value2); 106 eina_stringshare_del(value2); 107 const char* password = ewk_form_submission_request_field_value_get(request, "password"); 108 ASSERT_STREQ("secret", password); 109 eina_stringshare_del(password); 110 111 *handled = true; 112 } 113 114 static Eina_Bool fullScreenCallback(Ewk_View_Smart_Data* smartData, Ewk_Security_Origin*) 115 { 116 fullScreenCallbackCalled = true; 117 return false; 118 } 119 120 static Eina_Bool fullScreenExitCallback(Ewk_View_Smart_Data* smartData) 121 { 122 fullScreenCallbackCalled = true; 123 return false; 124 } 125 126 static void checkAlert(Ewk_View_Smart_Data*, const char* message) 127 { 128 alertCallbackData.called = true; 129 EXPECT_STREQ(message, alertCallbackData.expectedMessage); 130 } 131 132 static Eina_Bool checkConfirm(Ewk_View_Smart_Data*, const char* message) 133 { 134 confirmCallbackData.called = true; 135 EXPECT_STREQ(message, confirmCallbackData.expectedMessage); 136 return confirmCallbackData.result; 137 } 138 139 static const char* checkPrompt(Ewk_View_Smart_Data*, const char* message, const char* defaultValue) 140 { 141 promptCallbackData.called = true; 142 EXPECT_STREQ(message, promptCallbackData.expectedMessage); 143 EXPECT_STREQ(defaultValue, promptCallbackData.expectedDefaultValue); 144 145 if (!promptCallbackData.result) 146 return 0; 147 148 return eina_stringshare_add(promptCallbackData.result); 149 } 150 151 static void onTextFound(void* userData, Evas_Object*, void* eventInfo) 152 { 153 int* result = static_cast<int*>(userData); 154 unsigned* matchCount = static_cast<unsigned*>(eventInfo); 155 156 *result = *matchCount; 157 } 158 159 static void onVibrate(void* userData, Evas_Object*, void* eventInfo) 160 { 161 VibrationCbData* data = static_cast<VibrationCbData*>(userData); 162 unsigned* vibrationTime = static_cast<unsigned*>(eventInfo); 163 if (*vibrationTime == data->expectedVibrationTime) { 164 data->didReceiveVibrate = true; 165 data->testFinished = true; 166 } 167 data->vibrateCalledCount++; 168 } 169 170 static void onCancelVibration(void* userData, Evas_Object*, void*) 171 { 172 VibrationCbData* data = static_cast<VibrationCbData*>(userData); 173 data->didReceiveCancelVibration = true; 174 data->testFinished = true; 175 } 176 177 static void loadVibrationHTMLString(Evas_Object* webView, const char* vibrationPattern, VibrationCbData* data) 178 { 179 const char* content = 180 "<html><head><script type='text/javascript'>function vibrate() { navigator.vibrate(%s);" 181 " document.title = \"Loaded\"; }</script></head><body onload='vibrate()'></body></html>"; 182 183 data->didReceiveVibrate = false; 184 data->didReceiveCancelVibration = false; 185 data->vibrateCalledCount = 0; 186 data->testFinished = false; 187 Eina_Strbuf* buffer = eina_strbuf_new(); 188 eina_strbuf_append_printf(buffer, content, vibrationPattern); 189 ewk_view_html_string_load(webView, eina_strbuf_string_get(buffer), 0, 0); 190 eina_strbuf_free(buffer); 191 } 192 193 static void onContentsSizeChangedPortrait(void* userData, Evas_Object*, void* eventInfo) 194 { 195 bool* result = static_cast<bool*>(userData); 196 Ewk_CSS_Size* size = static_cast<Ewk_CSS_Size*>(eventInfo); 197 if (size->w == 2000 && size->h == 3000) 198 *result = true; 199 } 200 201 static void onContentsSizeChangedLandscape(void* userData, Evas_Object*, void* eventInfo) 202 { 203 bool* result = static_cast<bool*>(userData); 204 Ewk_CSS_Size* size = static_cast<Ewk_CSS_Size*>(eventInfo); 205 if (size->w == 3000 && size->h == 2000) 206 *result = true; 207 } 208 209 static void PageContentsAsMHTMLCallback(Ewk_Page_Contents_Type type, const char* data, void*) 210 { 211 // Check the type 212 ASSERT_EQ(EWK_PAGE_CONTENTS_TYPE_MHTML, type); 213 214 // We should have exactly the same amount of bytes in the file 215 // than those coming from the callback data. We don't compare the 216 // strings read since the 'Date' field and the boundaries will be 217 // different on each case. MHTML functionality will be tested by 218 // layout tests, so checking the amount of bytes is enough. 219 Eina_File* f = eina_file_open(TEST_RESOURCES_DIR "/resultMHTML.mht", false); 220 if (!f) 221 return; 222 223 size_t fileSize = eina_file_size_get(f); 224 // As the day in 'Date' field may be one digit or two digit, the data length may also be varied by one byte. 225 EXPECT_TRUE(String(data).length() == fileSize || String(data).length() == fileSize + 1); 226 227 obtainedPageContents = true; 228 eina_file_close(f); 229 } 230 231 static void PageContentsAsStringCallback(Ewk_Page_Contents_Type type, const char* data, void*) 232 { 233 // Check the type. 234 ASSERT_EQ(EWK_PAGE_CONTENTS_TYPE_STRING, type); 235 236 // The variable data should be "Simple HTML". 237 ASSERT_STREQ("Simple HTML", data); 238 239 obtainedPageContents = true; 240 } 241}; 242 243TEST_F(EWK2ViewTest, ewk_view_type_check) 244{ 245 ASSERT_FALSE(ewk_view_context_get(0)); 246 247 Evas_Object* rectangle = evas_object_rectangle_add(canvas()); 248 ASSERT_FALSE(ewk_view_url_set(rectangle, 0)); 249} 250 251TEST_F(EWK2ViewTest, ewk_view_add) 252{ 253 Evas_Object* view = ewk_view_add(canvas()); 254 ASSERT_EQ(ewk_context_default_get(), ewk_view_context_get(view)); 255 256 EXPECT_TRUE(ewk_view_stop(view)); 257 evas_object_del(view); 258} 259 260TEST_F(EWK2ViewTest, ewk_view_url_get) 261{ 262 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 263 EXPECT_STREQ(environment->defaultTestPageUrl(), ewk_view_url_get(webView())); 264 265 int countLoadFinished = 2; 266 evas_object_smart_callback_add(webView(), "load,finished", onLoadFinishedForRedirection, &countLoadFinished); 267 ewk_view_url_set(webView(), environment->urlForResource("redirect_url_to_default.html").data()); 268 while (countLoadFinished) 269 ecore_main_loop_iterate(); 270 evas_object_smart_callback_del(webView(), "load,finished", onLoadFinishedForRedirection); 271 EXPECT_STREQ(environment->defaultTestPageUrl(), ewk_view_url_get(webView())); 272} 273 274TEST_F(EWK2ViewTest, ewk_view_device_pixel_ratio) 275{ 276 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 277 278 // Default pixel ratio is 1.0 279 ASSERT_FLOAT_EQ(1, ewk_view_device_pixel_ratio_get(webView())); 280 281 ASSERT_TRUE(ewk_view_device_pixel_ratio_set(webView(), 1.2)); 282 ASSERT_FLOAT_EQ(1.2, ewk_view_device_pixel_ratio_get(webView())); 283 284 ASSERT_TRUE(ewk_view_device_pixel_ratio_set(webView(), 1)); 285 ASSERT_FLOAT_EQ(1, ewk_view_device_pixel_ratio_get(webView())); 286} 287 288TEST_F(EWK2ViewTest, ewk_view_html_string_load) 289{ 290 ewk_view_html_string_load(webView(), "<html><head><title>Foo</title></head><body>Bar</body></html>", 0, 0); 291 ASSERT_TRUE(waitUntilTitleChangedTo("Foo")); 292 ASSERT_STREQ("Foo", ewk_view_title_get(webView())); 293 ewk_view_html_string_load(webView(), "<html><head><title>Bar</title></head><body>Foo</body></html>", 0, 0); 294 ASSERT_TRUE(waitUntilTitleChangedTo("Bar")); 295 ASSERT_STREQ("Bar", ewk_view_title_get(webView())); 296 297 // Checking in case of null for html and webview 298 ASSERT_FALSE(ewk_view_html_string_load(0, "<html><head><title>Foo</title></head><body>Bar</body></html>", 0, 0)); 299 ASSERT_FALSE(ewk_view_html_string_load(webView(), 0, 0, 0)); 300} 301 302TEST_F(EWK2ViewTest, ewk_view_navigation) 303{ 304 // Visit Page1 305 ewk_view_url_set(webView(), environment->urlForResource("/Page1.html").data()); 306 ASSERT_TRUE(waitUntilTitleChangedTo("Page1")); 307 ASSERT_STREQ("Page1", ewk_view_title_get(webView())); 308 ASSERT_FALSE(ewk_view_back_possible(webView())); 309 ASSERT_FALSE(ewk_view_forward_possible(webView())); 310 311 // Visit Page2 312 ewk_view_url_set(webView(), environment->urlForResource("/Page2.html").data()); 313 ASSERT_TRUE(waitUntilTitleChangedTo("Page2")); 314 ASSERT_STREQ("Page2", ewk_view_title_get(webView())); 315 ASSERT_TRUE(ewk_view_back_possible(webView())); 316 ASSERT_FALSE(ewk_view_forward_possible(webView())); 317 318 // Go back to Page1 319 ewk_view_back(webView()); 320 ASSERT_TRUE(waitUntilTitleChangedTo("Page1")); 321 ASSERT_STREQ("Page1", ewk_view_title_get(webView())); 322 ASSERT_FALSE(ewk_view_back_possible(webView())); 323 ASSERT_TRUE(ewk_view_forward_possible(webView())); 324 325 // Go forward to Page2 326 ewk_view_forward(webView()); 327 ASSERT_TRUE(waitUntilTitleChangedTo("Page2")); 328 ASSERT_STREQ("Page2", ewk_view_title_get(webView())); 329 ASSERT_TRUE(ewk_view_back_possible(webView())); 330 ASSERT_FALSE(ewk_view_forward_possible(webView())); 331 332 // Visit Page3 333 ewk_view_url_set(webView(), environment->urlForResource("/Page3.html").data()); 334 ASSERT_TRUE(waitUntilTitleChangedTo("Page3")); 335 ASSERT_STREQ("Page3", ewk_view_title_get(webView())); 336 ASSERT_TRUE(ewk_view_back_possible(webView())); 337 ASSERT_FALSE(ewk_view_forward_possible(webView())); 338 339 Ewk_Back_Forward_List* list = ewk_view_back_forward_list_get(webView()); 340 ASSERT_EQ(3, ewk_back_forward_list_count(list)); 341 342 // Navigate to Page1 343 ewk_view_navigate_to(webView(), ewk_back_forward_list_item_at_index_get(list, -2)); 344 ASSERT_TRUE(waitUntilTitleChangedTo("Page1")); 345 ASSERT_STREQ("Page1", ewk_view_title_get(webView())); 346 347 // Navigate to Page3 348 ewk_view_navigate_to(webView(), ewk_back_forward_list_item_at_index_get(list, 2)); 349 ASSERT_TRUE(waitUntilTitleChangedTo("Page3")); 350 ASSERT_STREQ("Page3", ewk_view_title_get(webView())); 351} 352 353TEST_F(EWK2ViewTest, ewk_view_custom_encoding) 354{ 355 ASSERT_FALSE(ewk_view_custom_encoding_get(webView())); 356 ASSERT_TRUE(ewk_view_custom_encoding_set(webView(), "UTF-8")); 357 ASSERT_STREQ("UTF-8", ewk_view_custom_encoding_get(webView())); 358 // Set the default charset. 359 ASSERT_TRUE(ewk_view_custom_encoding_set(webView(), 0)); 360 ASSERT_FALSE(ewk_view_custom_encoding_get(webView())); 361} 362 363TEST_F(EWK2ViewTest, ewk_view_form_submission_request) 364{ 365 const char* formHTML = 366 "<html><head><script type='text/javascript'>function submitForm() { document.getElementById('myform').submit(); }</script></head>" 367 "<body onload='submitForm()'>" 368 " <form id='myform' action='#'>" 369 " <input type='text' name='text1' value='value1'>" 370 " <input type='text' name='text2' value='value2'>" 371 " <input type='password' name='password' value='secret'>" 372 " <textarea cols='5' rows='5' name='textarea'>Text</textarea>" 373 " <input type='hidden' name='hidden1' value='hidden1'>" 374 " <input type='submit' value='Submit'>" 375 " </form>" 376 "</body></html>"; 377 378 ewk_view_html_string_load(webView(), formHTML, "file:///", 0); 379 bool handled = false; 380 evas_object_smart_callback_add(webView(), "form,submission,request", onFormAboutToBeSubmitted, &handled); 381 ASSERT_TRUE(waitUntilTrue(handled)); 382 evas_object_smart_callback_del(webView(), "form,submission,request", onFormAboutToBeSubmitted); 383} 384 385TEST_F(EWK2ViewTest, ewk_view_theme_set) 386{ 387 const char* buttonHTML = "<html><body><input type='button' id='btn'>" 388 "<script>document.title=document.getElementById('btn').clientWidth;</script>" 389 "</body></html>"; 390 391 ewk_view_html_string_load(webView(), buttonHTML, "file:///", 0); 392 EXPECT_TRUE(waitUntilTitleChangedTo("30")); // button of default theme has 30px as padding (15 to -16) 393 394 ewk_view_theme_set(webView(), environment->pathForResource("it_does_not_exist.edj").data()); 395 ewk_view_html_string_load(webView(), buttonHTML, "file:///", 0); 396 EXPECT_TRUE(waitUntilTitleChangedTo("30")); // the result should be same as default theme 397 398 ewk_view_theme_set(webView(), environment->pathForResource("empty_theme.edj").data()); 399 ewk_view_html_string_load(webView(), buttonHTML, "file:///", 0); 400 EXPECT_TRUE(waitUntilTitleChangedTo("30")); // the result should be same as default theme 401 402 ewk_view_theme_set(webView(), environment->pathForTheme("big_button_theme.edj").data()); 403 ewk_view_html_string_load(webView(), buttonHTML, "file:///", 0); 404 EXPECT_TRUE(waitUntilTitleChangedTo("299")); // button of big button theme has 299px as padding (15 to -285) 405 406 EXPECT_STREQ(environment->pathForTheme("big_button_theme.edj").data(), ewk_view_theme_get(webView())); 407} 408 409TEST_F(EWK2ViewTest, ewk_view_mouse_events_enabled) 410{ 411 ASSERT_TRUE(ewk_view_mouse_events_enabled_set(webView(), EINA_TRUE)); 412 ASSERT_TRUE(ewk_view_mouse_events_enabled_get(webView())); 413 414 ASSERT_TRUE(ewk_view_mouse_events_enabled_set(webView(), 2)); 415 ASSERT_TRUE(ewk_view_mouse_events_enabled_get(webView())); 416 417 ASSERT_TRUE(ewk_view_mouse_events_enabled_set(webView(), EINA_FALSE)); 418 ASSERT_FALSE(ewk_view_mouse_events_enabled_get(webView())); 419} 420 421TEST_F(EWK2ViewTest, ewk_view_full_screen_enter) 422{ 423 const char fullscreenHTML[] = 424 "<!doctype html><head><script>function makeFullScreen(){" 425 "var div = document.getElementById(\"fullscreen\");" 426 "div.webkitRequestFullScreen();" 427 "document.title = \"fullscreen entered\";" 428 "}</script></head>" 429 "<body><div id=\"fullscreen\" style=\"width:100px; height:100px\" onclick=\"makeFullScreen()\"></div></body>"; 430 431 ewkViewClass()->fullscreen_enter = fullScreenCallback; 432 433 ewk_view_html_string_load(webView(), fullscreenHTML, "file:///", 0); 434 ASSERT_TRUE(waitUntilLoadFinished()); 435 mouseClick(50, 50); 436 ASSERT_TRUE(waitUntilTitleChangedTo("fullscreen entered")); 437 ASSERT_TRUE(fullScreenCallbackCalled); 438} 439 440TEST_F(EWK2ViewTest, ewk_view_full_screen_exit) 441{ 442 const char fullscreenHTML[] = 443 "<!doctype html><head><script>function makeFullScreenAndExit(){" 444 "var div = document.getElementById(\"fullscreen\");" 445 "div.webkitRequestFullScreen();" 446 "document.webkitCancelFullScreen();" 447 "document.title = \"fullscreen exited\";" 448 "}</script></head>" 449 "<body><div id=\"fullscreen\" style=\"width:100px; height:100px\" onclick=\"makeFullScreenAndExit()\"></div></body>"; 450 451 ewkViewClass()->fullscreen_exit = fullScreenExitCallback; 452 453 ewk_view_html_string_load(webView(), fullscreenHTML, "file:///", 0); 454 ASSERT_TRUE(waitUntilLoadFinished()); 455 mouseClick(50, 50); 456 ASSERT_TRUE(waitUntilTitleChangedTo("fullscreen exited")); 457 ASSERT_TRUE(fullScreenCallbackCalled); 458} 459 460TEST_F(EWK2ViewTest, ewk_view_cancel_full_screen_request) 461{ 462 // FullScreenmanager should skip cancel fullscreen request if fullscreen 463 // mode was not set using FullScreen API. 464 ASSERT_FALSE(ewk_view_fullscreen_exit(webView())); 465} 466 467TEST_F(EWK2ViewTest, ewk_view_same_page_navigation) 468{ 469 // Tests that same page navigation updates the page URL. 470 String testUrl = environment->urlForResource("same_page_navigation.html").data(); 471 ASSERT_TRUE(loadUrlSync(testUrl.utf8().data())); 472 ASSERT_STREQ(testUrl.utf8().data(), ewk_view_url_get(webView())); 473 mouseClick(50, 50); 474 testUrl = testUrl + '#'; 475 ASSERT_TRUE(waitUntilURLChangedTo(testUrl.utf8().data())); 476} 477 478TEST_F(EWK2ViewTest, ewk_view_title_changed) 479{ 480 const char* titleChangedHTML = 481 "<!doctype html><head><title>Title before changed</title></head>" 482 "<body onload=\"document.title='Title after changed';\"></body>"; 483 ewk_view_html_string_load(webView(), titleChangedHTML, 0, 0); 484 EXPECT_TRUE(waitUntilTitleChangedTo("Title after changed")); 485 EXPECT_STREQ("Title after changed", ewk_view_title_get(webView())); 486 487 titleChangedHTML = 488 "<!doctype html><head><title>Title before changed</title></head>" 489 "<body onload=\"document.title='';\"></body>"; 490 ewk_view_html_string_load(webView(), titleChangedHTML, 0, 0); 491 EXPECT_TRUE(waitUntilTitleChangedTo("")); 492 EXPECT_STREQ("", ewk_view_title_get(webView())); 493 494 titleChangedHTML = 495 "<!doctype html><head><title>Title before changed</title></head>" 496 "<body onload=\"document.title=null;\"></body>"; 497 ewk_view_html_string_load(webView(), titleChangedHTML, 0, 0); 498 EXPECT_TRUE(waitUntilTitleChangedTo("")); 499 EXPECT_STREQ("", ewk_view_title_get(webView())); 500} 501 502TEST_F(EWK2ViewTest, ewk_view_run_javascript_alert) 503{ 504 ewkViewClass()->run_javascript_alert = checkAlert; 505 506 const char* alertHTML = "<!doctype html><body onload=\"alert('Alert message');\"></body>"; 507 alertCallbackData.expectedMessage = "Alert message"; 508 alertCallbackData.called = false; 509 ewk_view_html_string_load(webView(), alertHTML, 0, 0); 510 EXPECT_TRUE(waitUntilLoadFinished()); 511 EXPECT_TRUE(alertCallbackData.called); 512 513 alertHTML = "<!doctype html><body onload=\"alert('');\"></body>"; 514 alertCallbackData.expectedMessage = ""; 515 alertCallbackData.called = false; 516 ewk_view_html_string_load(webView(), alertHTML, 0, 0); 517 EXPECT_TRUE(waitUntilLoadFinished()); 518 EXPECT_TRUE(alertCallbackData.called); 519 520 alertHTML = "<!doctype html><body onload=\"alert(null);\"></body>"; 521 alertCallbackData.expectedMessage = "null"; 522 alertCallbackData.called = false; 523 ewk_view_html_string_load(webView(), alertHTML, 0, 0); 524 EXPECT_TRUE(waitUntilLoadFinished()); 525 EXPECT_TRUE(alertCallbackData.called); 526 527 alertHTML = "<!doctype html><body onload=\"alert();\"></body>"; 528 alertCallbackData.expectedMessage = "undefined"; 529 alertCallbackData.called = false; 530 ewk_view_html_string_load(webView(), alertHTML, 0, 0); 531 EXPECT_TRUE(waitUntilLoadFinished()); 532 EXPECT_TRUE(alertCallbackData.called); 533 534 ewkViewClass()->run_javascript_alert = 0; 535 536 alertCallbackData.called = false; 537 ewk_view_html_string_load(webView(), alertHTML, 0, 0); 538 EXPECT_TRUE(waitUntilLoadFinished()); 539 EXPECT_FALSE(alertCallbackData.called); 540} 541 542TEST_F(EWK2ViewTest, ewk_view_run_javascript_confirm) 543{ 544 ewkViewClass()->run_javascript_confirm = checkConfirm; 545 546 const char* confirmHTML = "<!doctype html><body onload=\"document.title = confirm('Confirm message');\"></body>"; 547 confirmCallbackData.expectedMessage = "Confirm message"; 548 confirmCallbackData.result = true; 549 confirmCallbackData.called = false; 550 ewk_view_html_string_load(webView(), confirmHTML, 0, 0); 551 EXPECT_TRUE(waitUntilTitleChangedTo("true")); 552 EXPECT_STREQ("true", ewk_view_title_get(webView())); 553 EXPECT_TRUE(confirmCallbackData.called); 554 555 confirmCallbackData.expectedMessage = "Confirm message"; 556 confirmCallbackData.result = false; 557 confirmCallbackData.called = false; 558 ewk_view_html_string_load(webView(), confirmHTML, 0, 0); 559 EXPECT_TRUE(waitUntilTitleChangedTo("false")); 560 EXPECT_STREQ("false", ewk_view_title_get(webView())); 561 EXPECT_TRUE(confirmCallbackData.called); 562 563 confirmHTML = "<!doctype html><body onload=\"document.title = confirm('');\"></body>"; 564 confirmCallbackData.expectedMessage = ""; 565 confirmCallbackData.result = true; 566 confirmCallbackData.called = false; 567 ewk_view_html_string_load(webView(), confirmHTML, 0, 0); 568 EXPECT_TRUE(waitUntilTitleChangedTo("true")); 569 EXPECT_STREQ("true", ewk_view_title_get(webView())); 570 EXPECT_TRUE(confirmCallbackData.called); 571 572 confirmHTML = "<!doctype html><body onload=\"document.title = confirm(null);\"></body>"; 573 confirmCallbackData.expectedMessage = "null"; 574 confirmCallbackData.result = true; 575 confirmCallbackData.called = false; 576 ewk_view_html_string_load(webView(), confirmHTML, 0, 0); 577 EXPECT_TRUE(waitUntilTitleChangedTo("true")); 578 EXPECT_STREQ("true", ewk_view_title_get(webView())); 579 EXPECT_TRUE(confirmCallbackData.called); 580 581 confirmHTML = "<!doctype html><body onload=\"document.title = confirm();\"></body>"; 582 confirmCallbackData.expectedMessage = "undefined"; 583 confirmCallbackData.result = true; 584 confirmCallbackData.called = false; 585 ewk_view_html_string_load(webView(), confirmHTML, 0, 0); 586 EXPECT_TRUE(waitUntilTitleChangedTo("true")); 587 EXPECT_STREQ("true", ewk_view_title_get(webView())); 588 EXPECT_TRUE(confirmCallbackData.called); 589 590 ewkViewClass()->run_javascript_confirm = 0; 591 592 confirmCallbackData.called = false; 593 ewk_view_html_string_load(webView(), confirmHTML, 0, 0); 594 EXPECT_TRUE(waitUntilTitleChangedTo("false")); 595 EXPECT_STREQ("false", ewk_view_title_get(webView())); 596 EXPECT_FALSE(confirmCallbackData.called); 597} 598 599TEST_F(EWK2ViewTest, ewk_view_run_javascript_prompt) 600{ 601 static const char promptMessage[] = "Prompt message"; 602 static const char promptResult[] = "Prompt result"; 603 604 ewkViewClass()->run_javascript_prompt = checkPrompt; 605 606 const char* promptHTML = "<!doctype html><body onload=\"document.title = prompt('Prompt message', 'Prompt default value');\"></body>"; 607 promptCallbackData.expectedMessage = promptMessage; 608 promptCallbackData.expectedDefaultValue = "Prompt default value"; 609 promptCallbackData.result = promptResult; 610 promptCallbackData.called = false; 611 ewk_view_html_string_load(webView(), promptHTML, 0, 0); 612 EXPECT_TRUE(waitUntilTitleChangedTo(promptResult)); 613 EXPECT_STREQ(promptResult, ewk_view_title_get(webView())); 614 EXPECT_TRUE(promptCallbackData.called); 615 616 promptHTML = "<!doctype html><body onload=\"document.title = prompt('Prompt message', '');\"></body>"; 617 promptCallbackData.expectedMessage = promptMessage; 618 promptCallbackData.expectedDefaultValue = ""; 619 promptCallbackData.result = promptResult; 620 promptCallbackData.called = false; 621 ewk_view_html_string_load(webView(), promptHTML, 0, 0); 622 EXPECT_TRUE(waitUntilTitleChangedTo(promptResult)); 623 EXPECT_STREQ(promptResult, ewk_view_title_get(webView())); 624 EXPECT_TRUE(promptCallbackData.called); 625 626 promptHTML = "<!doctype html><body onload=\"document.title = prompt('Prompt message');\"></body>"; 627 promptCallbackData.expectedMessage = promptMessage; 628 promptCallbackData.expectedDefaultValue = ""; 629 promptCallbackData.result = promptResult; 630 promptCallbackData.called = false; 631 ewk_view_html_string_load(webView(), promptHTML, 0, 0); 632 EXPECT_TRUE(waitUntilTitleChangedTo(promptResult)); 633 EXPECT_STREQ(promptResult, ewk_view_title_get(webView())); 634 EXPECT_TRUE(promptCallbackData.called); 635 636 promptHTML = "<!doctype html><body onload=\"document.title = prompt('');\"></body>"; 637 promptCallbackData.expectedMessage = ""; 638 promptCallbackData.expectedDefaultValue = ""; 639 promptCallbackData.result = promptResult; 640 promptCallbackData.called = false; 641 ewk_view_html_string_load(webView(), promptHTML, 0, 0); 642 EXPECT_TRUE(waitUntilTitleChangedTo(promptResult)); 643 EXPECT_STREQ(promptResult, ewk_view_title_get(webView())); 644 EXPECT_TRUE(promptCallbackData.called); 645 646 promptHTML = "<!doctype html><body onload=\"document.title = prompt();\"></body>"; 647 promptCallbackData.expectedMessage = "undefined"; 648 promptCallbackData.expectedDefaultValue = ""; 649 promptCallbackData.result = promptResult; 650 promptCallbackData.called = false; 651 ewk_view_html_string_load(webView(), promptHTML, 0, 0); 652 EXPECT_TRUE(waitUntilTitleChangedTo(promptResult)); 653 EXPECT_STREQ(promptResult, ewk_view_title_get(webView())); 654 EXPECT_TRUE(promptCallbackData.called); 655 656 promptHTML = "<html><head><title>Default title</title></head>" 657 "<body onload=\"var promptResult = prompt('Prompt message');" 658 "if (promptResult == null) document.title='null';" 659 "else document.title = promptResult;\"></body></html>"; 660 promptCallbackData.expectedMessage = promptMessage; 661 promptCallbackData.expectedDefaultValue = ""; 662 promptCallbackData.result = ""; 663 promptCallbackData.called = false; 664 ewk_view_html_string_load(webView(), promptHTML, 0, 0); 665 EXPECT_TRUE(waitUntilTitleChangedTo("")); 666 EXPECT_STREQ("", ewk_view_title_get(webView())); 667 EXPECT_TRUE(promptCallbackData.called); 668 669 promptCallbackData.expectedMessage = promptMessage; 670 promptCallbackData.expectedDefaultValue = ""; 671 promptCallbackData.result = 0; 672 promptCallbackData.called = false; 673 ewk_view_html_string_load(webView(), promptHTML, 0, 0); 674 EXPECT_TRUE(waitUntilTitleChangedTo("null")); 675 EXPECT_STREQ("null", ewk_view_title_get(webView())); 676 EXPECT_TRUE(promptCallbackData.called); 677 678 ewkViewClass()->run_javascript_prompt = 0; 679 680 promptCallbackData.called = false; 681 ewk_view_html_string_load(webView(), promptHTML, 0, 0); 682 EXPECT_TRUE(waitUntilTitleChangedTo("null")); 683 EXPECT_STREQ("null", ewk_view_title_get(webView())); 684 EXPECT_FALSE(promptCallbackData.called); 685} 686 687TEST_F(EWK2ViewTest, ewk_view_context_get) 688{ 689 Ewk_Context* context = ewk_view_context_get(webView()); 690 ASSERT_TRUE(context); 691 ASSERT_EQ(context, ewk_view_context_get(webView())); 692} 693 694TEST_F(EWK2ViewTest, ewk_view_page_group_get) 695{ 696 Ewk_Page_Group* pageGroup = ewk_view_page_group_get(webView()); 697 ASSERT_TRUE(pageGroup); 698 ASSERT_EQ(pageGroup, ewk_view_page_group_get(webView())); 699} 700 701TEST_F(EWK2ViewTest, ewk_view_feed_touch_event) 702{ 703 Eina_List* points = 0; 704 Ewk_Touch_Point point1 = { 0, 0, 0, EVAS_TOUCH_POINT_DOWN }; 705 Ewk_Touch_Point point2 = { 1, 0, 0, EVAS_TOUCH_POINT_DOWN }; 706 points = eina_list_append(points, &point1); 707 points = eina_list_append(points, &point2); 708 ASSERT_TRUE(ewk_view_feed_touch_event(webView(), EWK_TOUCH_START, points, evas_key_modifier_get(evas_object_evas_get(webView())))); 709 710 point1.state = EVAS_TOUCH_POINT_STILL; 711 point2.x = 100; 712 point2.y = 100; 713 point2.state = EVAS_TOUCH_POINT_MOVE; 714 ASSERT_TRUE(ewk_view_feed_touch_event(webView(), EWK_TOUCH_MOVE, points, evas_key_modifier_get(evas_object_evas_get(webView())))); 715 716 point2.state = EVAS_TOUCH_POINT_UP; 717 ASSERT_TRUE(ewk_view_feed_touch_event(webView(), EWK_TOUCH_END, points, evas_key_modifier_get(evas_object_evas_get(webView())))); 718 points = eina_list_remove(points, &point2); 719 720 point1.state = EVAS_TOUCH_POINT_CANCEL; 721 ASSERT_TRUE(ewk_view_feed_touch_event(webView(), EWK_TOUCH_CANCEL, points, evas_key_modifier_get(evas_object_evas_get(webView())))); 722 points = eina_list_remove(points, &point1); 723 724 // Checking in case of null for points and webview 725 EXPECT_FALSE(ewk_view_feed_touch_event(0, EWK_TOUCH_CANCEL, points, evas_key_modifier_get(evas_object_evas_get(webView())))); 726 EXPECT_FALSE(ewk_view_feed_touch_event(webView(), EWK_TOUCH_CANCEL, 0, evas_key_modifier_get(evas_object_evas_get(webView())))); 727 728 eina_list_free(points); 729} 730 731TEST_F(EWK2ViewTest, ewk_view_text_find) 732{ 733 const char textFindHTML[] = 734 "<!DOCTYPE html>" 735 "<body>" 736 "apple apple apple banana banana coconut" 737 "</body>"; 738 ewk_view_html_string_load(webView(), textFindHTML, 0, 0); 739 waitUntilLoadFinished(); 740 741 int matchCount = -1; 742 evas_object_smart_callback_add(webView(), "text,found", onTextFound, &matchCount); 743 744 ewk_view_text_find(webView(), "apple", EWK_FIND_OPTIONS_SHOW_OVERLAY, 100); 745 while (matchCount < 0) 746 ecore_main_loop_iterate(); 747 EXPECT_EQ(3, matchCount); 748 749 EXPECT_TRUE(ewk_view_text_find_highlight_clear(webView())); 750 751 matchCount = -1; 752 ewk_view_text_find(webView(), "mango", EWK_FIND_OPTIONS_SHOW_OVERLAY, 100); 753 while (matchCount < 0) 754 ecore_main_loop_iterate(); 755 EXPECT_EQ(0, matchCount); 756 757 matchCount = -1; 758 ewk_view_text_find(webView(), "banana", EWK_FIND_OPTIONS_SHOW_HIGHLIGHT, 100); 759 while (matchCount < 0) 760 ecore_main_loop_iterate(); 761 EXPECT_EQ(2, matchCount); 762 763 // Checking in case of null for text and webview 764 ASSERT_FALSE(ewk_view_text_find(0, "apple", EWK_FIND_OPTIONS_SHOW_OVERLAY, 100)); 765 ASSERT_FALSE(ewk_view_text_find(webView(), 0, EWK_FIND_OPTIONS_SHOW_OVERLAY, 100)); 766 767 evas_object_smart_callback_del(webView(), "text,found", onTextFound); 768} 769 770TEST_F(EWK2ViewTest, ewk_view_text_matches_count) 771{ 772 const char textFindHTML[] = 773 "<!DOCTYPE html>" 774 "<body>" 775 "apple Apple apple apple banana bananaApple banana coconut" 776 "</body>"; 777 ewk_view_html_string_load(webView(), textFindHTML, 0, 0); 778 waitUntilLoadFinished(); 779 780 int matchCount = -1; 781 evas_object_smart_callback_add(webView(), "text,found", onTextFound, &matchCount); 782 783 ewk_view_text_matches_count(webView(), "apple", EWK_FIND_OPTIONS_NONE, 100); 784 while (matchCount < 0) 785 ecore_main_loop_iterate(); 786 EXPECT_EQ(3, matchCount); 787 788 matchCount = -1; 789 ewk_view_text_matches_count(webView(), "apple", EWK_FIND_OPTIONS_CASE_INSENSITIVE, 100); 790 while (matchCount < 0) 791 ecore_main_loop_iterate(); 792 EXPECT_EQ(5, matchCount); 793 794 matchCount = -1; 795 ewk_view_text_matches_count(webView(), "Apple", EWK_FIND_OPTIONS_AT_WORD_STARTS, 100); 796 while (matchCount < 0) 797 ecore_main_loop_iterate(); 798 EXPECT_EQ(1, matchCount); 799 800 matchCount = -1; 801 ewk_view_text_matches_count(webView(), "Apple", EWK_FIND_OPTIONS_TREAT_MEDIAL_CAPITAL_AS_WORD_START, 100); 802 while (matchCount < 0) 803 ecore_main_loop_iterate(); 804 EXPECT_EQ(2, matchCount); 805 806 matchCount = -1; 807 ewk_view_text_matches_count(webView(), "mango", EWK_FIND_OPTIONS_NONE, 100); 808 while (matchCount < 0) 809 ecore_main_loop_iterate(); 810 EXPECT_EQ(0, matchCount); 811 812 // If we have more matches than allowed, -1 is returned as a matched count. 813 matchCount = -2; 814 ewk_view_text_matches_count(webView(), "apple", EWK_FIND_OPTIONS_NONE, 2); 815 while (matchCount < -1) 816 ecore_main_loop_iterate(); 817 EXPECT_EQ(-1, matchCount); 818 819 // Checking in case of null for text and webview 820 EXPECT_FALSE(ewk_view_text_matches_count(0, "apple", EWK_FIND_OPTIONS_NONE, 100)); 821 EXPECT_FALSE(ewk_view_text_matches_count(webView(), 0, EWK_FIND_OPTIONS_NONE, 100)); 822 823 evas_object_smart_callback_del(webView(), "text,found", onTextFound); 824} 825 826TEST_F(EWK2ViewTest, ewk_view_touch_events_enabled) 827{ 828 ASSERT_FALSE(ewk_view_touch_events_enabled_get(webView())); 829 830 ASSERT_TRUE(ewk_view_touch_events_enabled_set(webView(), true)); 831 ASSERT_TRUE(ewk_view_touch_events_enabled_get(webView())); 832 833 ASSERT_TRUE(ewk_view_touch_events_enabled_set(webView(), 2)); 834 ASSERT_TRUE(ewk_view_touch_events_enabled_get(webView())); 835 836 const char* touchHTML = 837 "<!doctype html><body><div style=\"width:100px; height:100px;\" " 838 "ontouchstart=\"document.title='touchstarted' + event.touches.length;\" " 839 "ontouchmove=\"document.title='touchmoved' + event.touches.length;\" " 840 "ontouchend=\"document.title='touchended' + event.touches.length;\">" 841 "</div></body>"; 842 843 ewk_view_html_string_load(webView(), touchHTML, "file:///", 0); 844 ASSERT_TRUE(waitUntilLoadFinished()); 845 846 mouseDown(10, 10); 847 ASSERT_TRUE(waitUntilTitleChangedTo("touchstarted1")); 848 849 multiDown(1, 30, 30); 850 ASSERT_TRUE(waitUntilTitleChangedTo("touchstarted2")); 851 852 multiMove(1, 40, 40); 853 ASSERT_TRUE(waitUntilTitleChangedTo("touchmoved2")); 854 855 multiUp(1, 40, 40); 856 ASSERT_TRUE(waitUntilTitleChangedTo("touchended1")); 857 858 mouseMove(20, 20); 859 ASSERT_TRUE(waitUntilTitleChangedTo("touchmoved1")); 860 861 mouseUp(20, 20); 862 ASSERT_TRUE(waitUntilTitleChangedTo("touchended0")); 863 864 ASSERT_TRUE(ewk_view_touch_events_enabled_set(webView(), false)); 865 ASSERT_FALSE(ewk_view_touch_events_enabled_get(webView())); 866} 867 868TEST_F(EWK2ViewTest, window_move_resize) 869{ 870 int x, y, width, height; 871 Ecore_Evas* ee = ecore_evas_ecore_evas_get(evas_object_evas_get(webView())); 872 ecore_evas_geometry_get(ee, 0, 0, &width, &height); 873 874 EXPECT_EQ(800, width); 875 EXPECT_EQ(600, height); 876 877 ewk_view_url_set(webView(), environment->urlForResource("window_move_resize.html").data()); 878 ASSERT_TRUE(waitUntilTitleChangedTo("Moved and resized")); 879 880 // Check that the window has been moved and resized. 881 ecore_evas_request_geometry_get(ee, &x, &y, &width, &height); 882 EXPECT_EQ(150, x); 883 EXPECT_EQ(200, y); 884 EXPECT_EQ(200, width); 885 EXPECT_EQ(100, height); 886} 887 888TEST_F(EWK2ViewTest, ewk_view_inspector) 889{ 890#if ENABLE(INSPECTOR) 891 ASSERT_TRUE(ewk_view_inspector_show(webView())); 892 ASSERT_TRUE(ewk_view_inspector_close(webView())); 893#else 894 ASSERT_FALSE(ewk_view_inspector_show(webView())); 895 ASSERT_FALSE(ewk_view_inspector_close(webView())); 896#endif 897} 898 899TEST_F(EWK2ViewTest, DISABLED_ewk_view_scale) 900{ 901 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 902 903 // Default scale value is 1.0. 904 ASSERT_FLOAT_EQ(1, ewk_view_scale_get(webView())); 905 906 ASSERT_TRUE(ewk_view_scale_set(webView(), 1.2, 0, 0)); 907 // Reload page to check the page scale value. 908 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 909 ASSERT_FLOAT_EQ(1.2, ewk_view_scale_get(webView())); 910 911 ASSERT_TRUE(ewk_view_scale_set(webView(), 1.5, 0, 0)); 912 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 913 ASSERT_FLOAT_EQ(1.5, ewk_view_scale_get(webView())); 914 915 ASSERT_TRUE(ewk_view_scale_set(webView(), 1, 0, 0)); 916 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 917 ASSERT_FLOAT_EQ(1, ewk_view_scale_get(webView())); 918} 919 920TEST_F(EWK2ViewTest, ewk_view_pagination) 921{ 922 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 923 924 // Default pagination value is EWK_PAGINATION_MODE_UNPAGINATED 925 ASSERT_EQ(EWK_PAGINATION_MODE_UNPAGINATED, ewk_view_pagination_mode_get(webView())); 926 927 ASSERT_TRUE(ewk_view_pagination_mode_set(webView(), EWK_PAGINATION_MODE_LEFT_TO_RIGHT)); 928 // Reload page to check the pagination mode. 929 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 930 ASSERT_EQ(EWK_PAGINATION_MODE_LEFT_TO_RIGHT, ewk_view_pagination_mode_get(webView())); 931 932 ASSERT_TRUE(ewk_view_pagination_mode_set(webView(), EWK_PAGINATION_MODE_RIGHT_TO_LEFT)); 933 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 934 ASSERT_EQ(EWK_PAGINATION_MODE_RIGHT_TO_LEFT, ewk_view_pagination_mode_get(webView())); 935 936 ASSERT_TRUE(ewk_view_pagination_mode_set(webView(), EWK_PAGINATION_MODE_TOP_TO_BOTTOM)); 937 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 938 ASSERT_EQ(EWK_PAGINATION_MODE_TOP_TO_BOTTOM, ewk_view_pagination_mode_get(webView())); 939 940 ASSERT_TRUE(ewk_view_pagination_mode_set(webView(), EWK_PAGINATION_MODE_BOTTOM_TO_TOP)); 941 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 942 ASSERT_EQ(EWK_PAGINATION_MODE_BOTTOM_TO_TOP, ewk_view_pagination_mode_get(webView())); 943 944 ASSERT_TRUE(ewk_view_pagination_mode_set(webView(), EWK_PAGINATION_MODE_UNPAGINATED)); 945 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 946 ASSERT_EQ(EWK_PAGINATION_MODE_UNPAGINATED, ewk_view_pagination_mode_get(webView())); 947} 948 949TEST_F(EWK2ViewTest, ewk_context_vibration_client_callbacks_set) 950{ 951 VibrationCbData data = { false, false, false, 0, 5000 }; 952 evas_object_smart_callback_add(webView(), "vibrate", onVibrate, &data); 953 evas_object_smart_callback_add(webView(), "cancel,vibration", onCancelVibration, &data); 954 955 // Vibrate for 5 seconds. 956 loadVibrationHTMLString(webView(), "5000", &data); 957 waitUntilTrue(data.testFinished); 958 ASSERT_TRUE(data.didReceiveVibrate && !data.didReceiveCancelVibration); 959 960 // Cancel any existing vibrations. 961 loadVibrationHTMLString(webView(), "0", &data); 962 waitUntilTrue(data.testFinished); 963 ASSERT_TRUE(!data.didReceiveVibrate && data.didReceiveCancelVibration); 964 965 // This case the pattern will cause the device to vibrate for 200 ms, be still for 100 ms, and then vibrate for 5000 ms. 966 loadVibrationHTMLString(webView(), "[200, 100, 5000]", &data); 967 waitUntilTrue(data.testFinished); 968 ASSERT_EQ(2, data.vibrateCalledCount); 969 ASSERT_TRUE(data.didReceiveVibrate && !data.didReceiveCancelVibration); 970 971 // Cancel outstanding vibration pattern. 972 loadVibrationHTMLString(webView(), "[0]", &data); 973 waitUntilTrue(data.testFinished); 974 ASSERT_TRUE(!data.didReceiveVibrate && data.didReceiveCancelVibration); 975 976 // Check that vibration works properly by continuous request. 977 data.expectedVibrationTime = 5; 978 loadVibrationHTMLString(webView(), "5", &data); 979 waitUntilTrue(data.testFinished); 980 ASSERT_TRUE(data.didReceiveVibrate && !data.didReceiveCancelVibration); 981 982 loadVibrationHTMLString(webView(), "5", &data); 983 waitUntilTrue(data.testFinished); 984 ASSERT_EQ(1, data.vibrateCalledCount); 985 ASSERT_TRUE(data.didReceiveVibrate && !data.didReceiveCancelVibration); 986 987 // Stop listening for vibration events, by calling the function with null for the callbacks. 988 evas_object_smart_callback_del(webView(), "vibrate", onVibrate); 989 evas_object_smart_callback_del(webView(), "cancel,vibration", onCancelVibration); 990} 991 992TEST_F(EWK2ViewTest, ewk_view_contents_size_changed) 993{ 994 const char contentsSizeHTMLPortrait[] = 995 "<!DOCTYPE html>" 996 "<body style=\"margin:0px;width:2000px;height:3000px\"></body>"; 997 const char contentsSizeHTMLLandscape[] = 998 "<!DOCTYPE html>" 999 "<body style=\"margin:0px;width:3000px;height:2000px\"></body>"; 1000 1001 bool sizeChanged = false; 1002 evas_object_smart_callback_add(webView(), "contents,size,changed", onContentsSizeChangedPortrait, &sizeChanged); 1003 ewk_view_html_string_load(webView(), contentsSizeHTMLPortrait, 0, 0); 1004 waitUntilTrue(sizeChanged); 1005 evas_object_smart_callback_del(webView(), "contents,size,changed", onContentsSizeChangedPortrait); 1006 1007 evas_object_smart_callback_add(webView(), "contents,size,changed", onContentsSizeChangedLandscape, &sizeChanged); 1008 ewk_view_device_pixel_ratio_set(webView(), 2); 1009 ewk_view_html_string_load(webView(), contentsSizeHTMLLandscape, 0, 0); 1010 sizeChanged = false; 1011 waitUntilTrue(sizeChanged); 1012 evas_object_smart_callback_del(webView(), "contents,size,changed", onContentsSizeChangedLandscape); 1013 1014 evas_object_smart_callback_add(webView(), "contents,size,changed", onContentsSizeChangedPortrait, &sizeChanged); 1015 ewk_view_scale_set(webView(), 3, 0, 0); 1016 ewk_view_html_string_load(webView(), contentsSizeHTMLPortrait, 0, 0); 1017 sizeChanged = false; 1018 waitUntilTrue(sizeChanged); 1019 1020 // Make sure we get signal after loaded the contents having same size with previous one. 1021 sizeChanged = false; 1022 ewk_view_html_string_load(webView(), contentsSizeHTMLPortrait, 0, 0); 1023 waitUntilTrue(sizeChanged); 1024 1025 evas_object_smart_callback_del(webView(), "contents,size,changed", onContentsSizeChangedPortrait); 1026} 1027 1028TEST_F(EWK2ViewTest, ewk_view_page_contents_get) 1029{ 1030 const char content[] = "<p>Simple HTML</p>"; 1031 ewk_view_html_string_load(webView(), content, 0, 0); 1032 waitUntilLoadFinished(); 1033 1034 ASSERT_TRUE(ewk_view_page_contents_get(webView(), EWK_PAGE_CONTENTS_TYPE_MHTML, PageContentsAsMHTMLCallback, 0)); 1035 waitUntilTrue(obtainedPageContents); 1036 1037 obtainedPageContents = false; 1038 ASSERT_TRUE(ewk_view_page_contents_get(webView(), EWK_PAGE_CONTENTS_TYPE_STRING, PageContentsAsStringCallback, 0)); 1039 waitUntilTrue(obtainedPageContents); 1040 1041 // Checking in case of null for callback and webview 1042 EXPECT_FALSE(ewk_view_page_contents_get(webView(), EWK_PAGE_CONTENTS_TYPE_STRING, 0, 0)); 1043 EXPECT_FALSE(ewk_view_page_contents_get(0, EWK_PAGE_CONTENTS_TYPE_STRING, PageContentsAsStringCallback, 0)); 1044 EXPECT_FALSE(ewk_view_page_contents_get(webView(), static_cast<Ewk_Page_Contents_Type>(2), PageContentsAsStringCallback, 0)); 1045} 1046 1047TEST_F(EWK2ViewTest, ewk_view_user_agent) 1048{ 1049 const char* defaultUserAgent = eina_stringshare_add(ewk_view_user_agent_get(webView())); 1050 const char customUserAgent[] = "Foo"; 1051 1052 ASSERT_TRUE(ewk_view_user_agent_set(webView(), customUserAgent)); 1053 ASSERT_STREQ(customUserAgent, ewk_view_user_agent_get(webView())); 1054 1055 // Set the default user agent string. 1056 ASSERT_TRUE(ewk_view_user_agent_set(webView(), 0)); 1057 ASSERT_STREQ(defaultUserAgent, ewk_view_user_agent_get(webView())); 1058 eina_stringshare_del(defaultUserAgent); 1059} 1060 1061static void scriptExecuteCallback(Evas_Object*, const char* returnValue, void* userData) 1062{ 1063 Eina_Strbuf* buffer = static_cast<Eina_Strbuf*>(userData); 1064 eina_strbuf_reset(buffer); 1065 1066 if (returnValue) 1067 eina_strbuf_append(buffer, returnValue); 1068 1069 scriptExecuteCallbackCalled = true; 1070} 1071 1072TEST_F(EWK2UnitTestBase, ewk_view_script_execute) 1073{ 1074 const char scriptExecuteHTML[] = 1075 "<!DOCTYPE html>" 1076 "<body>" 1077 "<p id=\"TestContent\">test content</p>" 1078 "</body>"; 1079 1080 ewk_view_html_string_load(webView(), scriptExecuteHTML, 0, 0); 1081 ASSERT_TRUE(waitUntilLoadFinished()); 1082 1083 Eina_Strbuf* result = eina_strbuf_new(); 1084 1085 // 1. Get the innerHTML for "TestContent" 1086 const char getDataScript[] = "document.getElementById('TestContent').innerHTML"; 1087 1088 scriptExecuteCallbackCalled = false; 1089 ASSERT_TRUE(ewk_view_script_execute(webView(), getDataScript, scriptExecuteCallback, static_cast<void*>(result))); 1090 waitUntilTrue(scriptExecuteCallbackCalled); 1091 ASSERT_STREQ("test content", eina_strbuf_string_get(result)); 1092 1093 // 2. Change the innerHTML for "TestContent" 1094 const char changeDataScript[] = 1095 "document.getElementById('TestContent').innerHTML = \"test\";"; 1096 ASSERT_TRUE(ewk_view_script_execute(webView(), changeDataScript, 0, 0)); 1097 1098 // 3. Check the change of the innerHTML. 1099 eina_strbuf_reset(result); 1100 scriptExecuteCallbackCalled = false; 1101 ASSERT_TRUE(ewk_view_script_execute(webView(), getDataScript, scriptExecuteCallback, static_cast<void*>(result))); 1102 waitUntilTrue(scriptExecuteCallbackCalled); 1103 ASSERT_STREQ("test", eina_strbuf_string_get(result)); 1104 1105 // Checking in case of null for script and webview 1106 EXPECT_FALSE(ewk_view_script_execute(0, getDataScript, scriptExecuteCallback, static_cast<void*>(result))); 1107 EXPECT_FALSE(ewk_view_script_execute(webView(), 0, scriptExecuteCallback, static_cast<void*>(result))); 1108 1109 eina_strbuf_free(result); 1110 1111 ASSERT_FALSE(ewk_view_script_execute(webView(), 0, 0, 0)); 1112} 1113 1114TEST_F(EWK2ViewTest, ewk_view_layout_fixed) 1115{ 1116 // Fixed layout is not used in webview as default. 1117 EXPECT_FALSE(ewk_view_layout_fixed_get(webView())); 1118 1119 EXPECT_TRUE(ewk_view_layout_fixed_set(webView(), true)); 1120 EXPECT_TRUE(ewk_view_layout_fixed_get(webView())); 1121} 1122 1123TEST_F(EWK2ViewTest, ewk_view_layout_fixed_size) 1124{ 1125 // Fixed layout is not enabled in webview as default. 1126 EXPECT_FALSE(ewk_view_layout_fixed_get(webView())); 1127 EXPECT_TRUE(ewk_view_layout_fixed_set(webView(), true)); 1128 1129 Evas_Coord width = 0; 1130 Evas_Coord height = 0; 1131 1132 ewk_view_layout_fixed_size_set(webView(), 480, 800); 1133 ewk_view_layout_fixed_size_get(webView(), &width, &height); 1134 EXPECT_EQ(480, width); 1135 EXPECT_EQ(800, height); 1136 1137 ewk_view_layout_fixed_size_set(webView(), 980, 1020); 1138 ewk_view_layout_fixed_size_get(webView(), &width, &height); 1139 EXPECT_EQ(980, width); 1140 EXPECT_EQ(1020, height); 1141} 1142 1143TEST_F(EWK2ViewTest, ewk_view_bg_color) 1144{ 1145 const char noBackgroundHTML[] = "<!doctype html><body></body>"; 1146 1147 ewk_view_bg_color_set(webView(), 255, 0, 0, 255); 1148 ewk_view_html_string_load(webView(), noBackgroundHTML, 0, 0); 1149 ASSERT_TRUE(waitUntilLoadFinished()); 1150 1151 int red, green, blue, alpha; 1152 ewk_view_bg_color_get(webView(), &red, &green, &blue, &alpha); 1153 ASSERT_EQ(255, red); 1154 ASSERT_EQ(0, green); 1155 ASSERT_EQ(0, blue); 1156 ASSERT_EQ(255, red); 1157} 1158 1159TEST_F(EWK2ViewTest, ewk_view_page_zoom_set) 1160{ 1161 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 1162 1163 // Default zoom factor is 1.0 1164 ASSERT_FLOAT_EQ(1, ewk_view_page_zoom_get(webView())); 1165 1166 ASSERT_TRUE(ewk_view_page_zoom_set(webView(), 0.67)); 1167 ASSERT_FLOAT_EQ(0.67, ewk_view_page_zoom_get(webView())); 1168 1169 ASSERT_TRUE(ewk_view_page_zoom_set(webView(), 1)); 1170 ASSERT_FLOAT_EQ(1, ewk_view_page_zoom_get(webView())); 1171} 1172 1173TEST_F(EWK2ViewTest, ewk_view_contents_size_get) 1174{ 1175 int contentsWidth, contentsHeight; 1176 ewk_view_contents_size_get(0, &contentsWidth, &contentsHeight); 1177 1178 EXPECT_EQ(0, contentsWidth); 1179 EXPECT_EQ(0, contentsHeight); 1180 1181 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 1182 ewk_view_contents_size_get(webView(), &contentsWidth, &contentsHeight); 1183 1184 EXPECT_EQ(environment->defaultWidth(), contentsWidth); 1185 EXPECT_EQ(environment->defaultHeight(), contentsHeight); 1186 1187 ewk_view_device_pixel_ratio_set(webView(), 2); 1188 ASSERT_TRUE(loadUrlSync(environment->defaultTestPageUrl())); 1189 ewk_view_contents_size_get(webView(), &contentsWidth, &contentsHeight); 1190 1191 EXPECT_EQ(environment->defaultWidth() / 2, contentsWidth); 1192 EXPECT_EQ(environment->defaultHeight() / 2, contentsHeight); 1193 1194 const char fixedContentsSize[] = 1195 "<!DOCTYPE html>" 1196 "<body style=\"margin:0px;width:2000px;height:3000px\"></body>"; 1197 ewk_view_html_string_load(webView(), fixedContentsSize, 0, 0); 1198 ASSERT_TRUE(waitUntilLoadFinished()); 1199 ewk_view_contents_size_get(webView(), &contentsWidth, &contentsHeight); 1200 1201 EXPECT_EQ(2000, contentsWidth); 1202 EXPECT_EQ(3000, contentsHeight); 1203} 1204