[elm_webview]enable tiled backingstore
authorEunmi Lee <eunmi15.lee@samsung.com>
Thu, 29 Jul 2010 09:51:16 +0000 (18:51 +0900)
committerEunmi Lee <eunmi15.lee@samsung.com>
Thu, 29 Jul 2010 09:52:13 +0000 (18:52 +0900)
             and apply new viewport codes from Browser

src/bin/test_webview.c
src/lib/Elementary.h.in
src/lib/elm_webview.c
src/lib/els_webview.c

index c0cae1a..6ee01cd 100644 (file)
@@ -50,7 +50,7 @@ test_webview_in_scroller(void *data, Evas_Object *obj, void *event_info)
      }
 
    //create webview
-   wv = elm_webview_add(win);
+   wv = elm_webview_add(win, EINA_TRUE);
    evas_object_size_hint_weight_set(wv, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_min_set(wv, 480, 400);
    elm_box_pack_end(bx, wv);
@@ -89,7 +89,7 @@ test_webview(void *data, Evas_Object *obj, void *event_info)
    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_show(bg);
 
-   wv = elm_webview_add(win);
+   wv = elm_webview_add(win, EINA_TRUE);
    evas_object_size_hint_weight_set(wv, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    elm_win_resize_object_add(win, wv);
    elm_webview_uri_set(wv, "http://www.google.com");
index 27e7c58..0d0e5c9 100644 (file)
@@ -2498,7 +2498,7 @@ extern "C" {
    
    /* WebView */
    /* commented out until it is completed
-   EAPI Evas_Object *elm_webview_add(Evas_Object *parent);
+   EAPI Evas_Object *elm_webview_add(Evas_Object *parent, Eina_Bool tiled);
    EAPI Evas_Object *elm_webview_widget_get(Evas_Object *obj);
    EAPI void         elm_webview_events_feed_set(Evas_Object *obj, Eina_Bool feed);
    EAPI void         elm_webview_events_feed_get(Evas_Object *obj);
index e904194..d1dc24f 100644 (file)
@@ -84,7 +84,7 @@ _layout(Evas_Object *o, Evas_Object_Box_Data *priv, void *data)
  */
 #ifdef ELM_EWEBKIT
 EAPI Evas_Object *
-elm_webview_add(Evas_Object *parent)
+elm_webview_add(Evas_Object *parent, Eina_Bool tiled)
 {
    Evas_Object *obj;
    Evas *e;
@@ -99,7 +99,7 @@ elm_webview_add(Evas_Object *parent)
    elm_widget_data_set(obj, wd);
    elm_widget_del_hook_set(obj, _del_hook);
 
-   wd->webkit = _elm_smart_webview_add(e, EINA_FALSE);
+   wd->webkit = _elm_smart_webview_add(e, tiled);
    _elm_smart_webview_widget_set(wd->webkit, obj);
    //TODO:evas_object_box_layout_set(wd->box, _layout, wd, NULL);
    evas_object_event_callback_add(wd->webkit, EVAS_CALLBACK_CHANGED_SIZE_HINTS,
index ddbf9b5..6c7f7d9 100644 (file)
@@ -31,7 +31,7 @@
 #define MINIMAP_HEIGHT 200
 #define MAX_TUC 1024*1024*10
 #define MAX_URI 512
-#define MOBILE_DEFAULT_WIDTH 320
+#define MOBILE_DEFAULT_ZOOM_RATIO 1.5f
 
 #define WEBVIEW_EDJ "/usr/share/edje/ewebview.edj"
 #define WEBKIT_EDJ "/usr/share/edje/webkit.edj"
@@ -57,6 +57,7 @@ struct _Smart_Data {
      Evas_Object *(*ewk_view_frame_main_get)(const Evas_Object *);
      Eina_Bool (*ewk_view_uri_set)(Evas_Object *, const char *);
      float (*ewk_view_zoom_get)(const Evas_Object *);
+     const char * (*ewk_view_uri_get)(const Evas_Object *o);
      Eina_Bool (*ewk_view_zoom_set)(Evas_Object *, float, Evas_Coord, Evas_Coord);
      Eina_Bool (*ewk_view_zoom_weak_set)(Evas_Object *, float, Evas_Coord, Evas_Coord);
      Eina_Bool (*ewk_view_zoom_text_only_set)(Evas_Object *, Eina_Bool);
@@ -94,7 +95,6 @@ struct _Smart_Data {
      Eina_Bool (*ewk_frame_feed_mouse_up)(Evas_Object *, const Evas_Event_Mouse_Up *);
      Eina_Bool (*ewk_frame_visible_content_geometry_get)(const Evas_Object *, Eina_Bool, int *, int *, int *, int *);
      Eina_Bool (*ewk_frame_scroll_pos_get)(const Evas_Object *, int *, int *);
-     Evas_Object * (*ewk_frame_view_get)(const Evas_Object *);
      void (*ewk_frame_hit_test_free)(Ewk_Hit_Test *);
      Eina_Bool (*ewk_frame_contents_set)(Evas_Object *, const char *, size_t, const char *, const char *, const char *);
      Eina_Bool (*ewk_frame_select_closest_word)(Evas_Object *, int, int, int *, int *, int *, int *, int *, int *);
@@ -205,6 +205,7 @@ static void      _smart_load_started(void* data, Evas_Object* webview, void* err
 static void      _smart_load_finished(void* data, Evas_Object* webview, void* arg);
 static void      _smart_load_error(void* data, Evas_Object* webview, void* arg);
 static void      _smart_viewport_changed(void* data, Evas_Object* webview, void* arg);
+static void      _smart_page_layout_info_set(Smart_Data *sd, float init_zoom_rate, float min_zoom_rate, float max_zoom_rate, Eina_Bool scalable);
 static void      _smart_contents_size_changed(void* data, Evas_Object* frame, void* arg);
 static void      _smart_load_nonemptylayout_finished(void* data, Evas_Object* frame, void* arg);
 static void      _smart_cb_view_created(void* data, Evas_Object* webview, void* arg);
@@ -587,6 +588,11 @@ _smart_load_started(void* data, Evas_Object* webview, void* error)
    Smart_Data *sd = (Smart_Data *)data;
    if (!sd) return;
 
+   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");
+   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");
+
    // set default layout and zoom level
    sd->is_mobile_page = EINA_FALSE;
    sd->layout.w = sd->layout.default_w;
@@ -594,6 +600,8 @@ _smart_load_started(void* data, Evas_Object* webview, void* error)
    sd->zoom.min_zoom_rate = MIN_ZOOM_RATIO;
    sd->zoom.max_zoom_rate = MAX_ZOOM_RATIO;
    sd->zoom.scalable = EINA_TRUE;
+   sd->ewk_view_zoom_range_set(webview, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
+   sd->ewk_view_user_scalable_set(webview, EINA_TRUE);
 }
 
 static void
@@ -698,14 +706,38 @@ _smart_viewport_changed(void* data, Evas_Object* webview, void* arg)
        return;
      }
 
+   // if there is no layout_w, it is the desktop site.
+   if (layout_w <= 0) return;
+
    // set data for mobile page
    sd->is_mobile_page = EINA_TRUE;
-   sd->layout.w = (layout_w <= 0) ? MOBILE_DEFAULT_WIDTH : layout_w;
-   sd->zoom.init_zoom_rate = (float)object_w / sd->layout.w;
-   sd->zoom.min_zoom_rate = (min_zoom_rate <= 0) ? MIN_ZOOM_RATIO : min_zoom_rate;
-   sd->zoom.max_zoom_rate = (max_zoom_rate <= 0) ? MAX_ZOOM_RATIO : max_zoom_rate;
-   sd->layout.h = (layout_h <= 0) ? (object_h / sd->zoom.init_zoom_rate) : layout_h;
+   _smart_page_layout_info_set(sd, MOBILE_DEFAULT_ZOOM_RATIO, min_zoom_rate, max_zoom_rate, scalable);
+}
+
+static void _smart_page_layout_info_set(Smart_Data *sd, float init_zoom_rate, float min_zoom_rate, float max_zoom_rate, Eina_Bool scalable)
+{
+   Evas_Object* webview = sd->base.self;
+
+   int object_w, object_h;
+   evas_object_geometry_get(webview, NULL, NULL, &object_w, &object_h);
+   object_w = (object_w % 10) ? (object_w / 10 * 10 + 10) : object_w;
+
+   sd->zoom.init_zoom_rate = init_zoom_rate;
+   sd->layout.w = object_w / sd->zoom.init_zoom_rate;
+   sd->layout.h = object_h / sd->zoom.init_zoom_rate;
    sd->zoom.scalable = scalable;
+   if (scalable)
+     {
+       sd->zoom.min_zoom_rate = (min_zoom_rate <= init_zoom_rate) ? init_zoom_rate : min_zoom_rate;
+       sd->zoom.max_zoom_rate = (max_zoom_rate <= init_zoom_rate) ? init_zoom_rate : max_zoom_rate;
+       if (max_zoom_rate < min_zoom_rate)
+         max_zoom_rate = min_zoom_rate;
+     }
+   else
+     {
+       sd->zoom.min_zoom_rate = init_zoom_rate;
+       sd->zoom.max_zoom_rate = init_zoom_rate;
+     }
 }
 
 static void
@@ -714,10 +746,7 @@ _smart_contents_size_changed(void* data, Evas_Object* frame, void* arg)
    Smart_Data* sd = (Smart_Data *)data;
    if (!sd) return;
 
-   if (!(sd->ewk_frame_view_get))
-     sd->ewk_frame_view_get = (Evas_Object * (*)(const Evas_Object *))dlsym(ewk_handle, "ewk_frame_view_get");
-
-   Evas_Object* webview = sd->ewk_frame_view_get(frame);
+   Evas_Object* webview = sd->base.self;
 
    Evas_Coord* size = (Evas_Coord*)arg;
    if (!size || size[0] == 0)
@@ -742,44 +771,51 @@ _smart_load_nonemptylayout_finished(void* data, Evas_Object* frame, void* arg)
    Smart_Data* sd = (Smart_Data *)data;
    if (!sd) return;
 
-   if (!sd->ewk_frame_view_get)
-     sd->ewk_frame_view_get = (Evas_Object * (*)(const Evas_Object *))dlsym(ewk_handle, "ewk_frame_view_get");
-   Evas_Object* webview = sd->ewk_frame_view_get(frame);
-
-   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");
-   int content_w, content_h;
-   sd->ewk_frame_contents_size_get(frame, &content_w, &content_h);
+   Evas_Object* webview = sd->base.self;
 
    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");
-
-   sd->ewk_view_user_scalable_set(webview, EINA_TRUE);
-
    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");
    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");
 
+   sd->ewk_view_user_scalable_set(webview, EINA_TRUE);
+
    // set zoom and layout
    if (sd->is_mobile_page)
      {
        if (!sd->ewk_view_zoom_set)
          sd->ewk_view_zoom_set = (Eina_Bool (*)(Evas_Object *, float, Evas_Coord, Evas_Coord))dlsym(ewk_handle, "ewk_view_zoom_set");
-       sd->ewk_view_zoom_set(webview, sd->zoom.init_zoom_rate, 0, 0);
-       sd->ewk_view_zoom_range_set(webview, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
+       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_uri_get)
+         sd->ewk_view_uri_get = (const char * (*)(const Evas_Object *))dlsym(ewk_handle, "ewk_view_uri_get");
 
+       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);
 
+       int content_w;
+       sd->ewk_frame_contents_size_get(frame, &content_w, NULL);
+
+       const char *url = sd->ewk_view_uri_get(webview);
+       if (content_w > sd->layout.w && !strstr(url, "docs.google.com"))
+         {
+            // 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_set(webview, sd->zoom.init_zoom_rate, 0, 0);
+            sd->ewk_view_fixed_layout_size_set(webview, sd->layout.w, sd->layout.h);
+         }
+
      } else {
          evas_object_geometry_get(webview, NULL, NULL, NULL, &sd->layout.h);
          if (!sd->ewk_view_zoom_set)
            sd->ewk_view_zoom_set = (Eina_Bool (*)(Evas_Object *, float, Evas_Coord, Evas_Coord))dlsym(ewk_handle, "ewk_view_zoom_set");
          sd->ewk_view_zoom_set(webview, sd->zoom.init_zoom_rate, 0, 0);
-         sd->ewk_view_zoom_range_set(webview, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
          sd->ewk_view_fixed_layout_size_set(webview, sd->layout.w, sd->layout.h);
      }
 
+   sd->ewk_view_zoom_range_set(webview, sd->zoom.min_zoom_rate, sd->zoom.max_zoom_rate);
    sd->ewk_view_user_scalable_set(webview, sd->zoom.scalable);
 }