Fix conflicts: Map, Hover, Hoversel, Menu, Web
[framework/uifw/elementary.git] / src / lib / elm_web.c
index 3f0c2aa..1c84db9 100644 (file)
@@ -49,6 +49,19 @@ struct _Widget_Data
       void *console_message_data;
    } hook;
    Elm_Win_Keyboard_Mode input_method;
+   struct {
+        Elm_Web_Zoom_Mode mode;
+        float current;
+        float min, max;
+        Eina_Bool no_anim;
+        Ecore_Timer *timer;
+   } zoom;
+   struct {
+        struct {
+             int x, y;
+        } start, end;
+        Ecore_Animator *animator;
+   } bring_in;
    Eina_Bool tab_propagate : 1;
    Eina_Bool inwin_mode : 1;
 #else
@@ -125,29 +138,47 @@ static const Evas_Smart_Cb_Description _elm_web_callback_names[] = {
    { NULL, NULL }
 };
 
-static void
-_theme_hook(Evas_Object *obj)
-{
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Theme *theme = elm_object_theme_get(obj);
-   Widget_Data *wd = elm_widget_data_get(obj);
-   const Eina_List *themes, *l;
+static char *
+_webkit_theme_find(const Eina_List *list)
+{
+   const Eina_List *l;
    const char *th;
-   char *view_theme = NULL;
 
-   themes = elm_theme_list_get(theme);
-   EINA_LIST_FOREACH(themes, l, th)
+   EINA_LIST_FOREACH(list, l, th)
      {
         char *path = elm_theme_list_item_path_get(th, NULL);
         if (!path) continue;
         if (edje_file_group_exists(path, "webkit/base"))
-          {
-             view_theme = path;
-             break;
-          }
+          return path;
         free(path);
      }
 
+   return NULL;
+}
+#endif
+
+static void
+_theme_hook(Evas_Object *obj)
+{
+#ifdef HAVE_ELEMENTARY_WEB
+   Elm_Theme *theme = elm_object_theme_get(obj);
+   Widget_Data *wd = elm_widget_data_get(obj);
+   const Eina_List *themes;
+   char *view_theme = NULL;
+
+   themes = elm_theme_overlay_list_get(theme);
+   view_theme = _webkit_theme_find(themes);
+   if (view_theme) goto set;
+
+   themes = elm_theme_list_get(theme);
+   view_theme = _webkit_theme_find(themes);
+   if (view_theme) goto set;
+
+   themes = elm_theme_extension_list_get(theme);
+   view_theme = _webkit_theme_find(themes);
+
+set:
    if (view_theme)
      {
         ewk_view_theme_set(wd->ewk_view, view_theme);
@@ -285,7 +316,7 @@ _view_smart_mouse_down(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Down *ev
      return _parent_sc.mouse_down(esd, event);
 
    sd->mouse.pan_anim = ecore_animator_add(_view_pan_animator, sd);
-   sd->mouse.longpress_timer = ecore_timer_add(1.0, _view_longpress_timer, sd);
+   sd->mouse.longpress_timer = ecore_timer_add(_elm_config->longpress_timeout, _view_longpress_timer, sd);
    sd->mouse.move_count = 1;
    sd->mouse.x = event->canvas.x;
    sd->mouse.y = event->canvas.y;
@@ -442,7 +473,7 @@ _dialog_new(Evas_Object *parent)
 }
 
 static Evas_Object *
-_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__, const char *accept_types __UNUSED__, Eina_List **selected_filenames, Eina_Bool *response)
+_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)
 {
    EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!default_entry_value), EINA_FALSE);
    EINA_SAFETY_ON_TRUE_RETURN_VAL((type != DIALOG_PROMPT) && (!!entry_value), EINA_FALSE);
@@ -625,7 +656,7 @@ _view_smart_run_javascript_prompt(Ewk_View_Smart_Data *esd, Evas_Object *frame _
 }
 
 static Eina_Bool
