Merge branch 'intefl/svn_merge' of ssh://165.213.149.219:21922/slp/pkgs/e/elementary...
[framework/uifw/elementary.git] / src / bin / test_web.c
1 #include <Elementary.h>
2 #ifdef HAVE_CONFIG_H
3 # include "elementary_config.h"
4 #endif
5 #ifndef ELM_LIB_QUICKLAUNCH
6
7 typedef struct
8 {
9    Evas_Object *web;
10    Evas_Object *btn_back;
11    Evas_Object *btn_fwd;
12    Evas_Object *url_entry;
13    Eina_List *sub_wins;
14    const char* user_agent;
15    Eina_Bool js_hooks : 1;
16 } Web_Test;
17
18 static void
19 _btn_back_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
20 {
21    Evas_Object *web = data;
22
23    elm_web_back(web);
24 }
25
26 static void
27 _btn_fwd_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
28 {
29    Evas_Object *web = data;
30
31    elm_web_forward(web);
32 }
33
34 static void
35 _btn_reload_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
36 {
37    Evas_Object *web = data;
38
39    elm_web_reload(web);
40 }
41
42 static void
43 _url_change_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
44 {
45    Evas_Object *web = data;
46    const char *uri = elm_object_text_get(obj);
47
48    elm_web_uri_set(web, uri);
49 }
50
51 static void
52 _toggle_inwin_mode_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
53 {
54    elm_web_inwin_mode_set(data, !elm_web_inwin_mode_get(data));
55 }
56
57 static void
58 _title_changed_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
59 {
60    char buf[512];
61    snprintf(buf, sizeof(buf), "Web - %s", (const char *)event_info);
62    elm_win_title_set(data, buf);
63 }
64
65 static void
66 _uri_changed_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
67 {
68    Web_Test *wt = data;
69
70    elm_object_text_set(wt->url_entry, event_info);
71
72 <<<<<<< HEAD
73    elm_object_disabled_set(wt->btn_back, !elm_web_back_possible(wt->web));
74    elm_object_disabled_set(wt->btn_fwd, !elm_web_forward_possible(wt->web));
75 =======
76    elm_object_disabled_set(wt->btn_back, !elm_web_back_possible_get(wt->web));
77    elm_object_disabled_set(wt->btn_fwd, !elm_web_forward_possible_get(wt->web));
78 >>>>>>> remotes/origin/upstream
79 }
80
81 static void
82 _new_win_del_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
83 {
84    Web_Test *wt = data;
85    wt->sub_wins = eina_list_remove(wt->sub_wins, obj);
86 }
87
88 static void
89 _web_win_close_request_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
90 {
91    evas_object_del(data);
92 }
93
94 static Evas_Object *
95 _new_window_hook(void *data, Evas_Object *obj __UNUSED__, Eina_Bool js __UNUSED__, const Elm_Web_Window_Features *wf __UNUSED__)
96 {
97    Web_Test *wt = data;
98    Evas_Object *new_win, *new_web, *bg;
99
100    new_win = elm_win_add(NULL, "elm-web-test-popup", ELM_WIN_BASIC);
101    elm_win_autodel_set(new_win, EINA_TRUE);
102    evas_object_resize(new_win, 300, 300);
103    evas_object_show(new_win);
104
105    bg = elm_bg_add(new_win);
106    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
107    elm_win_resize_object_add(new_win, bg);
108    evas_object_show(bg);
109
110    new_web = elm_web_add(new_win);
111    elm_web_useragent_set(new_web, wt->user_agent);
112    evas_object_size_hint_weight_set(new_web, EVAS_HINT_EXPAND,
113                                     EVAS_HINT_EXPAND);
114    elm_win_resize_object_add(new_win, new_web);
115    evas_object_show(new_web);
116
117    evas_object_smart_callback_add(new_win, "delete,request", _new_win_del_cb,
118                                   wt);
119    evas_object_smart_callback_add(new_web, "windows,close,request",
120                                   _web_win_close_request_cb, new_win);
121    wt->sub_wins = eina_list_append(wt->sub_wins, new_win);
122
123    return new_web;
124 }
125
126 static void
127 _alert_del(void *data __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
128 {
129    evas_object_del(obj);
130 }
131
132 static Evas_Object *
133 _alert_hook(void *data __UNUSED__, Evas_Object *obj, const char *message)
134 {
135    Evas_Object *popup, *label;
136
137    popup = elm_notify_add(obj);
138    elm_notify_orient_set(popup, ELM_NOTIFY_ORIENT_CENTER);
139    // Using the timeout doesn't seem to go well with the second main loop
140    //elm_notify_timeout_set(popup, 2.0);
141 <<<<<<< HEAD
142    elm_notify_repeat_events_set(popup, EINA_FALSE);
143 =======
144    elm_notify_allow_events_set(popup, EINA_FALSE);
145 >>>>>>> remotes/origin/upstream
146    evas_object_show(popup);
147
148    evas_object_smart_callback_add(popup, "block,clicked", _alert_del, NULL);
149
150    label = elm_label_add(obj);
151    elm_object_text_set(label, message);
152    elm_object_content_set(popup, label);
153    evas_object_show(label);
154
155    return popup;
156 }
157
158 static void
159 _confirm_ok_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
160 {
161    Eina_Bool *response = data;
162    *response = EINA_TRUE;
163 }
164
165 static void
166 _confirm_cancel_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
167 {
168    Eina_Bool *response = data;
169    *response = EINA_FALSE;
170 }
171
172 static void
173 _confirm_dismiss_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
174 {
175    evas_object_del(data);
176 }
177
178 static Evas_Object *
179 _confirm_hook(void *data __UNUSED__, Evas_Object *obj, const char *message, Eina_Bool *response)
180 {
181    Evas_Object *popup, *box, *box2, *label, *btn_ok, *btn_cancel;
182
183    popup = elm_notify_add(obj);
184    elm_notify_orient_set(popup, ELM_NOTIFY_ORIENT_CENTER);
185 <<<<<<< HEAD
186    elm_notify_repeat_events_set(popup, EINA_FALSE);
187 =======
188    elm_notify_allow_events_set(popup, EINA_FALSE);
189 >>>>>>> remotes/origin/upstream
190    evas_object_show(popup);
191
192    box = elm_box_add(obj);
193    elm_object_content_set(popup, box);
194    evas_object_show(box);
195
196    label = elm_label_add(obj);
197    elm_object_text_set(label, message);
198    elm_box_pack_end(box, label);
199    evas_object_show(label);
200
201    box2 = elm_box_add(obj);
202    elm_box_horizontal_set(box2, EINA_TRUE);
203    elm_box_pack_end(box, box2);
204    evas_object_show(box2);
205
206    btn_ok = elm_button_add(obj);
207    elm_object_text_set(btn_ok, "Ok");
208    elm_box_pack_end(box2, btn_ok);
209    evas_object_show(btn_ok);
210
211    btn_cancel = elm_button_add(obj);
212    elm_object_text_set(btn_cancel, "Cancel");
213    elm_box_pack_end(box2, btn_cancel);
214    evas_object_show(btn_cancel);
215
216    evas_object_smart_callback_add(btn_ok, "clicked", _confirm_dismiss_cb,
217                                   popup);
218    evas_object_smart_callback_add(btn_cancel, "clicked", _confirm_dismiss_cb,
219                                   popup);
220    evas_object_smart_callback_add(btn_ok, "clicked", _confirm_ok_cb, response);
221    evas_object_smart_callback_add(btn_cancel, "clicked", _confirm_cancel_cb,
222                                   response);
223
224    return popup;
225 }
226
227 static Evas_Object *
228 _prompt_hook(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *message __UNUSED__, const char *default_value, char **value, Eina_Bool *response)
229 {
230    *response = EINA_TRUE;
231    *value = default_value ? strdup(default_value) : "No default!";
232    return NULL;
233 }
234
235 static Evas_Object *
236 _file_selector_hook(void *data __UNUSED__, Evas_Object *obj __UNUSED__, Eina_Bool allow_multiple __UNUSED__, Eina_List *accept_types __UNUSED__, Eina_List **selected_files, Eina_Bool *response)
237 {
238    *selected_files = eina_list_append(NULL,
239                                       strdup("/path/to/non_existing_file"));
240    *response = EINA_TRUE;
241    return NULL;
242 }
243
244 static void
245 _console_message_hook(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *message, unsigned int line_number, const char *source_id)
246 {
247    printf("CONSOLE: %s:%d:%s\n", source_id, line_number, message);
248 }
249
250 static void
251 _js_popup_hooks_set(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
252 {
253    Web_Test *wt = data;
254
255    wt->js_hooks = !wt->js_hooks;
256    if (wt->js_hooks)
257      {
258         elm_web_dialog_alert_hook_set(wt->web, _alert_hook, NULL);
259         elm_web_dialog_confirm_hook_set(wt->web, _confirm_hook, NULL);
260         elm_web_dialog_prompt_hook_set(wt->web, _prompt_hook, NULL);
261         elm_web_dialog_file_selector_hook_set(wt->web, _file_selector_hook,
262                                               NULL);
263         elm_web_console_message_hook_set(wt->web, _console_message_hook, NULL);
264      }
265    else
266      {
267         elm_web_dialog_alert_hook_set(wt->web, NULL, NULL);
268         elm_web_dialog_confirm_hook_set(wt->web, NULL, NULL);
269         elm_web_dialog_prompt_hook_set(wt->web, NULL, NULL);
270         elm_web_dialog_file_selector_hook_set(wt->web, NULL, NULL);
271         elm_web_console_message_hook_set(wt->web, NULL, NULL);
272      }
273 }
274
275 static void
276 _zoom_out_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
277 {
278    Web_Test *wt = data;
279    double zoom;
280
281    zoom = elm_web_zoom_get(wt->web);
282    if (zoom > 1)
283      zoom -= .5;
284    else
285      zoom /= 2;
286    if (zoom < .05)
287      zoom = .05;
288    elm_web_zoom_set(wt->web, zoom);
289 }
290
291 static void
292 _zoom_in_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
293 {
294    Web_Test *wt = data;
295    double zoom;
296
297    zoom = elm_web_zoom_get(wt->web);
298
299    if (zoom < 1)
300      zoom *= 2;
301    else
302      zoom += .5;
303    if (zoom > 4)
304      zoom = 4;
305    elm_web_zoom_set(wt->web, zoom);
306 }
307
308 static void
309 _zoom_mode_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
310 {
311    Web_Test *wt = data;
312    Elm_Object_Item *hoversel_it = event_info;
313    const char *lbl = elm_object_item_text_get(hoversel_it);
314
315    if (!strcmp(lbl, "Manual"))
316      elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_MANUAL);
317    else if (!strcmp(lbl, "Fit"))
318      elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_AUTO_FIT);
319    else
320      elm_web_zoom_mode_set(wt->web, ELM_WEB_ZOOM_MODE_AUTO_FILL);
321 }
322
323 static void
324 _show_region_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
325 {
326    Web_Test *wt = data;
327    elm_web_region_show(wt->web, 300, 300, 1, 1);
328 }
329
330 static void
331 _bring_in_region_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
332 {
333    Web_Test *wt = data;
334    elm_web_region_bring_in(wt->web, 50, 0, 1, 1);
335 }
336
337 static void
338 _main_web_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
339 {
340    Web_Test *wt = data;
341    Evas_Object *sub_win;
342
343    EINA_LIST_FREE(wt->sub_wins, sub_win)
344       evas_object_del(sub_win);
345
346    free(wt);
347 }
348
349 void
350 test_web(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__, Eina_Bool mobile)
351 {
352    const char user_agent_firefox[] = "Mozilla/5.0 (X11; Linux x86_64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1";
353    const char user_agent_mobile[] = "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3";
354    Evas_Object *win, *bg, *bx, *bx2, *bt, *web, *url;
355    Web_Test *wt;
356
357    elm_need_web();
358
359    wt = calloc(1, sizeof(*wt));
360
361    win = elm_win_add(NULL, "web", ELM_WIN_BASIC);
362
363    if (mobile == EINA_TRUE)
364    {
365       wt->user_agent = user_agent_mobile;
366       elm_win_title_set(win, "Web-mobile");
367    }
368    else
369    {
370       wt->user_agent = user_agent_firefox;
371       elm_win_title_set(win, "Web");
372    }
373
374    elm_win_autodel_set(win, EINA_TRUE);
375
376    bg = elm_bg_add(win);
377    elm_win_resize_object_add(win, bg);
378    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
379    evas_object_show(bg);
380
381    bx = elm_box_add(win);
382    elm_win_resize_object_add(win, bx);
383    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
384    evas_object_show(bx);
385
386    bx2 = elm_box_add(win);
387    elm_box_horizontal_set(bx2, EINA_TRUE);
388    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
389    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0.0);
390    elm_box_pack_end(bx, bx2);
391    evas_object_show(bx2);
392
393    web = elm_web_add(win);
394    elm_web_useragent_set(web, wt->user_agent);
395    printf("elm_web useragent: %s\n", elm_web_useragent_get(web));
396    evas_object_size_hint_weight_set(web, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
397    evas_object_size_hint_align_set(web, EVAS_HINT_FILL, EVAS_HINT_FILL);
398    elm_box_pack_end(bx, web);
399    evas_object_show(web);
400
401    bt = elm_button_add(win);
402    elm_object_text_set(bt, "<");
403    elm_box_pack_end(bx2, bt);
404    evas_object_show(bt);
405
406    evas_object_smart_callback_add(bt, "clicked", _btn_back_cb, web);
407    wt->btn_back = bt;
408
409    bt = elm_button_add(win);
410    elm_object_text_set(bt, "R");
411    elm_box_pack_end(bx2, bt);
412    evas_object_show(bt);
413
414    evas_object_smart_callback_add(bt, "clicked", _btn_reload_cb, web);
415
416    bt = elm_button_add(win);
417    elm_object_text_set(bt, ">");
418    elm_box_pack_end(bx2, bt);
419    evas_object_show(bt);
420
421    evas_object_smart_callback_add(bt, "clicked", _btn_fwd_cb, web);
422    wt->btn_fwd = bt;
423
424    url = elm_entry_add(win);
425    elm_entry_single_line_set(url, EINA_TRUE);
426    elm_entry_scrollable_set(url, EINA_TRUE);
427    evas_object_size_hint_weight_set(url, EVAS_HINT_EXPAND, 0);
428    evas_object_size_hint_align_set(url, EVAS_HINT_FILL, EVAS_HINT_FILL);
429    elm_box_pack_end(bx2, url);
430    evas_object_show(url);
431
432    evas_object_smart_callback_add(url, "activated", _url_change_cb, web);
433    wt->url_entry = url;
434
435    bx2 = elm_box_add(win);
436    elm_box_horizontal_set(bx2, EINA_TRUE);
437    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
438    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0);
439    elm_box_pack_end(bx, bx2);
440    evas_object_show(bx2);
441
442    bt = elm_button_add(win);
443    elm_object_text_set(bt, "Inwin Mode");
444    elm_box_pack_end(bx2, bt);
445    evas_object_show(bt);
446
447    evas_object_smart_callback_add(bt, "clicked", _toggle_inwin_mode_cb, web);
448
449    bt = elm_button_add(win);
450    elm_object_text_set(bt, "Custom Hooks");
451    elm_box_pack_end(bx2, bt);
452    evas_object_show(bt);
453
454    evas_object_smart_callback_add(bt, "clicked", _js_popup_hooks_set, wt);
455
456    bt = elm_button_add(win);
457    elm_object_text_set(bt, "-");
458    elm_box_pack_end(bx2, bt);
459    evas_object_show(bt);
460
461    evas_object_smart_callback_add(bt, "clicked", _zoom_out_cb, wt);
462
463    bt = elm_button_add(win);
464    elm_object_text_set(bt, "+");
465    elm_box_pack_end(bx2, bt);
466    evas_object_show(bt);
467
468    evas_object_smart_callback_add(bt, "clicked", _zoom_in_cb, wt);
469
470    bt = elm_hoversel_add(win);
471    elm_object_text_set(bt, "Zoom Mode");
472    elm_box_pack_end(bx2, bt);
473    evas_object_show(bt);
474
475    elm_hoversel_item_add(bt, "Manual", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt);
476    elm_hoversel_item_add(bt, "Fit", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt);
477    elm_hoversel_item_add(bt, "Fill", NULL, ELM_ICON_NONE, _zoom_mode_cb, wt);
478
479    bx2 = elm_box_add(win);
480    elm_box_horizontal_set(bx2, EINA_TRUE);
481    evas_object_size_hint_weight_set(bx2, EVAS_HINT_EXPAND, 0);
482    evas_object_size_hint_align_set(bx2, EVAS_HINT_FILL, 0);
483    elm_box_pack_end(bx, bx2);
484    evas_object_show(bx2);
485
486    bt = elm_button_add(win);
487    elm_object_text_set(bt, "Show 300, 300");
488    elm_box_pack_end(bx2, bt);
489    evas_object_show(bt);
490
491    evas_object_smart_callback_add(bt, "clicked", _show_region_cb, wt);
492
493    bt = elm_button_add(win);
494    elm_object_text_set(bt, "Bring in 50, 0");
495    elm_box_pack_end(bx2, bt);
496    evas_object_show(bt);
497
498    evas_object_smart_callback_add(bt, "clicked", _bring_in_region_cb, wt);
499
500    evas_object_smart_callback_add(web, "title,changed", _title_changed_cb, win);
501    evas_object_smart_callback_add(web, "uri,changed", _uri_changed_cb, wt);
502
503    evas_object_event_callback_add(web, EVAS_CALLBACK_DEL, _main_web_del_cb, wt);
504
505    wt->web = web;
506
507    elm_web_uri_set(web, "http://www.enlightenment.org");
508
509    elm_web_window_create_hook_set(web, _new_window_hook, wt);
510
511    evas_object_resize(win, 320, 480);
512    evas_object_show(win);
513 }
514
515 void
516 test_web_normal(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
517 {
518    test_web(data, obj, event_info, EINA_FALSE);
519 }
520
521 void
522 test_web_mobile(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
523 {
524    test_web(data, obj, event_info, EINA_TRUE);
525 }
526 #endif