[els_webview]send mouse_down and mouse_up using smart callback's event value
[framework/uifw/elementary.git] / src / lib / els_webview.c
index 59864aa..8eec32d 100644 (file)
@@ -107,7 +107,7 @@ struct _Smart_Data {
      Eina_Bool (*ewk_view_zoom_cairo_scaling_get)(const Evas_Object *);
      Eina_Bool (*ewk_view_zoom_cairo_scaling_set)(Evas_Object *, Eina_Bool);
      void (*ewk_view_viewport_get)(Evas_Object *, int *, int *, float *, float *, float *, Eina_Bool *);
-     void (*ewk_view_zoom_range_set)(Evas_Object *, float, float);
+     Eina_Bool (*ewk_view_zoom_range_set)(Evas_Object *, float, float);
      void (*ewk_view_user_scalable_set)(Evas_Object *, Eina_Bool);
      Eina_Bool (*ewk_view_pre_render_region)(Evas_Object *, Evas_Coord, Evas_Coord, Evas_Coord, Evas_Coord, float);
      void (*ewk_view_pre_render_cancel)(Evas_Object *);
@@ -151,6 +151,8 @@ struct _Smart_Data {
      Eina_Bool (*ewk_frame_scroll_add)(Evas_Object *, int, int);
      unsigned int (*ewk_view_imh_get)(Evas_Object *);
      Ecore_IMF_Context* (*ewk_view_core_imContext_get)(Evas_Object *);
+     void (*ewk_set_show_geolocation_permission_dialog_callback)(ewk_show_geolocation_permission_dialog_callback);
+     void (*ewk_set_geolocation_sharing_allowed)(void *, Eina_Bool);
 
      /* cairo functions */
      cairo_t * (*cairo_create)(cairo_surface_t *);
@@ -308,6 +310,7 @@ static void      _unzoom_position(Evas_Object* webview, int x, int y, int* ux, i
 static void      _coords_evas_to_ewk(Evas_Object* webview, int x, int y, int* ux, int* uy);
 static void      _coords_ewk_to_evas(Evas_Object* webview, int x, int y, int* ux, int* uy);
 static void      _update_min_zoom_rate(Evas_Object *obj);
+static void      _geolocation_permission_callback(void *geolocation_obj, const char* url);
 
 /* local subsystem globals */
 static Evas_Smart *_smart = NULL;
@@ -320,6 +323,8 @@ static void *cairo_handle;
 static Ewk_Tile_Unused_Cache *ewk_tile_cache = NULL;
 static ewk_tile_cache_ref_count = 0;
 
+static Evas_Object *obj = NULL;
+
 /* externally accessible functions */
 Evas_Object*
 _elm_smart_webview_add(Evas *evas, Eina_Bool tiled)
@@ -411,6 +416,7 @@ _elm_smart_webview_add(Evas *evas, Eina_Bool tiled)
        ERR("could not create smart object for webview");
        return NULL;
      }
+   obj = webview;
 
    // set tiled and unused cache 
    Smart_Data* sd = evas_object_smart_data_get(webview);
@@ -706,6 +712,7 @@ _smart_mouse_down(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Down* ev)
 
    if (sd->events_feed)
      {
+       _suspend_all(sd, EINA_FALSE);
        sd->mouse_clicked = EINA_TRUE;
        return _parent_sc.mouse_down(esd, ev);
      }
@@ -721,6 +728,7 @@ _smart_mouse_up(Ewk_View_Smart_Data *esd, const Evas_Event_Mouse_Up* ev)
 
    if (sd->events_feed)
      {
+       _resume_all(sd, EINA_FALSE);
        //check if user hold touch
        if (ev && (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
          {
@@ -1179,14 +1187,11 @@ _smart_load_nonemptylayout_finished(void* data, Evas_Object* frame, void* arg)
    if (!sd->ewk_view_user_scalable_set)
      sd->ewk_view_user_scalable_set = (void (*)(Evas_Object *, Eina_Bool))dlsym(ewk_handle, "ewk_view_user_scalable_set");
    if (!sd->ewk_view_zoom_range_set)
-     sd->ewk_view_zoom_range_set = (void (*)(Evas_Object *, float, float))dlsym(ewk_handle, "ewk_view_zoom_range_set");
+     sd->ewk_view_zoom_range_set = (Eina_Bool (*)(Evas_Object *, float, float))dlsym(ewk_handle, "ewk_view_zoom_range_set");
    if (!sd->ewk_view_fixed_layout_size_set)
      sd->ewk_view_fixed_layout_size_set = (void (*)(Evas_Object *, Evas_Coord, Evas_Coord))dlsym(ewk_handle, "ewk_view_fixed_layout_size_set");
 
-   if (sd->use_zoom_bouncing)
-     sd->ewk_view_zoom_range_set(webview, MIN_ZOOM_RATIO, MAX_ZOOM_RATIO + ZOOM_IN_BOUNCING);
-   else
-     sd->ewk_view_zoom_range_set(webview, MIN_ZOOM_RATIO, MAX_ZOOM_RATIO);
+   sd->ewk_view_zoom_range_set(webview, MIN_ZOOM_RATIO, MAX_ZOOM_RATIO);
 
    // set default layout size
    int object_w, object_h;
@@ -1218,6 +1223,7 @@ _smart_load_nonemptylayout_finished(void* data, Evas_Object* frame, void* arg)
          {
             // set page layout info, zoom and layout again
             _smart_page_layout_info_set(sd, 1.0f, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate, sd->zoom.scalable);
+            sd->ewk_view_zoom_range_set(webview, MIN_ZOOM_RATIO, MAX_ZOOM_RATIO);
             sd->ewk_view_zoom_set(webview, sd->zoom.init_zoom_rate, 0, 0);
             sd->ewk_view_fixed_layout_size_set(webview, sd->layout.w, sd->layout.h);
          }
@@ -1285,6 +1291,10 @@ _smart_add(Evas_Object* obj)
    sd->ewk_view_theme_set = (void (*)(Evas_Object *, const char *))dlsym(ewk_handle, "ewk_view_theme_set");
    sd->ewk_view_theme_set(obj, WEBKIT_EDJ);
 
+   // set geolocation callback
+   sd->ewk_set_show_geolocation_permission_dialog_callback = (void (*)(ewk_show_geolocation_permission_dialog_callback))dlsym(ewk_handle, "ewk_set_show_geolocation_permission_dialog_callback");
+   sd->ewk_set_show_geolocation_permission_dialog_callback(_geolocation_permission_callback);
+
    sd->ewk_view_zoom_text_only_set = (Eina_Bool (*)(Evas_Object *, Eina_Bool))dlsym(ewk_handle, "ewk_view_zoom_text_only_set");
    sd->ewk_view_zoom_text_only_set(obj, EINA_FALSE);
    sd->ewk_view_zoom_cairo_scaling_set = (Eina_Bool (*)(Evas_Object *, Eina_Bool))dlsym(ewk_handle, "ewk_view_zoom_cairo_scaling_set");
@@ -1606,7 +1616,11 @@ _smart_cb_mouse_down(void* data, Evas_Object* webview, void* ev)
 #endif
 
    sd->mouse_clicked = EINA_TRUE;
-   _parent_sc.mouse_down((Ewk_View_Smart_Data*)sd, &sd->mouse_down_copy);
+   Evas_Event_Mouse_Down mouse_down = sd->mouse_down_copy;
+   Evas_Point* point = (Evas_Point*)ev;
+   mouse_down.canvas.x = point->x;
+   mouse_down.canvas.y = point->y;
+   _parent_sc.mouse_down((Ewk_View_Smart_Data*)sd, &mouse_down);
 
 #if 0 // comment out below code until it is completed
    if (sd->bounce_horiz)
@@ -1738,7 +1752,10 @@ _smart_cb_mouse_tap(void* data, Evas_Object* webview, void* ev)
        return;
      }
 
-   _parent_sc.mouse_up((Ewk_View_Smart_Data*)sd, &sd->mouse_up_copy);
+   Evas_Event_Mouse_Up mouse_up = sd->mouse_up_copy;
+   mouse_up.canvas.x = point->x;
+   mouse_up.canvas.y = point->y;
+   _parent_sc.mouse_up((Ewk_View_Smart_Data*)sd, &mouse_up);
    sd->mouse_clicked = EINA_FALSE;
 }
 
@@ -1775,7 +1792,28 @@ _smart_cb_pan_by(void* data, Evas_Object* webview, void* ev)
    if (!sd) return;
    Evas_Point* point = (Evas_Point*)ev;
 
-   if (sd->events_feed == EINA_TRUE) return;
+   if (sd->events_feed == EINA_TRUE)
+     {
+       Evas* evas = evas_object_evas_get(webview);
+       Evas_Modifier *modifiers = (Evas_Modifier *)evas_key_modifier_get(evas);
+       Evas_Lock *locks = (Evas_Lock *)evas_key_lock_get(evas);
+
+       Evas_Event_Mouse_Move event_move;
+       event_move.buttons = 1;
+       event_move.cur.output.x = point->x;
+       event_move.cur.output.y = point->y;
+       event_move.cur.canvas.x = point->x;
+       event_move.cur.canvas.y = point->y;
+       event_move.data = NULL;
+       event_move.modifiers = modifiers;
+       event_move.locks = locks;
+       event_move.timestamp = ecore_loop_time_get();
+       event_move.event_flags = EVAS_EVENT_FLAG_NONE;
+       event_move.dev = NULL;
+
+       _parent_sc.mouse_move((Ewk_View_Smart_Data*)sd, &event_move);
+       return;
+     }
    if (sd->on_panning == EINA_FALSE) return;
 
    if (sd->use_text_selection == EINA_TRUE && sd->text_selection_on == EINA_TRUE)
@@ -1898,8 +1936,6 @@ _smart_cb_pan_stop(void* data, Evas_Object* webview, void* ev)
    Evas_Point* point = (Evas_Point*)ev;
    sd->on_panning = EINA_FALSE;
 
-   _resume_all(sd, EINA_FALSE);
-
    if (sd->use_text_selection == EINA_TRUE && sd->text_selection_on == EINA_TRUE)
      {
        if (sd->text_selection.front_handle_moving == EINA_TRUE
@@ -1909,6 +1945,8 @@ _smart_cb_pan_stop(void* data, Evas_Object* webview, void* ev)
        sd->text_selection.back_handle_moving = EINA_FALSE;
      }
 
+   _resume_all(sd, EINA_FALSE);
+
    if (sd->tiled)
      {
        if (!sd->ewk_view_tiled_unused_cache_get)
@@ -3100,7 +3138,7 @@ _update_min_zoom_rate(Evas_Object *obj)
    if (!sd->ewk_frame_contents_size_get)
      sd->ewk_frame_contents_size_get = (Eina_Bool (*)(const Evas_Object *, Evas_Coord *, Evas_Coord *))dlsym(ewk_handle, "ewk_frame_contents_size_get");
    if (!sd->ewk_view_zoom_range_set)
-     sd->ewk_view_zoom_range_set = (void (*)(Evas_Object *, float, float))dlsym(ewk_handle, "ewk_view_zoom_range_set");
+     sd->ewk_view_zoom_range_set = (Eina_Bool (*)(Evas_Object *, float, float))dlsym(ewk_handle, "ewk_view_zoom_range_set");
 
    int content_w, object_w;
    evas_object_geometry_get(obj, NULL, NULL, &object_w, NULL);
@@ -3120,4 +3158,50 @@ _update_min_zoom_rate(Evas_Object *obj)
        sd->ewk_view_zoom_range_set(obj, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
      }
 }
+static void
+_geolocation_permission_callback(void *geolocation_obj, const char* url)
+{
+   printf("\n\n<< %s >>\n\n", __func__);
+   INTERNAL_ENTRY;
+
+   Evas_Object *popup;
+   int length;
+   char msg1[] = "The page at ";
+   char msg2[] = "<br>wants to know where you are.<br>Do you want to share location?";
+   char *msg = NULL;
+   int result;
+
+   length = strlen(msg1) + strlen(url) + strlen(msg2);
+   msg = calloc(length + 1, sizeof(char));
+   strncpy(msg, msg1, strlen(msg1));
+   strncat(msg, url, strlen(url));
+   strncat(msg, msg2, strlen(msg2));
+   msg[length] = '\0';
+
+   popup = elm_popup_add(obj);
+   evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_popup_desc_set(popup, msg);
+   elm_popup_buttons_add(popup, 2, "Share", ELM_POPUP_RESPONSE_OK,
+                                  "Don't Share", ELM_POPUP_RESPONSE_CANCEL, NULL);
+   result = elm_popup_run(popup); // modal dialog
+   switch (result)
+     {
+      case ELM_POPUP_RESPONSE_OK:
+        if (!sd->ewk_set_geolocation_sharing_allowed)
+          sd->ewk_set_geolocation_sharing_allowed = (void (*)(void *, Eina_Bool))dlsym(ewk_handle, "ewk_set_geolocation_sharing_allowed");
+        sd->ewk_set_geolocation_sharing_allowed(geolocation_obj, EINA_TRUE);
+        break;
+
+      case ELM_POPUP_RESPONSE_CANCEL:
+        if (!sd->ewk_set_geolocation_sharing_allowed)
+          sd->ewk_set_geolocation_sharing_allowed = (void (*)(void *, Eina_Bool))dlsym(ewk_handle, "ewk_set_geolocation_sharing_allowed");
+        sd->ewk_set_geolocation_sharing_allowed(geolocation_obj, EINA_FALSE);
+        break;
+
+      default:
+        break;
+     }
+   if (msg)
+     free(msg);
+}
 #endif