-_view_smart_run_open_panel(Ewk_View_Smart_Data *esd, Evas_Object *frame __UNUSED__, Eina_Bool allows_multiple_files, const char *accept_types, Eina_List **selected_filenames)
+_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)
 {
    View_Smart_Data *sd = (View_Smart_Data *)esd;
    Evas_Object *view = sd->base.self;
@@ -767,6 +798,66 @@ _ewk_view_load_started_cb(void *data, Evas_Object *obj, void *event_info __UNUSE
 }
 
 static void
+_ewk_view_load_finished_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info)
+{
+   Widget_Data *wd = data;
+
+   if (event_info)
+     return;
+
+   if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
+     {
+        float tz = wd->zoom.current;
+        wd->zoom.current = 0.0;
+        elm_web_zoom_set(wd->self, tz);
+     }
+}
+
+static void
+_ewk_view_viewport_changed_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__)
+{
+   Widget_Data *wd = data;
+
+   if (wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL)
+     {
+        ewk_view_zoom_set(obj, 1.0, 0, 0);
+        wd->zoom.no_anim = EINA_TRUE;
+     }
+}
+
+static Eina_Bool
+_restore_zoom_mode_timer_cb(void *data)
+{
+   Widget_Data *wd = data;
+   float tz = wd->zoom.current;
+   wd->zoom.timer = NULL;
+   wd->zoom.current = 0.0;
+   wd->zoom.no_anim = EINA_TRUE;
+   elm_web_zoom_set(wd->self, tz);
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_reset_zoom_timer_cb(void *data)
+{
+   Widget_Data *wd = data;
+   wd->zoom.timer = ecore_timer_add(0.0, _restore_zoom_mode_timer_cb, wd);
+   ewk_view_zoom_set(wd->ewk_view, 1.0, 0, 0);
+   return EINA_FALSE;
+}
+
+static void
+_ewk_view_resized_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
+{
+   Widget_Data *wd = data;
+   if (!(wd->zoom.mode != ELM_WEB_ZOOM_MODE_MANUAL))
+     return;
+   if (wd->zoom.timer)
+     ecore_timer_del(wd->zoom.timer);
+   wd->zoom.timer = ecore_timer_add(0.5, _reset_zoom_timer_cb, wd);
+}
+
+static void
 _popup_del_job(void *data)
 {
    evas_object_del(data);
@@ -783,14 +874,14 @@ static void
 _popup_item_selected(void *data, Evas_Object *obj, void *event_info __UNUSED__)
 {
    Evas_Object *view = data;
-   Elm_List_Item *it = elm_list_selected_item_get(obj);
+   Elm_Object_Item *list_it = elm_list_selected_item_get(obj);
    const Eina_List *itr, *list = elm_list_items_get(obj);
    void *d;
    int i = 0;
 
    EINA_LIST_FOREACH(list, itr, d)
    {
-      if (d == it)
+      if (d == list_it)
          break;
 
       i++;
@@ -827,16 +918,16 @@ _ewk_view_popup_create_cb(void *data, Evas_Object *obj, void *event_info)
      return;
 
    notify = elm_notify_add(obj);
-   elm_notify_repeat_events_set(notify, EINA_FALSE);
+   elm_notify_allow_events_set(notify, EINA_FALSE);
    elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM);
 
    list = elm_list_add(obj);
-   elm_list_always_select_mode_set(list, EINA_TRUE);
+   elm_list_select_mode_set(data, ELM_OBJECT_SELECT_MODE_ALWAYS);
    elm_list_bounce_set(list, EINA_FALSE, EINA_FALSE);
    elm_list_mode_set(list, ELM_LIST_EXPAND);
    evas_object_size_hint_weight_set(list, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(list, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   elm_notify_content_set(notify, list);
+   elm_object_content_set(notify, list);
    evas_object_show(list);
 
    EINA_LIST_FOREACH(m->items, itr, it)
@@ -902,6 +993,30 @@ _view_smart_callback_proxy(Evas_Object *view, Evas_Object *parent)
                                        _view_smart_callback_proxy_cb, ctxt);
      }
 }
+
+static Eina_Bool
+_bring_in_anim_cb(void *data, double pos)
+{
+   Widget_Data *wd = data;
+   Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+   int sx, sy, rx, ry;
+
+   sx = wd->bring_in.start.x;
+   sy = wd->bring_in.start.y;
+   rx = (wd->bring_in.end.x - sx) * pos;
+   ry = (wd->bring_in.end.y - sy) * pos;
+
+   ewk_frame_scroll_set(frame, rx + sx, ry + sy);
+
+   if (pos == 1.0)
+     {
+        wd->bring_in.end.x = wd->bring_in.end.y = wd->bring_in.start.x =
+           wd->bring_in.start.y = 0;
+        wd->bring_in.animator = NULL;
+     }
+
+   return EINA_TRUE;
+}
 #endif
 
 #ifdef HAVE_ELEMENTARY_WEB
@@ -972,11 +1087,20 @@ elm_web_add(Evas_Object *parent)
                                   _ewk_view_load_started_cb, wd);
    evas_object_smart_callback_add(wd->ewk_view, "popup,create",
                                   _ewk_view_popup_create_cb, wd);
+   evas_object_smart_callback_add(wd->ewk_view, "load,finished",
+                                  _ewk_view_load_finished_cb, wd);
+   evas_object_smart_callback_add(wd->ewk_view, "viewport,changed",
+                                  _ewk_view_viewport_changed_cb, wd);
+   evas_object_smart_callback_add(wd->ewk_view, "view,resized",
+                                  _ewk_view_resized_cb, wd);
 
    elm_widget_resize_object_set(obj, wd->ewk_view);
 
    wd->tab_propagate = EINA_FALSE;
    wd->inwin_mode = _elm_config->inwin_dialogs_enable;
+   wd->zoom.min = ewk_view_zoom_range_min_get(wd->ewk_view);
+   wd->zoom.max = ewk_view_zoom_range_max_get(wd->ewk_view);
+   wd->zoom.current = 1.0;
 
    _view_smart_callback_proxy(wd->ewk_view, wd->self);
    evas_object_smart_callbacks_descriptions_set(obj, _elm_web_callback_names);
@@ -1097,6 +1221,32 @@ elm_web_console_message_hook_set(Evas_Object *obj, Elm_Web_Console_Message func,
 #endif
 }
 
+EAPI void 
+elm_web_useragent_set(Evas_Object *obj, const char *user_agent)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+#ifdef HAVE_ELEMENTARY_WEB
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return;
+   ewk_view_setting_user_agent_set(wd->ewk_view, user_agent);
+#else
+   (void)user_agent;
+#endif
+}
+
+EAPI const char* 
+elm_web_useragent_get(const Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) NULL;
+#ifdef HAVE_ELEMENTARY_WEB
+   Widget_Data *wd = elm_widget_data_get(obj);
+   if (!wd) return NULL;
+   return ewk_view_setting_user_agent_get(wd->ewk_view);
+#else
+   return NULL;
+#endif
+}
+
 EAPI Eina_Bool
 elm_web_tab_propagate_get(const Evas_Object *obj)
 {
@@ -1208,14 +1358,14 @@ elm_web_selection_get(const Evas_Object *obj)
 }
 
 EAPI void
