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