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