-elm_web_popup_selected_set(Evas_Object *obj, int index)
+elm_web_popup_selected_set(Evas_Object *obj, int idx)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
 #ifdef HAVE_ELEMENTARY_WEB
    Widget_Data *wd = elm_widget_data_get(obj);
-   ewk_view_popup_selected_set(wd->ewk_view, index);
+   ewk_view_popup_selected_set(wd->ewk_view, idx);
 #else
-   (void)index;
+   (void)idx;
 #endif
 }
 
@@ -1400,9 +1550,15 @@ elm_web_navigate(Evas_Object *obj, int steps)
 #endif
 }
 
-EAPI Eina_Bool
+EINA_DEPRECATED EAPI Eina_Bool
 elm_web_back_possible(Evas_Object *obj)
 {
+   return elm_web_back_possible_get(obj);
+}
+
+EAPI Eina_Bool
+elm_web_back_possible_get(Evas_Object *obj)
+{
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Widget_Data *wd = elm_widget_data_get(obj);
@@ -1413,9 +1569,15 @@ elm_web_back_possible(Evas_Object *obj)
 #endif
 }
 
-EAPI Eina_Bool
+EINA_DEPRECATED EAPI Eina_Bool
 elm_web_forward_possible(Evas_Object *obj)
 {
+   return elm_web_forward_possible_get(obj);
+}
+
+EAPI Eina_Bool
+elm_web_forward_possible_get(Evas_Object *obj)
+{
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Widget_Data *wd = elm_widget_data_get(obj);
@@ -1427,7 +1589,7 @@ elm_web_forward_possible(Evas_Object *obj)
 }
 
 EAPI Eina_Bool
