elm genlist: Fixed a bug with decorate all mode + tree effect. Delete tree effect...
[framework/uifw/elementary.git] / src / lib / elm_web.c
1 #include <Elementary.h>
2 #include "elm_priv.h"
3
4 // TODO:
5 //  1 - easy to use zoom like elm_photocam API
6 //  2 - review scrolling to match elm_scroller. Maybe in future use elm_scroller
7
8 #ifdef HAVE_ELEMENTARY_WEB
9 #include <EWebKit.h>
10
11 /* Similar to iPhone */
12 // TODO: switch between iPhone, iPad or Chrome/Safari based on some elm setting?
13 #define ELM_WEB_USER_AGENT "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3 " PACKAGE_NAME "/" PACKAGE_VERSION
14
15 static Ewk_View_Smart_Class _parent_sc = EWK_VIEW_SMART_CLASS_INIT_NULL;
16
17 typedef struct _View_Smart_Data View_Smart_Data;
18 struct _View_Smart_Data
19 {
20    Ewk_View_Smart_Data base;
21    struct
22      {
23         Evas_Event_Mouse_Down event;
24         Evas_Coord x, y;
25         unsigned int move_count;
26         Ecore_Timer *longpress_timer;
27         Ecore_Animator *pan_anim;
28      } mouse;
29 };
30 #endif
31
32 typedef struct _Widget_Data Widget_Data;
33 struct _Widget_Data
34 {
35    Evas_Object *self;
36 #ifdef HAVE_ELEMENTARY_WEB
37    Evas_Object *ewk_view;
38    struct
39      {
40         Elm_Web_Window_Open window_create;
41         void *window_create_data;
42         Elm_Web_Dialog_Alert alert;
43         void *alert_data;
44         Elm_Web_Dialog_Confirm confirm;
45         void *confirm_data;
46         Elm_Web_Dialog_Prompt prompt;
47         void *prompt_data;
48         Elm_Web_Dialog_File_Selector file_selector;
49         void *file_selector_data;
50         Elm_Web_Console_Message console_message;
51         void *console_message_data;
52      } hook;
53    Elm_Win_Keyboard_Mode input_method;
54    struct
55      {
56         Elm_Web_Zoom_Mode mode;
57         float current;
58         float min, max;
59         Eina_Bool no_anim;
60         Ecore_Timer *timer;
61      } zoom;
62    struct
63      {
64         struct
65           {
66              int x, y;
67           } start, end;
68         Ecore_Animator *animator;
69      } bring_in;
70    Eina_Bool tab_propagate : 1;
71    Eina_Bool inwin_mode : 1;
72 #else
73    Evas_Object *label;
74 #endif
75 };
76
77 enum Dialog_Type
78 {
79    DIALOG_ALERT,
80    DIALOG_CONFIRM,
81    DIALOG_PROMPT,
82    DIALOG_FILE_SELECTOR
83 };
84
85 typedef struct _Dialog_Data Dialog_Data;
86 struct _Dialog_Data
87 {
88    enum Dialog_Type type;
89    Evas_Object *dialog;
90    Evas_Object *box;
91    Evas_Object *bt_ok, *bt_cancel;
92    Evas_Object *entry;
93    Evas_Object *file_sel;
94
95    Eina_Bool   *response;
96    char       **entry_value;
97    Eina_List  **selected_files;
98 };
99
100 struct _Elm_Web_Callback_Proxy_Context
101 {
102    const char *name;
103    Evas_Object *obj;
104 };
105 typedef struct _Elm_Web_Callback_Proxy_Context Elm_Web_Callback_Proxy_Context;
106
107 static const char *widtype = NULL;
108 static const Evas_Smart_Cb_Description _elm_web_callback_names[] = {
109    { "download,request", "p" },
110    { "editorclient,contents,changed", "" },
111    { "editorclient,selection,changed", "" },
112    { "frame,created", "p" },
113    { "icon,received", "" },
114    { "inputmethod,changed", "b" },
115    { "js,windowobject,clear", "" },
116    { "link,hover,in", "p" },
117    { "link,hover,out", "" },
118    { "load,document,finished", "p" },
119    { "load,error", "p" },
120    { "load,finished", "p" },
121    { "load,newwindow,show", "" },
122    { "load,progress", "d" },
123    { "load,provisional", "" },
124    { "load,started", "" },
125    { "menubar,visible,get", "b" },
126    { "menubar,visible,set", "b" },
127    { "popup,created", "p" },
128    { "popup,willdelete", "p" },
129    { "ready", "" },
130    { "scrollbars,visible,get", "b" },
131    { "scrollbars,visible,set", "b" },
132    { "statusbar,text,set", "s" },
133    { "statusbar,visible,get", "b" },
134    { "statusbar,visible,set", "b" },
135    { "title,changed", "s" },
136    { "toolbars,visible,get", "b" },
137    { "toolbars,visible,set", "b" },
138    { "tooltip,text,set", "s" },
139    { "uri,changed", "s" },
140    { "view,resized", "" },
141    { "windows,close,request", ""},
142    { "zoom,animated,end", "" },
143    { NULL, NULL }
144 };
145
146 #ifdef HAVE_ELEMENTARY_WEB
147 static char *
148 _webkit_theme_find(const Eina_List *list)
149 {
150    const Eina_List *l;
151    const char *th;
152
153    EINA_LIST_FOREACH(list, l, th)
154      {
155         char *path = elm_theme_list_item_path_get(th, NULL);
156         if (!path) continue;
157         if (edje_file_group_exists(path, "webkit/base"))
158           return path;
159         free(path);
160      }
161
162    return NULL;
163 }
164 #endif
165
166 static void
167 _theme_hook(Evas_Object *obj)
168 {
169 #ifdef HAVE_ELEMENTARY_WEB
170    Elm_Theme *theme = elm_object_theme_get(obj);
171    Widget_Data *wd = elm_widget_data_get(obj);
172    const Eina_List *themes;
173    char *view_theme = NULL;
174
175    themes = elm_theme_overlay_list_get(theme);
176    view_theme = _webkit_theme_find(themes);
177    if (view_theme) goto set;
178
179    themes = elm_theme_list_get(theme);
180    view_theme = _webkit_theme_find(themes);
181    if (view_theme) goto set;
182
183    themes = elm_theme_extension_list_get(theme);
184    view_theme = _webkit_theme_find(themes);
185
186 set:
187    if (view_theme)
188      {
189         ewk_view_theme_set(wd->ewk_view, view_theme);
190         free(view_theme);
191      }
192    else
193      ewk_view_theme_set(wd->ewk_view, WEBKIT_DATADIR"/themes/default.edj");
194 #else
195    (void)obj;
196 #endif
197 }
198
199 static void
200 _on_focus_hook(void *data __UNUSED__, Evas_Object *obj)
201 {
202 #ifdef HAVE_ELEMENTARY_WEB
203    Widget_Data *wd = elm_widget_data_get(obj);
204    Evas_Object *top = elm_widget_top_get(obj);
205
206    if (!wd) return;
207
208    if (elm_object_focus_get(obj))
209      {
210         evas_object_focus_set(wd->ewk_view, EINA_TRUE);
211         if (top) elm_win_keyboard_mode_set(top, wd->input_method);
212      }
213    else
214      {
215         evas_object_focus_set(wd->ewk_view, EINA_FALSE);
216         if (top) elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF);
217      }
218 #else
219    (void)obj;
220 #endif
221 }
222
223 static Eina_Bool
224 _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info)
225 {
226 #ifdef HAVE_ELEMENTARY_WEB
227    Evas_Event_Key_Down *ev = event_info;
228    Widget_Data *wd = elm_widget_data_get(obj);
229
230    if (!wd) return EINA_FALSE;
231    if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE;
232    if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_FALSE;
233    if (elm_widget_disabled_get(obj)) return EINA_FALSE;
234
235    if ((!strcmp(ev->keyname, "Tab")) && (!wd->tab_propagate))
236      {
237         ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
238         return EINA_TRUE;
239      }
240    else
241      return EINA_FALSE;
242 #else
243    return EINA_FALSE;
244    (void)obj;
245    (void)type;
246    (void)event_info;
247 #endif
248 }
249
250 #ifdef HAVE_ELEMENTARY_WEB
251 static Eina_Bool
252 _view_pan_animator(void *data)
253 {
254    View_Smart_Data *sd = data;
255    Evas_Coord x, y, dx, dy;
256
257    evas_pointer_canvas_xy_get(sd->base.base.evas, &x, &y);
258
259    dx = sd->mouse.x - x;
260    dy = sd->mouse.y - y;
261
262    if ((dx == 0) && (dy == 0))
263      goto end;
264
265    ewk_frame_scroll_add(sd->base.main_frame, dx, dy);
266
267    sd->mouse.x = x;
268    sd->mouse.y = y;
269
270  end:
271    return EINA_TRUE;
272 }
273
274 static void
275 _view_smart_add(Evas_Object *obj)
276 {
277    View_Smart_Data *sd;
278
279    sd = calloc(1, sizeof(View_Smart_Data));
280    evas_object_smart_data_set(obj, sd);
281
282    _parent_sc.sc.add(obj);
283
284    ewk_view_history_enable_set(obj, EINA_TRUE);
285    ewk_history_limit_set(ewk_view_history_get(obj), 100);
286    // TODO: auto toggle between smooth/nearest during bring-in animations
287    //ewk_view_zoom_weak_smooth_scale_set(obj, EINA_TRUE);
288 }
289
290 static void
291 _view_smart_del(Evas_Object *obj)
292 {
293    View_Smart_Data *sd;
294
295    sd = evas_object_smart_data_get(obj);
296
297    if (sd->mouse.pan_anim)
298      ecore_animator_del(sd->mouse.pan_anim);
299
300    _parent_sc.sc.del(obj);
301 }
302
303 static Eina_Bool
304 _view_longpress_timer(void *data)
305 {
306    View_Smart_Data *sd = data;
307
308    sd->mouse.move_count = 0;
309    sd->mouse.longpress_timer = NULL;
310    return ECORE_CALLBACK_CANCEL;
311 }
312
313 static Eina_Bool
314 _view_smart_mouse_down(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Down *event)
315 {
316    // TODO: mimic elm_scroller and like
317    // TODO-minor: offer hook?
318    View_Smart_Data *sd = (View_Smart_Data *)esd;
319
320    if (event->button != 1)
321      return _parent_sc.mouse_down(esd, event);
322
323    sd->mouse.pan_anim = ecore_animator_add(_view_pan_animator, sd);
324    sd->mouse.longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _view_longpress_timer, sd);
325    sd->mouse.move_count = 1;
326    sd->mouse.x = event->canvas.x;
327    sd->mouse.y = event->canvas.y;
328    sd->mouse.event = *event;
329
330    return EINA_TRUE;
331 }
332
333 static Eina_Bool
334 _view_smart_mouse_up(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Up *event)
335 {
336    // TODO: mimic elm_scroller and like
337    // TODO-minor: offer hook?
338    View_Smart_Data *sd = (View_Smart_Data *)esd;
339
340    if (sd->mouse.pan_anim)
341      {
342         ecore_animator_del(sd->mouse.pan_anim);
343         sd->mouse.pan_anim = NULL;
344
345         if (sd->mouse.longpress_timer)
346           _parent_sc.mouse_down(esd, &sd->mouse.event);
347         else
348           return EINA_TRUE;
349      }
350
351    if (sd->mouse.longpress_timer)
352      {
353         ecore_timer_del(sd->mouse.longpress_timer);
354         sd->mouse.longpress_timer = NULL;
355      }
356
357    sd->mouse.move_count = 0;
358    return _parent_sc.mouse_up(esd, event);
359 }
360
361 static Eina_Bool
362 _view_smart_mouse_move(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Move *event)
363 {
364    // TODO: mimic elm_scroller and like
365    // TODO-minor: offer hook?
366    View_Smart_Data *sd = (View_Smart_Data *)esd;
367    sd->mouse.move_count++;
368
369    if (sd->mouse.longpress_timer &&
370        (((sd->mouse.x ^ sd->mouse.event.canvas.x) |
371          (sd->mouse.y ^ sd->mouse.event.canvas.y)) & (~0x07)))
372      {
373         ecore_timer_del(sd->mouse.longpress_timer);
374         sd->mouse.longpress_timer = NULL;
375      }
376
377    if (sd->mouse.pan_anim)
378      {
379         return EINA_FALSE;
380      }
381
382    return _parent_sc.mouse_move(esd, event);
383 }
384
385 static Evas_Object *
386 _view_smart_window_create(Ewk_View_Smart_Data *sd, Eina_Bool javascript, const Ewk_Window_Features *window_features)
387 {
388    Evas_Object *new;
389    Evas_Object *obj = evas_object_smart_parent_get(sd->self);
390    Widget_Data *wd = elm_widget_data_get(obj);
391
392    if (!wd->hook.window_create) return NULL;
393    new = wd->hook.window_create(wd->hook.window_create_data, obj, javascript,
394                         (const Elm_Web_Window_Features *)window_features);
395    if (new) return elm_web_webkit_view_get(new);
396
397    return NULL;
398 }
399
400 static void
401 _view_smart_window_close(Ewk_View_Smart_Data *sd)
402 {
403    Evas_Object *obj = evas_object_smart_parent_get(sd->self);
404    evas_object_smart_callback_call(obj, "windows,close,request", NULL);
405 }
406
407 static void
408 _bt_close(void *data, Evas_Object *obj, void *event_info __UNUSED__)
409 {
410    Dialog_Data *d = data;
411
412    *d->response = (obj == d->bt_ok);
413    if ((d->type == DIALOG_PROMPT) && (*d->response == EINA_TRUE))
414      *d->entry_value = strdup(elm_entry_entry_get(d->entry));
415    evas_object_del(d->dialog);
416 }
417
418 static void
419 _file_sel_done(void *data, Evas_Object *obj __UNUSED__, void *event_info)
420 {
421    Dialog_Data *d = data;
422    if (event_info)
423      {
424         *d->selected_files = eina_list_append(NULL, strdup(event_info));
425         *d->response = EINA_TRUE;
426      }
427    else
428      *d->response = EINA_FALSE;
429    evas_object_del(d->dialog);
430    free(d);
431 }
432
433 static Dialog_Data *
434 _dialog_new(Evas_Object *parent)
435 {
436    Dialog_Data *d;
437    Widget_Data *wd = elm_widget_data_get(parent);
438
439    d = calloc(1, sizeof(Dialog_Data));
440    if (!d) return NULL;
441
442    if (!parent || !wd->inwin_mode)
443      {
444         Evas_Object *bg;
445
446         d->dialog = elm_win_add(NULL, "elm-web-popup", ELM_WIN_DIALOG_BASIC);
447         evas_object_smart_callback_add(d->dialog, "delete,request",
448                                        _bt_close, d);
449
450         bg = elm_bg_add(d->dialog);
451         evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND,
452                                          EVAS_HINT_EXPAND);
453         elm_win_resize_object_add(d->dialog, bg);
454         evas_object_show(bg);
455
456         d->box = elm_box_add(d->dialog);
457         evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND,
458                                          EVAS_HINT_EXPAND);
459         elm_win_resize_object_add(d->dialog, d->box);
460         evas_object_show(d->box);
461      }
462    else
463      {
464         Evas_Object *win = elm_widget_top_get(parent);
465         d->dialog = elm_win_inwin_add(win);
466         elm_object_style_set(d->dialog, "minimal");
467         evas_object_size_hint_weight_set(d->dialog, EVAS_HINT_EXPAND,
468                                          EVAS_HINT_EXPAND);
469
470         d->box = elm_box_add(win);
471         evas_object_size_hint_weight_set(d->box, EVAS_HINT_EXPAND,
472                                          EVAS_HINT_EXPAND);
473         elm_win_inwin_content_set(d->dialog, d->box);
474         evas_object_show(d->box);
475      }
476
477    return d;
478 }
479
480 static Evas_Object *
481 _run_dialog(Evas_Object *parent, enum Dialog_Type type, const char *message, const char *default_entry_value, char **entry_value, Eina_Bool allows_multiple_files __UNUSED__, Eina_List *accept_types __UNUSED__, Eina_List **selected_filenames, Eina_Bool *response)
482 {
483    EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!default_entry_value), EINA_FALSE);
484    EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!entry_value), EINA_FALSE);
485
486    Dialog_Data *dialog_data = _dialog_new(evas_object_smart_parent_get(parent));
487    Evas_Object *lb;
488
489    if (type != DIALOG_FILE_SELECTOR)
490      {
491         lb = elm_label_add(dialog_data->box);
492         elm_object_text_set(lb, message);
493         elm_box_pack_end(dialog_data->box, lb);
494         evas_object_show(lb);
495      }
496
497    dialog_data->type = type;
498    dialog_data->response = response;
499    dialog_data->entry_value = entry_value;
500    dialog_data->selected_files = selected_filenames;
501
502    if (type == DIALOG_ALERT)
503      {
504         dialog_data->bt_ok = elm_button_add(dialog_data->box);
505         elm_object_text_set(dialog_data->bt_ok, "Close");
506         elm_box_pack_end(dialog_data->box, dialog_data->bt_ok);
507         evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
508         evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data);
509         evas_object_show(dialog_data->bt_ok);
510      }
511    else if (type == DIALOG_FILE_SELECTOR)
512      {
513         dialog_data->file_sel = elm_fileselector_add(dialog_data->dialog);
514         evas_object_size_hint_weight_set(dialog_data->file_sel,
515                                          EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
516         evas_object_size_hint_align_set(dialog_data->file_sel, EVAS_HINT_FILL,
517                                         EVAS_HINT_FILL);
518         elm_box_pack_end(dialog_data->box, dialog_data->file_sel);
519         evas_object_show(dialog_data->file_sel);
520
521         elm_fileselector_path_set(dialog_data->file_sel, ".");
522         elm_fileselector_is_save_set(dialog_data->file_sel, EINA_FALSE);
523         elm_fileselector_folder_only_set(dialog_data->file_sel, EINA_FALSE);
524         elm_fileselector_buttons_ok_cancel_set(dialog_data->file_sel,
525                                                EINA_TRUE);
526         elm_fileselector_expandable_set(dialog_data->file_sel, EINA_FALSE);
527         evas_object_smart_callback_add(dialog_data->file_sel, "done",
528                                        _file_sel_done, dialog_data);
529         // fileselector can't set it's minimum size correctly
530         evas_object_size_hint_min_set(dialog_data->file_sel, 300, 400);
531      }
532    else
533      {
534         if (type == DIALOG_PROMPT)
535           {
536              dialog_data->entry = elm_entry_add(dialog_data->box);
537              elm_entry_single_line_set(dialog_data->entry, EINA_TRUE);
538              elm_entry_scrollable_set(dialog_data->entry, EINA_TRUE);
539              elm_entry_entry_set(dialog_data->entry, default_entry_value);
540              evas_object_size_hint_align_set(dialog_data->entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
541              evas_object_size_hint_weight_set(dialog_data->entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
542              elm_box_pack_end(dialog_data->box, dialog_data->entry);
543              evas_object_show(dialog_data->entry);
544           }
545
546         if (type == DIALOG_PROMPT || type == DIALOG_CONFIRM)
547           {
548              Evas_Object *bx_h = elm_box_add(dialog_data->box);
549              elm_box_horizontal_set(bx_h, 1);
550              elm_box_pack_end(dialog_data->box, bx_h);
551              evas_object_size_hint_weight_set(bx_h, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
552              evas_object_size_hint_align_set(bx_h, EVAS_HINT_FILL, EVAS_HINT_FILL);
553              evas_object_show(bx_h);
554
555              dialog_data->bt_cancel = elm_button_add(bx_h);
556              elm_object_text_set(dialog_data->bt_cancel, "Cancel");
557              elm_box_pack_end(bx_h, dialog_data->bt_cancel);
558              evas_object_size_hint_weight_set(dialog_data->bt_cancel, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
559              evas_object_size_hint_align_set(dialog_data->bt_cancel, EVAS_HINT_FILL, EVAS_HINT_FILL);
560              evas_object_smart_callback_add(dialog_data->bt_cancel, "clicked", _bt_close, dialog_data);
561              evas_object_show(dialog_data->bt_cancel);
562
563              dialog_data->bt_ok = elm_button_add(bx_h);
564              elm_object_text_set(dialog_data->bt_ok, "Ok");
565              elm_box_pack_end(bx_h, dialog_data->bt_ok);
566              evas_object_size_hint_weight_set(dialog_data->bt_ok, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
567              evas_object_size_hint_align_set(dialog_data->bt_ok, EVAS_HINT_FILL, EVAS_HINT_FILL);
568              evas_object_smart_callback_add(dialog_data->bt_ok, "clicked", _bt_close, dialog_data);
569              evas_object_show(dialog_data->bt_ok);
570           }
571         else
572            return EINA_FALSE;
573      }
574
575    evas_object_show(dialog_data->dialog);
576
577    return dialog_data->dialog;
578 }
579
580 static void
581 _dialog_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
582 {
583    ecore_main_loop_quit();
584 }
585
586 static void
587 _exec_dialog(Evas_Object *dialog)
588 {
589    evas_object_event_callback_add(dialog, EVAS_CALLBACK_DEL, _dialog_del_cb,
590                                   NULL);
591    ecore_main_loop_begin();
592 }
593
594 /* called by ewk_view when javascript called alert()
595  *
596  */
597 static void
598 _view_smart_run_javascript_alert(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message)
599 {
600    View_Smart_Data *sd = (View_Smart_Data *)esd;
601    Evas_Object *view = sd->base.self;
602    Evas_Object *obj = evas_object_smart_parent_get(view);
603    Evas_Object *diag = NULL;
604    Widget_Data *wd = elm_widget_data_get(obj);
605    Eina_Bool response = EINA_FALSE;
606
607    if (wd->hook.alert)
608      diag = wd->hook.alert(wd->hook.alert_data, obj, message);
609    else
610      diag = _run_dialog(view, DIALOG_ALERT, message, NULL, NULL, EINA_FALSE,
611                         NULL, NULL, &response);
612    if (diag) _exec_dialog(diag);
613 }
614
615 /* called by ewk_view when javascript called confirm()
616  *
617  */
618 static Eina_Bool
619 _view_smart_run_javascript_confirm(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message)
620 {
621    View_Smart_Data *sd = (View_Smart_Data *)esd;
622    Evas_Object *view = sd->base.self;
623    Evas_Object *obj = evas_object_smart_parent_get(view);
624    Evas_Object *diag = NULL;
625    Widget_Data *wd = elm_widget_data_get(obj);
626    Eina_Bool response = EINA_FALSE;
627
628    if (wd->hook.confirm)
629      diag = wd->hook.confirm(wd->hook.confirm_data, obj, message, &response);
630    else
631     diag = _run_dialog(view, DIALOG_CONFIRM, message, NULL, NULL, EINA_FALSE,
632                        NULL, NULL, &response);
633    if (diag) _exec_dialog(diag);
634    return response;
635 }
636
637 /* called by ewk_view when javascript called confirm()
638  *
639  */
640 static Eina_Bool
641 _view_smart_run_javascript_prompt(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, const char *message, const char *default_value, char **value)
642 {
643    View_Smart_Data *sd = (View_Smart_Data *)esd;
644    Evas_Object *view = sd->base.self;
645    Evas_Object *obj = evas_object_smart_parent_get(view);
646    Evas_Object *diag = NULL;
647    Widget_Data *wd = elm_widget_data_get(obj);
648    Eina_Bool response = EINA_FALSE;
649
650    if (wd->hook.prompt)
651      diag = wd->hook.prompt(wd->hook.prompt_data, obj, message, default_value,
652                             value, &response);
653    else
654      diag = _run_dialog(view, DIALOG_PROMPT, message, default_value, value,
655                         EINA_FALSE, NULL, NULL, &response);
656    if (diag) _exec_dialog(diag);
657    if (!response)
658       *value = NULL;
659
660    return EINA_TRUE;
661 }
662
663 static Eina_Bool
664 _view_smart_run_open_panel(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, Eina_Bool allows_multiple_files, Eina_List *accept_types, Eina_List **selected_filenames)
665 {
666    View_Smart_Data *sd = (View_Smart_Data *)esd;
667    Evas_Object *view = sd->base.self;
668    Evas_Object *obj = evas_object_smart_parent_get(view);
669    Evas_Object *diag = NULL;
670    Widget_Data *wd = elm_widget_data_get(obj);
671    Eina_Bool response = EINA_FALSE;
672
673    if (wd->hook.file_selector)
674      diag = wd->hook.file_selector(wd->hook.file_selector_data, obj,
675                                    allows_multiple_files, accept_types,
676                                    selected_filenames, &response);
677    else
678      diag = _run_dialog(view, DIALOG_FILE_SELECTOR, NULL, NULL, NULL,
679                         allows_multiple_files, accept_types, selected_filenames,
680                         &response);
681    if (diag) _exec_dialog(diag);
682
683    return response;
684 }
685
686 static void
687 _view_smart_add_console_message(Ewk_View_Smart_Data *esd, const char *message, unsigned int line_number, const char *source_id)
688 {
689    Evas_Object *obj = evas_object_smart_parent_get(esd->self);
690    Widget_Data *wd = elm_widget_data_get(obj);
691
692    if (wd->hook.console_message)
693      wd->hook.console_message(wd->hook.console_message_data, obj, message,
694                               line_number, source_id);
695 }
696
697 static Eina_Bool
698 _view_smart_focus_can_cycle(Ewk_View_Smart_Data *sd, Ewk_Focus_Direction direction)
699 {
700    Evas_Object *obj = evas_object_smart_parent_get(sd->self);
701    Elm_Focus_Direction dir;
702
703    switch (direction)
704      {
705       case EWK_FOCUS_DIRECTION_FORWARD:
706          dir = ELM_FOCUS_NEXT;
707          break;
708       case EWK_FOCUS_DIRECTION_BACKWARD:
709          dir = ELM_FOCUS_PREVIOUS;
710          break;
711       default:
712          return EINA_FALSE;
713      }
714
715    elm_widget_focus_cycle(elm_widget_parent_get(obj), dir);
716
717    return EINA_TRUE;
718 }
719
720 /**
721  * Creates a new view object given the parent.
722  *
723  * @param parent object to use as parent.
724  *
725  * @return newly added Evas_Object or @c NULL on errors.
726  */
727 Evas_Object *
728 _view_add(Evas_Object *parent)
729 {
730    static Evas_Smart *smart = NULL;
731    Evas *canvas = evas_object_evas_get(parent);
732    Evas_Object *view;
733
734    if (!smart)
735      {
736         static Ewk_View_Smart_Class api = EWK_VIEW_SMART_CLASS_INIT_NAME_VERSION("EWK_View_Elementary");
737
738 #ifndef TILED_BACKING_STORE
739         ewk_view_single_smart_set(&api);
740 #else
741         ewk_view_tiled_smart_set(&api);
742 #endif
743
744         _parent_sc = api;
745
746         // TODO: check every api method and provide overrides with hooks!
747         // TODO: hooks should provide extension points
748         // TODO: extension should have some kind of "default implementation",
749         // TODO: that can be replaced or controlled by hooks.
750         // TODO: ie: run_javascript_alert() should present an elm_win
751         // TODO: by default, but user could override it to show as inwin.
752         api.sc.add = _view_smart_add;
753         api.sc.del = _view_smart_del;
754         //api.sc.calculate = _view_smart_calculate;
755         api.mouse_down = _view_smart_mouse_down;
756         api.mouse_up = _view_smart_mouse_up;
757         api.mouse_move = _view_smart_mouse_move;
758         api.add_console_message = _view_smart_add_console_message;
759         api.window_create = _view_smart_window_create;
760         api.window_close = _view_smart_window_close;
761         api.run_javascript_alert = _view_smart_run_javascript_alert;
762         api.run_javascript_confirm = _view_smart_run_javascript_confirm;
763         api.run_javascript_prompt = _view_smart_run_javascript_prompt;
764         api.run_open_panel = _view_smart_run_open_panel;
765         api.focus_can_cycle = _view_smart_focus_can_cycle;
766
767         smart = evas_smart_class_new(&api.sc);
768         if (!smart)
769           {
770              CRITICAL("Could not create smart class");
771              return NULL;
772           }
773      }
774
775    view = evas_object_smart_add(canvas, smart);
776    if (!view)
777      {
778         ERR("Could not create smart object object for view");
779         return NULL;
780      }
781
782    return view;
783 }
784
785 static void
786 _ewk_view_inputmethod_change_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
787 {
788    Widget_Data *wd = data;
789    Evas_Object *top = elm_widget_top_get(wd->self);
790    if (!top) return;
791
792    if (event_info)
793      wd->input_method = ELM_WIN_KEYBOARD_ON;
794    else
795      wd->input_method = ELM_WIN_KEYBOARD_OFF;
796    elm_win_keyboard_mode_set(top, wd->input_method);
797 }
798
799 static void
800 _ewk_view_load_started_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
801 {
802    _ewk_view_inputmethod_change_cb(data, obj, (void *)(long)EINA_FALSE);
803 }
804
805 static void
806 _ewk_view_load_finished_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
807 {
808    Widget_Data *wd = data;
809
810    if (event_info)
811      return;
812
813    if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
814      {
815         float tz = wd->zoom.current;
816         wd->zoom.current = 0.0;
817         elm_web_zoom_set(wd->self, tz);
818      }
819 }
820
821 static void
822 _ewk_view_viewport_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
823 {
824    Widget_Data *wd = data;
825
826    if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
827      {
828         ewk_view_zoom_set(obj, 1.0, 0, 0);
829         wd->zoom.no_anim = EINA_TRUE;
830      }
831 }
832
833 static Eina_Bool
834 _restore_zoom_mode_timer_cb(void *data)
835 {
836    Widget_Data *wd = data;
837    float tz = wd->zoom.current;
838    wd->zoom.timer = NULL;
839    wd->zoom.current = 0.0;
840    wd->zoom.no_anim = EINA_TRUE;
841    elm_web_zoom_set(wd->self, tz);
842    return EINA_FALSE;
843 }
844
845 static Eina_Bool
846 _reset_zoom_timer_cb(void *data)
847 {
848    Widget_Data *wd = data;
849    wd->zoom.timer = ecore_timer_add(0.0, _restore_zoom_mode_timer_cb, wd);
850    ewk_view_zoom_set(wd->ewk_view, 1.0, 0, 0);
851    return EINA_FALSE;
852 }
853
854 static void
855 _ewk_view_resized_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
856 {
857    Widget_Data *wd = data;
858    if (!(wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL))
859      return;
860    if (wd->zoom.timer)
861      ecore_timer_del(wd->zoom.timer);
862    wd->zoom.timer = ecore_timer_add(0.5, _reset_zoom_timer_cb, wd);
863 }
864
865 static void
866 _popup_del_job(void *data)
867 {
868    evas_object_del(data);
869 }
870
871 static void
872 _popup_will_delete(void *data, Evas_Object *obj, void *event_info __UNUSED__)
873 {
874    ecore_job_add(_popup_del_job, data);
875    evas_object_smart_callback_del(obj, "popup,willdelete", _popup_will_delete);
876 }
877
878 static void
879 _popup_item_selected(void *data, Evas_Object *obj, void *event_info __UNUSED__)
880 {
881    Evas_Object *view = data;
882    Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
883    const Eina_List *itr, *list = elm_list_items_get(obj);
884    void *d;
885    int i = 0;
886
887    EINA_LIST_FOREACH(list, itr, d)
888    {
889       if (d == list_it)
890          break;
891
892       i++;
893    }
894
895    ewk_view_popup_selected_set(view, i);
896    ewk_view_popup_destroy(view);
897 }
898
899 static void
900 _popup_dismiss_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
901 {
902    ewk_view_popup_destroy(data);
903 }
904
905 static void
906 _ewk_view_popup_create_cb(void *data, Evas_Object *obj, void *event_info)
907 {
908    Widget_Data *wd = data;
909    Ewk_Menu *m = event_info;
910    Elm_Web_Menu m2;
911    Ewk_Menu_Item *it;
912    Eina_List *itr;
913    Evas_Object *notify, *list;
914
915    m2.items = m->items;
916    m2.x = m->x;
917    m2.y = m->y;
918    m2.width = m->width;
919    m2.height = m->height;
920    m2.handled = EINA_FALSE;
921    evas_object_smart_callback_call(wd->self, "popup,create", &m2);
922    if (m2.handled)
923      return;
924
925    notify = elm_notify_add(obj);
926    elm_notify_allow_events_set(notify, EINA_FALSE);
927    elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM);
928
929    list = elm_list_add(obj);
930    elm_list_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
931    elm_list_bounce_set(list, EINA_FALSE, EINA_FALSE);
932    elm_list_mode_set(list, ELM_LIST_EXPAND);
933    evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
934    evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
935    elm_object_content_set(notify, list);
936    evas_object_show(list);
937
938    EINA_LIST_FOREACH(m->items, itr, it)
939       elm_list_item_append(list, it->text, NULL, NULL, _popup_item_selected,
940                            obj);
941    elm_list_go(list);
942
943    evas_object_show(notify);
944
945    evas_object_smart_callback_add(obj, "popup,willdelete", _popup_will_delete,
946                                   notify);
947    evas_object_smart_callback_add(notify, "block,clicked", _popup_dismiss_cb,
948                                   obj);
949 }
950
951 static void
952 _view_smart_callback_proxy_free_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
953 {
954    free(data);
955 }
956
957 static void
958 _view_smart_callback_proxy_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
959 {
960    Elm_Web_Callback_Proxy_Context *ctxt = data;
961
962    evas_object_smart_callback_call(ctxt->obj, ctxt->name, event_info);
963 }
964
965 static void
966 _view_smart_callback_proxy(Evas_Object *view, Evas_Object *parent)
967 {
968    const Evas_Smart_Cb_Description **cls_descs, **inst_descs;
969    unsigned int cls_count, inst_count, total;
970    Elm_Web_Callback_Proxy_Context *ctxt;
971
972    evas_object_smart_callbacks_descriptions_get(view, &cls_descs, &cls_count,
973                                                 &inst_descs, &inst_count);
974    total = cls_count + inst_count;
975    if (!total) return;
976    ctxt = malloc(sizeof(Elm_Web_Callback_Proxy_Context) * total);
977    if (!ctxt) return;
978    evas_object_event_callback_add(view, EVAS_CALLBACK_FREE,
979                                   _view_smart_callback_proxy_free_cb, ctxt);
980
981    for (; cls_count > 0; cls_count--, cls_descs++, ctxt++)
982      {
983         const Evas_Smart_Cb_Description *d = *cls_descs;
984         if (!strcmp(d->name, "popup,create"))
985           continue;
986         ctxt->name = d->name;
987         ctxt->obj = parent;
988         evas_object_smart_callback_add(view, d->name,
989                                        _view_smart_callback_proxy_cb, ctxt);
990      }
991
992    for (; inst_count > 0; inst_count--, inst_descs++, ctxt++)
993      {
994         const Evas_Smart_Cb_Description *d = *inst_descs;
995         ctxt->name = d->name;
996         ctxt->obj = parent;
997         evas_object_smart_callback_add(view, d->name,
998                                        _view_smart_callback_proxy_cb, ctxt);
999      }
1000 }
1001
1002 static Eina_Bool
1003 _bring_in_anim_cb(void *data, double pos)
1004 {
1005    Widget_Data *wd = data;
1006    Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1007    int sx, sy, rx, ry;
1008
1009    sx = wd->bring_in.start.x;
1010    sy = wd->bring_in.start.y;
1011    rx = (wd->bring_in.end.x - sx) * pos;
1012    ry = (wd->bring_in.end.y - sy) * pos;
1013
1014    ewk_frame_scroll_set(frame, rx + sx, ry + sy);
1015
1016    if (pos == 1.0)
1017      {
1018         wd->bring_in.end.x = wd->bring_in.end.y = wd->bring_in.start.x =
1019            wd->bring_in.start.y = 0;
1020         wd->bring_in.animator = NULL;
1021      }
1022
1023    return EINA_TRUE;
1024 }
1025 #endif
1026
1027 #ifdef HAVE_ELEMENTARY_WEB
1028 static int _elm_need_web = 0;
1029 #endif
1030
1031 void
1032 _elm_unneed_web(void)
1033 {
1034 #ifdef HAVE_ELEMENTARY_WEB
1035    if (--_elm_need_web) return;
1036
1037    _elm_need_web = 0;
1038    ewk_shutdown();
1039 #endif
1040 }
1041
1042 EAPI Eina_Bool
1043 elm_need_web(void)
1044 {
1045 #ifdef HAVE_ELEMENTARY_WEB
1046    if (_elm_need_web++) return EINA_TRUE;
1047    ewk_init();
1048    return EINA_TRUE;
1049 #else
1050    return EINA_FALSE;
1051 #endif
1052 }
1053
1054 EAPI Evas_Object *
1055 elm_web_add(Evas_Object *parent)
1056 {
1057    Evas_Object *obj;
1058    Widget_Data *wd;
1059    Evas *e;
1060
1061    EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
1062
1063    wd = calloc(1, sizeof(Widget_Data));
1064    e = evas_object_evas_get(parent);
1065    if (!e)
1066      return NULL;
1067    obj = elm_widget_add(e);
1068    wd->self = obj;
1069
1070    if (!widtype)
1071      {
1072         widtype = eina_stringshare_add("web");
1073         elm_widget_type_register(&widtype);
1074      }
1075
1076    elm_widget_type_set(obj, widtype);
1077    elm_widget_sub_object_add(parent, obj);
1078    elm_widget_theme_hook_set(obj, _theme_hook);
1079    elm_widget_on_focus_hook_set(obj, _on_focus_hook, NULL);
1080    elm_widget_event_hook_set(obj, _event_hook);
1081    elm_widget_data_set(obj, wd);
1082    elm_widget_can_focus_set(obj, EINA_TRUE);
1083
1084 #ifdef HAVE_ELEMENTARY_WEB
1085    wd->ewk_view = _view_add(obj);
1086    ewk_view_setting_user_agent_set(wd->ewk_view, ELM_WEB_USER_AGENT);
1087
1088    wd->input_method = ELM_WIN_KEYBOARD_OFF;
1089    evas_object_smart_callback_add(wd->ewk_view, "inputmethod,changed",
1090                                   _ewk_view_inputmethod_change_cb, wd);
1091    evas_object_smart_callback_add(wd->ewk_view, "load,started",
1092                                   _ewk_view_load_started_cb, wd);
1093    evas_object_smart_callback_add(wd->ewk_view, "popup,create",
1094                                   _ewk_view_popup_create_cb, wd);
1095    evas_object_smart_callback_add(wd->ewk_view, "load,finished",
1096                                   _ewk_view_load_finished_cb, wd);
1097    evas_object_smart_callback_add(wd->ewk_view, "viewport,changed",
1098                                   _ewk_view_viewport_changed_cb, wd);
1099    evas_object_smart_callback_add(wd->ewk_view, "view,resized",
1100                                   _ewk_view_resized_cb, wd);
1101
1102    elm_widget_resize_object_set(obj, wd->ewk_view);
1103
1104    wd->tab_propagate = EINA_FALSE;
1105    wd->inwin_mode = _elm_config->inwin_dialogs_enable;
1106    wd->zoom.min = ewk_view_zoom_range_min_get(wd->ewk_view);
1107    wd->zoom.max = ewk_view_zoom_range_max_get(wd->ewk_view);
1108    wd->zoom.current = 1.0;
1109
1110    _view_smart_callback_proxy(wd->ewk_view, wd->self);
1111    evas_object_smart_callbacks_descriptions_set(obj, _elm_web_callback_names);
1112
1113    _theme_hook(obj);
1114
1115 #else
1116    wd->label = elm_label_add(obj);
1117    elm_object_text_set(wd->label, "WebKit not supported!");
1118    evas_object_show(wd->label);
1119    elm_widget_resize_object_set(obj, wd->label);
1120 #endif
1121
1122    return obj;
1123 }
1124
1125 EAPI Evas_Object *
1126 elm_web_webkit_view_get(const Evas_Object *obj)
1127 {
1128    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1129 #ifdef HAVE_ELEMENTARY_WEB
1130    Widget_Data *wd = elm_widget_data_get(obj);
1131    if (!wd) return NULL;
1132    return wd->ewk_view;
1133 #else
1134    ERR("Elementary not compiled with EWebKit support.");
1135    return NULL;
1136 #endif
1137 }
1138
1139 EAPI void
1140 elm_web_window_create_hook_set(Evas_Object *obj, Elm_Web_Window_Open func, void *data)
1141 {
1142    ELM_CHECK_WIDTYPE(obj, widtype);
1143 #ifdef HAVE_ELEMENTARY_WEB
1144    Widget_Data *wd = elm_widget_data_get(obj);
1145    if (!wd) return;
1146    wd->hook.window_create = func;
1147    wd->hook.window_create_data = data;
1148 #else
1149    (void)func;
1150    (void)data;
1151 #endif
1152 }
1153
1154 EAPI void
1155 elm_web_dialog_alert_hook_set(Evas_Object *obj, Elm_Web_Dialog_Alert func, void *data)
1156 {
1157    ELM_CHECK_WIDTYPE(obj, widtype);
1158 #ifdef HAVE_ELEMENTARY_WEB
1159    Widget_Data *wd = elm_widget_data_get(obj);
1160    if (!wd) return;
1161    wd->hook.alert = func;
1162    wd->hook.alert_data = data;
1163 #else
1164    (void)func;
1165    (void)data;
1166 #endif
1167 }
1168
1169 EAPI void
1170 elm_web_dialog_confirm_hook_set(Evas_Object *obj, Elm_Web_Dialog_Confirm func, void *data)
1171 {
1172    ELM_CHECK_WIDTYPE(obj, widtype);
1173 #ifdef HAVE_ELEMENTARY_WEB
1174    Widget_Data *wd = elm_widget_data_get(obj);
1175    if (!wd) return;
1176    wd->hook.confirm = func;
1177    wd->hook.confirm_data = data;
1178 #else
1179    (void)func;
1180    (void)data;
1181 #endif
1182 }
1183
1184 EAPI void
1185 elm_web_dialog_prompt_hook_set(Evas_Object *obj, Elm_Web_Dialog_Prompt func, void *data)
1186 {
1187    ELM_CHECK_WIDTYPE(obj, widtype);
1188 #ifdef HAVE_ELEMENTARY_WEB
1189    Widget_Data *wd = elm_widget_data_get(obj);
1190    if (!wd) return;
1191    wd->hook.prompt = func;
1192    wd->hook.prompt_data = data;
1193 #else
1194    (void)func;
1195    (void)data;
1196 #endif
1197 }
1198
1199 EAPI void
1200 elm_web_dialog_file_selector_hook_set(Evas_Object *obj, Elm_Web_Dialog_File_Selector func, void *data)
1201 {
1202    ELM_CHECK_WIDTYPE(obj, widtype);
1203 #ifdef HAVE_ELEMENTARY_WEB
1204    Widget_Data *wd = elm_widget_data_get(obj);
1205    if (!wd) return;
1206    wd->hook.file_selector = func;
1207    wd->hook.file_selector_data = data;
1208 #else
1209    (void)func;
1210    (void)data;
1211 #endif
1212 }
1213
1214 EAPI void
1215 elm_web_console_message_hook_set(Evas_Object *obj, Elm_Web_Console_Message func, void *data)
1216 {
1217    ELM_CHECK_WIDTYPE(obj, widtype);
1218 #ifdef HAVE_ELEMENTARY_WEB
1219    Widget_Data *wd = elm_widget_data_get(obj);
1220    if (!wd) return;
1221    wd->hook.console_message = func;
1222    wd->hook.console_message_data = data;
1223 #else
1224    (void)func;
1225    (void)data;
1226 #endif
1227 }
1228
1229 EAPI void
1230 elm_web_useragent_set(Evas_Object *obj, const char *user_agent)
1231 {
1232    ELM_CHECK_WIDTYPE(obj, widtype);
1233 #ifdef HAVE_ELEMENTARY_WEB
1234    Widget_Data *wd = elm_widget_data_get(obj);
1235    if (!wd) return;
1236    ewk_view_setting_user_agent_set(wd->ewk_view, user_agent);
1237 #else
1238    (void)user_agent;
1239 #endif
1240 }
1241
1242 EAPI const char*
1243 elm_web_useragent_get(const Evas_Object *obj)
1244 {
1245    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1246 #ifdef HAVE_ELEMENTARY_WEB
1247    Widget_Data *wd = elm_widget_data_get(obj);
1248    if (!wd) return NULL;
1249    return ewk_view_setting_user_agent_get(wd->ewk_view);
1250 #else
1251    return NULL;
1252 #endif
1253 }
1254
1255 EAPI Eina_Bool
1256 elm_web_tab_propagate_get(const Evas_Object *obj)
1257 {
1258    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1259 #ifdef HAVE_ELEMENTARY_WEB
1260    Widget_Data *wd = elm_widget_data_get(obj);
1261    if (!wd) return EINA_FALSE;
1262    return wd->tab_propagate;
1263 #else
1264    return EINA_FALSE;
1265 #endif
1266 }
1267
1268 EAPI void
1269 elm_web_tab_propagate_set(Evas_Object *obj, Eina_Bool propagate)
1270 {
1271    ELM_CHECK_WIDTYPE(obj, widtype);
1272 #ifdef HAVE_ELEMENTARY_WEB
1273    Widget_Data *wd = elm_widget_data_get(obj);
1274    if (!wd) return;
1275    wd->tab_propagate = propagate;
1276 #else
1277    (void)propagate;
1278 #endif
1279 }
1280
1281 EAPI Eina_Bool
1282 elm_web_uri_set(Evas_Object *obj, const char *uri)
1283 {
1284    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1285 #ifdef HAVE_ELEMENTARY_WEB
1286    Widget_Data *wd = elm_widget_data_get(obj);
1287    if (!wd) return EINA_FALSE;
1288    return ewk_view_uri_set(wd->ewk_view, uri);
1289 #else
1290    (void)uri;
1291    return EINA_FALSE;
1292 #endif
1293 }
1294
1295 EAPI const char *
1296 elm_web_uri_get(const Evas_Object *obj)
1297 {
1298    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1299 #ifdef HAVE_ELEMENTARY_WEB
1300    Widget_Data *wd = elm_widget_data_get(obj);
1301    if (!wd) return NULL;
1302    return ewk_view_uri_get(wd->ewk_view);
1303 #else
1304    return NULL;
1305 #endif
1306 }
1307
1308 EAPI const char *
1309 elm_web_title_get(const Evas_Object *obj)
1310 {
1311    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1312 #ifdef HAVE_ELEMENTARY_WEB
1313    Widget_Data *wd = elm_widget_data_get(obj);
1314    if (!wd) return NULL;
1315    return ewk_view_title_get(wd->ewk_view);
1316 #else
1317    return NULL;
1318 #endif
1319 }
1320
1321 EAPI void
1322 elm_web_bg_color_set(Evas_Object *obj, int r, int g, int b, int a)
1323 {
1324    ELM_CHECK_WIDTYPE(obj, widtype);
1325 #ifdef HAVE_ELEMENTARY_WEB
1326    Widget_Data *wd = elm_widget_data_get(obj);
1327    if (!wd) return;
1328    ewk_view_bg_color_set(wd->ewk_view, r, g, b, a);
1329 #else
1330    (void)r;
1331    (void)g;
1332    (void)b;
1333    (void)a;
1334 #endif
1335 }
1336
1337 EAPI void
1338 elm_web_bg_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
1339 {
1340    if (r) *r = 0;
1341    if (g) *g = 0;
1342    if (b) *b = 0;
1343    if (a) *a = 0;
1344    ELM_CHECK_WIDTYPE(obj, widtype);
1345 #ifdef HAVE_ELEMENTARY_WEB
1346    Widget_Data *wd = elm_widget_data_get(obj);
1347    if (!wd) return;
1348    return ewk_view_bg_color_get(wd->ewk_view, r, g, b, a);
1349 #endif
1350 }
1351
1352 EAPI char *
1353 elm_web_selection_get(const Evas_Object *obj)
1354 {
1355    ELM_CHECK_WIDTYPE(obj, widtype) NULL;
1356 #ifdef HAVE_ELEMENTARY_WEB
1357    Widget_Data *wd = elm_widget_data_get(obj);
1358    if (!wd) return NULL;
1359    return ewk_view_selection_get(wd->ewk_view);
1360 #else
1361    return NULL;
1362 #endif
1363 }
1364
1365 EAPI void
1366 elm_web_popup_selected_set(Evas_Object *obj, int idx)
1367 {
1368    ELM_CHECK_WIDTYPE(obj, widtype);
1369 #ifdef HAVE_ELEMENTARY_WEB
1370    Widget_Data *wd = elm_widget_data_get(obj);
1371    ewk_view_popup_selected_set(wd->ewk_view, idx);
1372 #else
1373    (void)idx;
1374 #endif
1375 }
1376
1377 EAPI Eina_Bool
1378 elm_web_popup_destroy(Evas_Object *obj)
1379 {
1380    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1381 #ifdef HAVE_ELEMENTARY_WEB
1382    Widget_Data *wd = elm_widget_data_get(obj);
1383    return ewk_view_popup_destroy(wd->ewk_view);
1384 #else
1385    return EINA_FALSE;
1386 #endif
1387 }
1388
1389 EAPI Eina_Bool
1390 elm_web_text_search(const Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool forward, Eina_Bool wrap)
1391 {
1392    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1393 #ifdef HAVE_ELEMENTARY_WEB
1394    Widget_Data *wd = elm_widget_data_get(obj);
1395    if (!wd) return EINA_FALSE;
1396    return ewk_view_text_search
1397      (wd->ewk_view, string, case_sensitive, forward, wrap);
1398 #else
1399    (void)string;
1400    (void)case_sensitive;
1401    (void)forward;
1402    (void)wrap;
1403    return EINA_FALSE;
1404 #endif
1405 }
1406
1407 EAPI unsigned int
1408 elm_web_text_matches_mark(Evas_Object *obj, const char *string, Eina_Bool case_sensitive, Eina_Bool highlight, unsigned int limit)
1409 {
1410    ELM_CHECK_WIDTYPE(obj, widtype) 0;
1411 #ifdef HAVE_ELEMENTARY_WEB
1412    Widget_Data *wd = elm_widget_data_get(obj);
1413    if (!wd) return 0;
1414    return ewk_view_text_matches_mark
1415      (wd->ewk_view, string, case_sensitive, highlight, limit);
1416 #else
1417    (void)string;
1418    (void)case_sensitive;
1419    (void)highlight;
1420    (void)limit;
1421    return 0;
1422 #endif
1423 }
1424
1425 EAPI Eina_Bool
1426 elm_web_text_matches_unmark_all(Evas_Object *obj)
1427 {
1428    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1429 #ifdef HAVE_ELEMENTARY_WEB
1430    Widget_Data *wd = elm_widget_data_get(obj);
1431    if (!wd) return EINA_FALSE;
1432    return ewk_view_text_matches_unmark_all(wd->ewk_view);
1433 #else
1434    return EINA_FALSE;
1435 #endif
1436 }
1437
1438 EAPI Eina_Bool
1439 elm_web_text_matches_highlight_set(Evas_Object *obj, Eina_Bool highlight)
1440 {
1441    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1442 #ifdef HAVE_ELEMENTARY_WEB
1443    Widget_Data *wd = elm_widget_data_get(obj);
1444    if (!wd) return EINA_FALSE;
1445    return ewk_view_text_matches_highlight_set(wd->ewk_view, highlight);
1446 #else
1447    (void)highlight;
1448    return EINA_FALSE;
1449 #endif
1450 }
1451
1452 EAPI Eina_Bool
1453 elm_web_text_matches_highlight_get(const Evas_Object *obj)
1454 {
1455    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1456 #ifdef HAVE_ELEMENTARY_WEB
1457    Widget_Data *wd = elm_widget_data_get(obj);
1458    if (!wd) return EINA_FALSE;
1459    return ewk_view_text_matches_highlight_get(wd->ewk_view);
1460 #else
1461    return EINA_FALSE;
1462 #endif
1463 }
1464
1465 EAPI double
1466 elm_web_load_progress_get(const Evas_Object *obj)
1467 {
1468    ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
1469 #ifdef HAVE_ELEMENTARY_WEB
1470    Widget_Data *wd = elm_widget_data_get(obj);
1471    if (!wd) return -1.0;
1472    return ewk_view_load_progress_get(wd->ewk_view);
1473 #else
1474    return EINA_FALSE;
1475 #endif
1476 }
1477
1478 EAPI Eina_Bool
1479 elm_web_stop(Evas_Object *obj)
1480 {
1481    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1482 #ifdef HAVE_ELEMENTARY_WEB
1483    Widget_Data *wd = elm_widget_data_get(obj);
1484    if (!wd) return EINA_FALSE;
1485    return ewk_view_stop(wd->ewk_view);
1486 #else
1487    return EINA_FALSE;
1488 #endif
1489 }
1490
1491 EAPI Eina_Bool
1492 elm_web_reload(Evas_Object *obj)
1493 {
1494    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1495 #ifdef HAVE_ELEMENTARY_WEB
1496    Widget_Data *wd = elm_widget_data_get(obj);
1497    if (!wd) return EINA_FALSE;
1498    return ewk_view_reload(wd->ewk_view);
1499 #else
1500    return EINA_FALSE;
1501 #endif
1502 }
1503
1504 EAPI Eina_Bool
1505 elm_web_reload_full(Evas_Object *obj)
1506 {
1507    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1508 #ifdef HAVE_ELEMENTARY_WEB
1509    Widget_Data *wd = elm_widget_data_get(obj);
1510    if (!wd) return EINA_FALSE;
1511    return ewk_view_reload_full(wd->ewk_view);
1512 #else
1513    return EINA_FALSE;
1514 #endif
1515 }
1516
1517
1518 EAPI Eina_Bool
1519 elm_web_back(Evas_Object *obj)
1520 {
1521    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1522 #ifdef HAVE_ELEMENTARY_WEB
1523    Widget_Data *wd = elm_widget_data_get(obj);
1524    if (!wd) return EINA_FALSE;
1525    return ewk_view_back(wd->ewk_view);
1526 #else
1527    return EINA_FALSE;
1528 #endif
1529 }
1530
1531 EAPI Eina_Bool
1532 elm_web_forward(Evas_Object *obj)
1533 {
1534    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1535 #ifdef HAVE_ELEMENTARY_WEB
1536    Widget_Data *wd = elm_widget_data_get(obj);
1537    if (!wd) return EINA_FALSE;
1538    return ewk_view_forward(wd->ewk_view);
1539 #else
1540    return EINA_FALSE;
1541 #endif
1542 }
1543
1544 EAPI Eina_Bool
1545 elm_web_navigate(Evas_Object *obj, int steps)
1546 {
1547    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1548 #ifdef HAVE_ELEMENTARY_WEB
1549    Widget_Data *wd = elm_widget_data_get(obj);
1550    if (!wd) return EINA_FALSE;
1551    return ewk_view_navigate(wd->ewk_view, steps);
1552 #else
1553    return EINA_FALSE;
1554    (void)steps;
1555 #endif
1556 }
1557
1558 EINA_DEPRECATED EAPI Eina_Bool
1559 elm_web_back_possible(Evas_Object *obj)
1560 {
1561    return elm_web_back_possible_get(obj);
1562 }
1563
1564 EAPI Eina_Bool
1565 elm_web_back_possible_get(Evas_Object *obj)
1566 {
1567    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1568 #ifdef HAVE_ELEMENTARY_WEB
1569    Widget_Data *wd = elm_widget_data_get(obj);
1570    if (!wd) return EINA_FALSE;
1571    return ewk_view_back_possible(wd->ewk_view);
1572 #else
1573    return EINA_FALSE;
1574 #endif
1575 }
1576
1577 EAPI Eina_Bool
1578 elm_web_forward_possible_get(Evas_Object *obj)
1579 {
1580    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1581 #ifdef HAVE_ELEMENTARY_WEB
1582    Widget_Data *wd = elm_widget_data_get(obj);
1583    if (!wd) return EINA_FALSE;
1584    return ewk_view_forward_possible(wd->ewk_view);
1585 #else
1586    return EINA_FALSE;
1587 #endif
1588 }
1589
1590 EAPI Eina_Bool
1591 elm_web_navigate_possible_get(Evas_Object *obj, int steps)
1592 {
1593    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1594 #ifdef HAVE_ELEMENTARY_WEB
1595    Widget_Data *wd = elm_widget_data_get(obj);
1596    if (!wd) return EINA_FALSE;
1597    return ewk_view_navigate_possible(wd->ewk_view, steps);
1598 #else
1599    return EINA_FALSE;
1600    (void)steps;
1601 #endif
1602 }
1603
1604 EAPI Eina_Bool
1605 elm_web_history_enabled_get(const Evas_Object *obj)
1606 {
1607    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1608 #ifdef HAVE_ELEMENTARY_WEB
1609    Widget_Data *wd = elm_widget_data_get(obj);
1610    if (!wd) return EINA_FALSE;
1611    return ewk_view_history_enable_get(wd->ewk_view);
1612 #else
1613    return EINA_FALSE;
1614 #endif
1615 }
1616
1617 EAPI void
1618 elm_web_history_enabled_set(Evas_Object *obj, Eina_Bool enable)
1619 {
1620    ELM_CHECK_WIDTYPE(obj, widtype);
1621 #ifdef HAVE_ELEMENTARY_WEB
1622    Widget_Data *wd = elm_widget_data_get(obj);
1623    if (!wd) return;
1624    ewk_view_history_enable_set(wd->ewk_view, enable);
1625 #else
1626    (void)enable;
1627 #endif
1628 }
1629
1630 //EAPI Ewk_History *ewk_view_history_get(const Evas_Object *obj); // TODO:
1631
1632 EAPI void
1633 elm_web_zoom_set(Evas_Object *obj, double zoom)
1634 {
1635    ELM_CHECK_WIDTYPE(obj, widtype);
1636 #ifdef HAVE_ELEMENTARY_WEB
1637    Widget_Data *wd = elm_widget_data_get(obj);
1638    int vw, vh, cx, cy;
1639    float z = 1.0;
1640    evas_object_geometry_get(wd->ewk_view, NULL, NULL, &vw, &vh);
1641    cx = vw / 2;
1642    cy = vh / 2;
1643    if (zoom > wd->zoom.max)
1644      zoom = wd->zoom.max;
1645    else if (zoom < wd->zoom.min)
1646      zoom = wd->zoom.min;
1647    if (zoom == wd->zoom.current) return;
1648    wd->zoom.current = zoom;
1649    if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_MANUAL)
1650      z = zoom;
1651    else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FIT)
1652      {
1653         Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1654         Evas_Coord fw, fh, pw, ph;
1655         if (!ewk_frame_contents_size_get(frame, &fw, &fh))
1656           return;
1657         z = ewk_frame_page_zoom_get(frame);
1658         fw /= z;
1659         fh /= z;
1660         if ((fw > 0) && (fh > 0))
1661           {
1662              ph = (fh * vw) / fw;
1663              if (ph > vh)
1664                {
1665                   pw = (fw * vh) / fh;
1666                   ph = vh;
1667                }
1668              else
1669                pw = vw;
1670              if (fw > fh)
1671                z = (float)pw / fw;
1672              else
1673                z = (float)ph / fh;
1674           }
1675      }
1676    else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FILL)
1677      {
1678         Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1679         Evas_Coord fw, fh, pw, ph;
1680         if (!ewk_frame_contents_size_get(frame, &fw, &fh))
1681           return;
1682         z = ewk_frame_page_zoom_get(frame);
1683         fw /= z;
1684         fh /= z;
1685         if ((fw > 0) && (fh > 0))
1686           {
1687              ph = (fh * vw) / fw;
1688              if (ph < vh)
1689                {
1690                   pw = (fw * vh) / fh;
1691                   ph = vh;
1692                }
1693              else
1694                pw = vw;
1695              if (fw > fh)
1696                z = (float)pw / fw;
1697              else
1698                z = (float)ph / fh;
1699           }
1700      }
1701    if (wd->zoom.no_anim)
1702      ewk_view_zoom_set(wd->ewk_view, z, cx, cy);
1703    else
1704      ewk_view_zoom_animated_set(wd->ewk_view, z, _elm_config->zoom_friction,
1705                                 cx, cy);
1706    wd->zoom.no_anim = EINA_FALSE;
1707 #else
1708    (void)zoom;
1709 #endif
1710 }
1711
1712 EAPI double
1713 elm_web_zoom_get(const Evas_Object *obj)
1714 {
1715    ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
1716 #ifdef HAVE_ELEMENTARY_WEB
1717    Widget_Data *wd = elm_widget_data_get(obj);
1718    return wd->zoom.current;
1719 #else
1720    return -1.0;
1721 #endif
1722 }
1723
1724 EAPI void
1725 elm_web_zoom_mode_set(Evas_Object *obj, Elm_Web_Zoom_Mode mode)
1726 {
1727    ELM_CHECK_WIDTYPE(obj, widtype);
1728 #ifdef HAVE_ELEMENTARY_WEB
1729    Widget_Data *wd = elm_widget_data_get(obj);
1730    float tz;
1731    if (mode >= ELM_WEB_ZOOM_MODE_LAST)
1732      return;
1733    if (mode == wd->zoom.mode)
1734      return;
1735    wd->zoom.mode = mode;
1736    tz = wd->zoom.current;
1737    wd->zoom.current = 0.0;
1738    elm_web_zoom_set(obj, tz);
1739 #else
1740    (void)mode;
1741 #endif
1742 }
1743
1744 EAPI Elm_Web_Zoom_Mode
1745 elm_web_zoom_mode_get(const Evas_Object *obj)
1746 {
1747    ELM_CHECK_WIDTYPE(obj, widtype) ELM_WEB_ZOOM_MODE_LAST;
1748 #ifdef HAVE_ELEMENTARY_WEB
1749    Widget_Data *wd = elm_widget_data_get(obj);
1750    return wd->zoom.mode;
1751 #else
1752    return ELM_WEB_ZOOM_MODE_LAST;
1753 #endif
1754 }
1755
1756 EAPI void
1757 elm_web_region_show(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
1758 {
1759    ELM_CHECK_WIDTYPE(obj, widtype);
1760 #ifdef HAVE_ELEMENTARY_WEB
1761    Widget_Data *wd = elm_widget_data_get(obj);
1762    Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1763    int fw, fh, zw, zh, rx, ry;
1764    float zoom;
1765    ewk_frame_contents_size_get(frame, &fw, &fh);
1766    zoom = ewk_frame_page_zoom_get(frame);
1767    zw = fw / zoom;
1768    zh = fh / zoom;
1769    rx = (x * fw) / zw;
1770    ry = (y * fh) / zh;
1771    if (wd->bring_in.animator)
1772      {
1773         ecore_animator_del(wd->bring_in.animator);
1774         wd->bring_in.animator = NULL;
1775      }
1776    ewk_frame_scroll_set(frame, rx, ry);
1777 #else
1778    (void)x;
1779    (void)y;
1780 #endif
1781 }
1782
1783 EAPI void
1784 elm_web_region_bring_in(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
1785 {
1786    ELM_CHECK_WIDTYPE(obj, widtype);
1787 #ifdef HAVE_ELEMENTARY_WEB
1788    Widget_Data *wd = elm_widget_data_get(obj);
1789    Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
1790    int fw, fh, zw, zh, rx, ry, sx, sy;
1791    float zoom;
1792    ewk_frame_contents_size_get(frame, &fw, &fh);
1793    ewk_frame_scroll_pos_get(frame, &sx, &sy);
1794    zoom = ewk_frame_page_zoom_get(frame);
1795    zw = fw / zoom;
1796    zh = fh / zoom;
1797    rx = (x * fw) / zw;
1798    ry = (y * fh) / zh;
1799    if ((wd->bring_in.end.x == rx) && (wd->bring_in.end.y == ry))
1800      return;
1801    wd->bring_in.start.x = sx;
1802    wd->bring_in.start.y = sy;
1803    wd->bring_in.end.x = rx;
1804    wd->bring_in.end.y = ry;
1805    if (wd->bring_in.animator)
1806      ecore_animator_del(wd->bring_in.animator);
1807    wd->bring_in.animator = ecore_animator_timeline_add(
1808       _elm_config->bring_in_scroll_friction, _bring_in_anim_cb, wd);
1809 #else
1810    (void)x;
1811    (void)y;
1812 #endif
1813 }
1814
1815 EAPI void
1816 elm_web_inwin_mode_set(Evas_Object *obj, Eina_Bool value)
1817 {
1818    ELM_CHECK_WIDTYPE(obj, widtype);
1819 #ifdef HAVE_ELEMENTARY_WEB
1820    Widget_Data *wd = elm_widget_data_get(obj);
1821
1822    wd->inwin_mode = value;
1823 #else
1824    (void)value;
1825 #endif
1826 }
1827
1828 EAPI Eina_Bool
1829 elm_web_inwin_mode_get(const Evas_Object *obj)
1830 {
1831    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
1832 #ifdef HAVE_ELEMENTARY_WEB
1833    Widget_Data *wd = elm_widget_data_get(obj);
1834
1835    return wd->inwin_mode;
1836 #else
1837    return EINA_FALSE;
1838 #endif
1839 }
1840
1841 EAPI void
1842 elm_web_window_features_ref(Elm_Web_Window_Features *wf)
1843 {
1844 #ifdef HAVE_ELEMENTARY_WEB
1845    ewk_window_features_ref((Ewk_Window_Features *)wf);
1846 #else
1847    (void)wf;
1848 #endif
1849 }
1850
1851 EAPI void
1852 elm_web_window_features_unref(Elm_Web_Window_Features *wf)
1853 {
1854 #ifdef HAVE_ELEMENTARY_WEB
1855    ewk_window_features_unref((Ewk_Window_Features *)wf);
1856 #else
1857    (void)wf;
1858 #endif
1859 }
1860
1861 EAPI Eina_Bool
1862 elm_web_window_features_property_get(const Elm_Web_Window_Features *wf, Elm_Web_Window_Feature_Flag flag)
1863 {
1864 #ifdef HAVE_ELEMENTARY_WEB
1865    Eina_Bool toolbar_visible, statusbar_visible;
1866    Eina_Bool scrollbars_visible, menubar_visible;
1867    Eina_Bool locationbar_visible, fullscreen;
1868
1869    ewk_window_features_bool_property_get((const Ewk_Window_Features *)wf,
1870                                          &toolbar_visible, &statusbar_visible,
1871                                          &scrollbars_visible, &menubar_visible,
1872                                          &locationbar_visible, &fullscreen);
1873
1874    //TODO : Improve ewk API usage to get one value.
1875    //
1876    switch(flag)
1877      {
1878         case ELM_WEB_WINDOW_FEATURE_TOOLBAR:
1879             return toolbar_visible;
1880             break;
1881         case ELM_WEB_WINDOW_FEATURE_STATUSBAR:
1882             return statusbar_visible;
1883             break;
1884         case ELM_WEB_WINDOW_FEATURE_SCROLLBARS:
1885             return scrollbars_visible;
1886             break;
1887         case ELM_WEB_WINDOW_FEATURE_MENUBAR:
1888             return menubar_visible;
1889             break;
1890         case ELM_WEB_WINDOW_FEATURE_LOCATIONBAR:
1891             return locationbar_visible;
1892             break;
1893         case ELM_WEB_WINDOW_FEATURE_FULLSCREEN:
1894             return fullscreen;
1895             break;
1896      }
1897 #else
1898
1899    if (!wf) return EINA_FALSE;
1900    if (flag==ELM_WEB_WINDOW_FEATURE_TOOLBAR)
1901      {
1902         //TODO Handle unused variable warnings when
1903         //ewk is not installed.
1904      }
1905
1906    /* What to do with these ?
1907
1908    (void)wf;
1909    (void)toolbar_visible;
1910    (void)statusbar_visible;
1911    (void)scrollbars_visible;
1912    (void)menubar_visible;
1913    (void)locationbar_visible;
1914    (void)fullscreen;
1915
1916    */
1917
1918 #endif
1919    return EINA_FALSE;
1920 }
1921
1922 EAPI void
1923 elm_web_window_features_region_get(const Elm_Web_Window_Features *wf, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
1924 {
1925 #ifdef HAVE_ELEMENTARY_WEB
1926    ewk_window_features_int_property_get((const Ewk_Window_Features *)wf,
1927                                         x, y, w, h);
1928 #else
1929
1930    if (!wf || !x || !y || !w || !h) return;
1931    /* What to do with these ?
1932
1933    (void)wf;
1934    (void)x;
1935    (void)y;
1936    (void)w;
1937    (void)h;
1938
1939    */
1940
1941 #endif
1942 }
1943
1944 // TODO: use all ewk_view_zoom stuff to implement bring-in and animated zoom like elm_photocam. Should be simple to use, must not expose every single bit to users!