-elm_web_navigate_possible(Evas_Object *obj, int steps)
+elm_web_navigate_possible_get(Evas_Object *obj, int steps)
 {
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
@@ -1440,9 +1602,15 @@ elm_web_navigate_possible(Evas_Object *obj, int steps)
 #endif
 }
 
-EAPI Eina_Bool
+EINA_DEPRECATED EAPI Eina_Bool
 elm_web_history_enable_get(const Evas_Object *obj)
 {
+   return elm_web_history_enabled_get(obj);
+}
+
+EAPI Eina_Bool
+elm_web_history_enabled_get(const Evas_Object *obj)
+{
    ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Widget_Data *wd = elm_widget_data_get(obj);
@@ -1453,9 +1621,15 @@ elm_web_history_enable_get(const Evas_Object *obj)
 #endif
 }
 
-EAPI void
+EINA_DEPRECATED EAPI void
 elm_web_history_enable_set(Evas_Object *obj, Eina_Bool enable)
 {
+   elm_web_history_enabled_set(obj, enable);
+}
+
+EAPI void
+elm_web_history_enabled_set(Evas_Object *obj, Eina_Bool enable)
+{
    ELM_CHECK_WIDTYPE(obj, widtype);
 #ifdef HAVE_ELEMENTARY_WEB
    Widget_Data *wd = elm_widget_data_get(obj);
@@ -1468,29 +1642,186 @@ elm_web_history_enable_set(Evas_Object *obj, Eina_Bool enable)
 
 //EAPI Ewk_History *ewk_view_history_get(const Evas_Object *obj); // TODO:
 
-EAPI Eina_Bool
-elm_web_zoom_text_only_get(const Evas_Object *obj)
+EAPI void
+elm_web_zoom_set(Evas_Object *obj, double zoom)
 {
-   ELM_CHECK_WIDTYPE(obj, widtype) EINA_FALSE;
+   ELM_CHECK_WIDTYPE(obj, widtype);
 #ifdef HAVE_ELEMENTARY_WEB
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return EINA_FALSE;
-   return ewk_view_zoom_text_only_get(wd->ewk_view);
+   int vw, vh, cx, cy;
+   float z = 1.0;
+   evas_object_geometry_get(wd->ewk_view, NULL, NULL, &vw, &vh);
+   cx = vw / 2;
+   cy = vh / 2;
+   if (zoom > wd->zoom.max)
+     zoom = wd->zoom.max;
+   else if (zoom < wd->zoom.min)
+     zoom = wd->zoom.min;
+   if (zoom == wd->zoom.current) return;
+   wd->zoom.current = zoom;
+   if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_MANUAL)
+     z = zoom;
+   else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FIT)
+     {
+        Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+        Evas_Coord fw, fh, pw, ph;
+        if (!ewk_frame_contents_size_get(frame, &fw, &fh))
+          return;
+        z = ewk_frame_page_zoom_get(frame);
+        fw /= z;
+        fh /= z;
+        if ((fw > 0) && (fh > 0))
+          {
+             ph = (fh * vw) / fw;
+             if (ph > vh)
+               {
+                  pw = (fw * vh) / fh;
+                  ph = vh;
+               }
+             else
+               pw = vw;
+             if (fw > fh)
+               z = (float)pw / fw;
+             else
+               z = (float)ph / fh;
+          }
+     }
+   else if (wd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FILL)
+     {
+        Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+        Evas_Coord fw, fh, pw, ph;
+        if (!ewk_frame_contents_size_get(frame, &fw, &fh))
+          return;
+        z = ewk_frame_page_zoom_get(frame);
+        fw /= z;
+        fh /= z;
+        if ((fw > 0) && (fh > 0))
+          {
+             ph = (fh * vw) / fw;
+             if (ph < vh)
+               {
+                  pw = (fw * vh) / fh;
+                  ph = vh;
+               }
+             else
+               pw = vw;
+             if (fw > fh)
+               z = (float)pw / fw;
+             else
+               z = (float)ph / fh;
+          }
+     }
+   if (wd->zoom.no_anim)
+     ewk_view_zoom_set(wd->ewk_view, z, cx, cy);
+   else
+     ewk_view_zoom_animated_set(wd->ewk_view, z, _elm_config->zoom_friction,
+                                cx, cy);
+   wd->zoom.no_anim = EINA_FALSE;
 #else
-   return EINA_FALSE;
+   (void)zoom;
+#endif
+}
+
+EAPI double
+elm_web_zoom_get(const Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) -1.0;
+#ifdef HAVE_ELEMENTARY_WEB
+   Widget_Data *wd = elm_widget_data_get(obj);
+   return wd->zoom.current;
+#else
+   return -1.0;
 #endif
 }
 
 EAPI void
-elm_web_zoom_text_only_set(Evas_Object *obj, Eina_Bool setting)
+elm_web_zoom_mode_set(Evas_Object *obj, Elm_Web_Zoom_Mode mode)
 {
    ELM_CHECK_WIDTYPE(obj, widtype);
 #ifdef HAVE_ELEMENTARY_WEB
    Widget_Data *wd = elm_widget_data_get(obj);
-   if (!wd) return;
-   ewk_view_zoom_text_only_set(wd->ewk_view, setting);
+   float tz;
+   if (mode >= ELM_WEB_ZOOM_MODE_LAST)
+     return;
+   if (mode == wd->zoom.mode)
+     return;
+   wd->zoom.mode = mode;
+   tz = wd->zoom.current;
+   wd->zoom.current = 0.0;
+   elm_web_zoom_set(obj, tz);
 #else
-   (void)setting;
+   (void)mode;
+#endif
+}
+
+EAPI Elm_Web_Zoom_Mode
+elm_web_zoom_mode_get(const Evas_Object *obj)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype) ELM_WEB_ZOOM_MODE_LAST;
+#ifdef HAVE_ELEMENTARY_WEB
+   Widget_Data *wd = elm_widget_data_get(obj);
+   return wd->zoom.mode;
+#else
+   return ELM_WEB_ZOOM_MODE_LAST;
+#endif
+}
+
+EAPI void
+elm_web_region_show(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+#ifdef HAVE_ELEMENTARY_WEB
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+   int fw, fh, zw, zh, rx, ry;
+   float zoom;
+   ewk_frame_contents_size_get(frame, &fw, &fh);
+   zoom = ewk_frame_page_zoom_get(frame);
+   zw = fw / zoom;
+   zh = fh / zoom;
+   rx = (x * fw) / zw;
+   ry = (y * fh) / zh;
+   if (wd->bring_in.animator)
+     {
+        ecore_animator_del(wd->bring_in.animator);
+        wd->bring_in.animator = NULL;
+     }
+   ewk_frame_scroll_set(frame, rx, ry);
+#else
+   (void)x;
+   (void)y;
+#endif
+}
+
+EAPI void
+elm_web_region_bring_in(Evas_Object *obj, int x, int y, int w __UNUSED__, int h __UNUSED__)
+{
+   ELM_CHECK_WIDTYPE(obj, widtype);
+#ifdef HAVE_ELEMENTARY_WEB
+   Widget_Data *wd = elm_widget_data_get(obj);
+   Evas_Object *frame = ewk_view_frame_main_get(wd->ewk_view);
+   int fw, fh, zw, zh, rx, ry, sx, sy;
+   float zoom;
+   ewk_frame_contents_size_get(frame, &fw, &fh);
+   ewk_frame_scroll_pos_get(frame, &sx, &sy);
+   zoom = ewk_frame_page_zoom_get(frame);
+   zw = fw / zoom;
+   zh = fh / zoom;
+   rx = (x * fw) / zw;
+   ry = (y * fh) / zh;
+   if ((wd->bring_in.end.x == rx) && (wd->bring_in.end.y == ry))
+     return;
+   wd->bring_in.start.x = sx;
+   wd->bring_in.start.y = sy;
+   wd->bring_in.end.x = rx;
+   wd->bring_in.end.y = ry;
+   if (wd->bring_in.animator)
+     ecore_animator_del(wd->bring_in.animator);
+   wd->bring_in.animator = ecore_animator_timeline_add(
+      _elm_config->bring_in_scroll_friction, _bring_in_anim_cb, wd);
+#else
+   (void)x;
+   (void)y;
 #endif
 }
 
@@ -1540,15 +1871,53 @@ elm_web_window_features_unref(Elm_Web_Window_Features *wf)
 #endif
 }
 
-EAPI void
-elm_web_window_features_bool_property_get(const Elm_Web_Window_Features *wf, Eina_Bool *toolbar_visible, Eina_Bool *statusbar_visible, Eina_Bool *scrollbars_visible, Eina_Bool *menubar_visible, Eina_Bool *locationbar_visible, Eina_Bool *fullscreen)
+EAPI Eina_Bool
+elm_web_window_features_property_get(const Elm_Web_Window_Features *wf, Elm_Web_Window_Feature_Flag flag)
 {
 #ifdef HAVE_ELEMENTARY_WEB
+   Eina_Bool toolbar_visible, statusbar_visible;
+   Eina_Bool scrollbars_visible, menubar_visible;
+   Eina_Bool locationbar_visible, fullscreen;
+
    ewk_window_features_bool_property_get((const Ewk_Window_Features *)wf,
-                                         toolbar_visible, statusbar_visible,
-                                         scrollbars_visible, menubar_visible,
-                                         locationbar_visible, fullscreen);
+                                         &toolbar_visible, &statusbar_visible,
+                                         &scrollbars_visible, &menubar_visible,
+                                         &locationbar_visible, &fullscreen);
+
+   //TODO : Improve ewk API usage to get one value.
+   //
+   switch(flag)
+     {
+        case ELM_WEB_WINDOW_FEATURE_TOOLBAR:
+            return toolbar_visible;
+            break;
+        case ELM_WEB_WINDOW_FEATURE_STATUSBAR:
+            return statusbar_visible;
+            break;
+        case ELM_WEB_WINDOW_FEATURE_SCROLLBARS:
+            return scrollbars_visible;
+            break;
+        case ELM_WEB_WINDOW_FEATURE_MENUBAR:
+            return menubar_visible;
+            break;
+        case ELM_WEB_WINDOW_FEATURE_LOCATIONBAR:
+            return locationbar_visible;
+            break;
+        case ELM_WEB_WINDOW_FEATURE_FULLSCREEN:
+            return fullscreen;
+            break;
+     }
 #else
+
+   if (!wf) return EINA_FALSE;
+   if (flag==ELM_WEB_WINDOW_FEATURE_TOOLBAR)
+     {
+        //TODO Handle unused variable warnings when
+        //ewk is not installed.
+     }
+
+   /* What to do with these ?
+    
    (void)wf;
    (void)toolbar_visible;
    (void)statusbar_visible;
@@ -1556,21 +1925,32 @@ elm_web_window_features_bool_property_get(const Elm_Web_Window_Features *wf, Ein
    (void)menubar_visible;
    (void)locationbar_visible;
    (void)fullscreen;
+
+   */
+
 #endif
+   return EINA_FALSE;
 }
 
 EAPI void
-elm_web_window_features_int_property_get(const Elm_Web_Window_Features *wf, int *x, int *y, int *w, int *h)
+elm_web_window_features_region_get(const Elm_Web_Window_Features *wf, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
 {
 #ifdef HAVE_ELEMENTARY_WEB
    ewk_window_features_int_property_get((const Ewk_Window_Features *)wf,
                                         x, y, w, h);
 #else
+
+   if (!wf || !x || !y || !w || !h) return;
+   /* What to do with these ?
+    
    (void)wf;
    (void)x;
    (void)y;
    (void)w;
    (void)h;
+
+   */
+
 #endif
 }