Index: src/lib/elm_widget_web.h
===================================================================
--- src/lib/elm_widget_web.h	(리비전 79836)
+++ src/lib/elm_widget_web.h	(작업 사본)
@@ -26,7 +26,10 @@
 typedef struct _Elm_Web_Smart_Data Elm_Web_Smart_Data;
 struct _Elm_Web_Smart_Data
 {
+   Evas_Object *hit_rect;
+   Evas_Object *pan_obj;
    Evas_Object *obj;
+   Evas_Object *content;
 #ifdef HAVE_ELEMENTARY_WEB
    struct
    {
@@ -106,16 +109,23 @@ typedef struct _View_Smart_Data View_Smart_Data;
 struct _View_Smart_Data
 {
    Ewk_View_Smart_Data base;
+   Elm_Web_Smart_Data *wsd;
+
    struct
    {
       Evas_Event_Mouse_Down event;
       Evas_Coord            x, y;
       unsigned int          move_count;
       Ecore_Timer          *longpress_timer;
-      Ecore_Animator       *pan_anim;
    } mouse;
 };
 
+typedef struct _Elm_Web_Pan_Smart_Data Elm_Web_Pan_Smart_Data;
+struct _Elm_Web_Pan_Smart_Data
+{
+   Evas_Object            *wobj;
+   Elm_Web_Smart_Data     *wsd;
+};
 #endif
 
 /**
@@ -125,6 +135,9 @@ struct _View_Smart_Data
 #define ELM_WEB_DATA_GET(o, sd) \
   Elm_Web_Smart_Data * sd = eo_data_get(o, ELM_OBJ_WEB_CLASS)
 
+#define ELM_WEB_PAN_DATA_GET(o, sd) \
+  Elm_Web_Pan_Smart_Data * sd = eo_data_get(o, ELM_OBJ_WEB_PAN_CLASS)
+
 #define ELM_WEB_DATA_GET_OR_RETURN(o, ptr)           \
   ELM_WEB_DATA_GET(o, ptr);                          \
   if (!ptr)                                          \
Index: src/lib/elm_web.c
===================================================================
--- src/lib/elm_web.c	(리비전 79836)
+++ src/lib/elm_web.c	(작업 사본)
@@ -1,14 +1,19 @@
 #include <Elementary.h>
 #include "elm_priv.h"
 #include "elm_widget_web.h"
+#include "elm_interface_scrollable.h"
 
 // TODO:
 //  1 - easy to use zoom like elm_photocam API
-//  2 - review scrolling to match elm_scroller. Maybe in future use
-//  elm_interface_scroller
 
 #if !defined(HAVE_ELEMENTARY_WEB) || !defined(USE_WEBKIT2)
 
+EAPI Eo_Op ELM_OBJ_WEB_PAN_BASE_ID = EO_NOOP;
+
+#define MY_PAN_CLASS ELM_OBJ_WEB_PAN_CLASS
+
+#define MY_PAN_CLASS_NAME "elm_web_pan"
+
 EAPI Eo_Op ELM_OBJ_WEB_BASE_ID = EO_NOOP;
 
 #define MY_CLASS ELM_OBJ_WEB_CLASS
@@ -26,9 +31,7 @@ EAPI Eo_Op ELM_OBJ_WEB_BASE_ID = EO_NOOP;
   "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
-#endif
 
-#ifdef HAVE_ELEMENTARY_WEB
 static Ewk_View_Smart_Class _ewk_view_parent_sc =
   EWK_VIEW_SMART_CLASS_INIT_NULL;
 
@@ -73,6 +76,96 @@ static const Evas_Smart_Cb_Description _elm_web_sm
 };
 
 #ifdef HAVE_ELEMENTARY_WEB
+static void
+_elm_web_pan_smart_pos_set(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   Evas_Coord x = va_arg(*list, Evas_Coord);
+   Evas_Coord y = va_arg(*list, Evas_Coord);
+   Elm_Web_Pan_Smart_Data *psd = _pd;
+
+   ewk_frame_scroll_set(ewk_view_frame_main_get(psd->wsd->content), x, y);
+}
+
+static void
+_elm_web_pan_smart_pos_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   Evas_Coord *x = va_arg(*list, Evas_Coord *);
+   Evas_Coord *y = va_arg(*list, Evas_Coord *);
+   Elm_Web_Pan_Smart_Data *psd = _pd;
+
+   ewk_frame_scroll_pos_get(ewk_view_frame_main_get(psd->wsd->content), x, y);
+}
+
+static void
+_elm_web_pan_smart_pos_max_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   Evas_Coord w, h, ow, oh;
+   Evas_Coord *x = va_arg(*list, Evas_Coord *);
+   Evas_Coord *y = va_arg(*list, Evas_Coord *);
+   Elm_Web_Pan_Smart_Data *psd = _pd;
+
+   ewk_frame_contents_size_get(ewk_view_frame_main_get(psd->wsd->content), &w, &h);
+   evas_object_geometry_get(psd->wsd->obj, NULL, NULL, &ow, &oh);
+
+   if (x)
+     {
+        if (ow < w) *x = w - ow;
+        else *x = 0;
+     }
+   if (y)
+     {
+        if (oh < h) *y = h - oh;
+        else *y = 0;
+     }
+}
+
+static void
+_elm_web_pan_smart_pos_min_get(Eo *obj EINA_UNUSED, void *_pd EINA_UNUSED, va_list *list)
+{
+   Evas_Coord *x = va_arg(*list, Evas_Coord *);
+   Evas_Coord *y = va_arg(*list, Evas_Coord *);
+
+   if (x) *x = 0;
+   if (y) *y = 0;
+}
+
+static void
+_elm_web_pan_smart_content_size_get(Eo *obj EINA_UNUSED, void *_pd, va_list *list)
+{
+   Evas_Coord *w = va_arg(*list, Evas_Coord *);
+   Evas_Coord *h = va_arg(*list, Evas_Coord *);
+   Elm_Web_Pan_Smart_Data *psd = _pd;
+
+   ewk_frame_contents_size_get(ewk_view_frame_main_get(psd->wsd->content), w, h);
+}
+
+static void
+_web_pan_class_constructor(Eo_Class *klass)
+{
+   const Eo_Op_Func_Description func_desc[] = {
+      EO_OP_FUNC(ELM_OBJ_PAN_ID(ELM_OBJ_PAN_SUB_ID_POS_SET), _elm_web_pan_smart_pos_set),
+      EO_OP_FUNC(ELM_OBJ_PAN_ID(ELM_OBJ_PAN_SUB_ID_POS_GET), _elm_web_pan_smart_pos_get),
+      EO_OP_FUNC(ELM_OBJ_PAN_ID(ELM_OBJ_PAN_SUB_ID_POS_MAX_GET), _elm_web_pan_smart_pos_max_get),
+      EO_OP_FUNC(ELM_OBJ_PAN_ID(ELM_OBJ_PAN_SUB_ID_POS_MIN_GET), _elm_web_pan_smart_pos_min_get),
+      EO_OP_FUNC(ELM_OBJ_PAN_ID(ELM_OBJ_PAN_SUB_ID_CONTENT_SIZE_GET), _elm_web_pan_smart_content_size_get),
+      EO_OP_FUNC_SENTINEL
+   };
+   eo_class_funcs_set(klass, func_desc);
+}
+
+static const Eo_Class_Description _web_pan_class_desc = {
+   EO_VERSION,
+   MY_PAN_CLASS_NAME,
+   EO_CLASS_TYPE_REGULAR,
+   EO_CLASS_DESCRIPTION_OPS(NULL, NULL, 0),
+   NULL,
+   sizeof(Elm_Web_Pan_Smart_Data),
+   _web_pan_class_constructor,
+   NULL
+};
+
+EO_DEFINE_CLASS(elm_obj_web_pan_class_get, &_web_pan_class_desc, ELM_OBJ_PAN_CLASS, NULL);
+
 static char *
 _webkit_theme_find(const Eina_List *list)
 {
@@ -105,9 +198,8 @@ _elm_web_smart_theme(Eo *obj, void *_pd EINA_UNUSE
    Elm_Theme *theme;
    const Eina_List *themes;
    char *view_theme = NULL;
+   ELM_WEB_DATA_GET(obj, sd);
 
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
-
    eo_do_super(obj, elm_wdg_theme(&int_ret));
    if (!int_ret) return;
 
@@ -126,12 +218,12 @@ _elm_web_smart_theme(Eo *obj, void *_pd EINA_UNUSE
 set:
    if (view_theme)
      {
-        ewk_view_theme_set(wd->resize_obj, view_theme);
+        ewk_view_theme_set(sd->content, view_theme);
         free(view_theme);
      }
    else
      ewk_view_theme_set
-       (wd->resize_obj, WEBKIT_DATADIR "/themes/default.edj");
+       (sd->content, WEBKIT_DATADIR "/themes/default.edj");
 #else
    (void)obj;
 #endif
@@ -148,18 +240,17 @@ _elm_web_smart_on_focus(Eo *obj, void *_pd, va_lis
    Evas_Object *top;
 
    Elm_Web_Smart_Data *sd = _pd;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
 
    top = elm_widget_top_get(obj);
 
    if (elm_object_focus_get(obj))
      {
-        evas_object_focus_set(wd->resize_obj, EINA_TRUE);
+        evas_object_focus_set(sd->content, EINA_TRUE);
         if (top) elm_win_keyboard_mode_set(top, sd->input_method);
      }
    else
      {
-        evas_object_focus_set(wd->resize_obj, EINA_FALSE);
+        evas_object_focus_set(sd->content, EINA_FALSE);
         if (top) elm_win_keyboard_mode_set(top, ELM_WIN_KEYBOARD_OFF);
      }
 #else
@@ -202,29 +293,6 @@ _elm_web_smart_event(Eo *obj, void *_pd, va_list *
 }
 
 #ifdef HAVE_ELEMENTARY_WEB
-static Eina_Bool
-_view_pan_animator(void *data)
-{
-   View_Smart_Data *sd = data;
-   Evas_Coord x, y, dx, dy;
-
-   evas_pointer_canvas_xy_get(sd->base.base.evas, &x, &y);
-
-   dx = sd->mouse.x - x;
-   dy = sd->mouse.y - y;
-
-   if ((dx == 0) && (dy == 0))
-     goto end;
-
-   ewk_frame_scroll_add(sd->base.main_frame, dx, dy);
-
-   sd->mouse.x = x;
-   sd->mouse.y = y;
-
-end:
-   return EINA_TRUE;
-}
-
 static void
 _view_smart_add(Evas_Object *obj)
 {
@@ -242,19 +310,6 @@ _view_smart_add(Evas_Object *obj)
    //ewk_view_zoom_weak_smooth_scale_set(obj, EINA_TRUE);
 }
 
-static void
-_view_smart_del(Evas_Object *obj)
-{
-   View_Smart_Data *sd;
-
-   sd = evas_object_smart_data_get(obj);
-
-   if (sd->mouse.pan_anim)
-     ecore_animator_del(sd->mouse.pan_anim);
-
-   _ewk_view_parent_sc.sc.del(obj);
-}
-
 static Eina_Bool
 _view_longpress_timer(void *data)
 {
@@ -270,14 +325,14 @@ static Eina_Bool
 _view_smart_mouse_down(Ewk_View_Smart_Data *esd,
                        const Evas_Event_Mouse_Down *event)
 {
-   // TODO: mimic elm_scroller and like
    // TODO-minor: offer hook?
+   // TODO: provide better event emulation
+   // TODO: may need hit test for sub frame and overflow layer scroll.
    View_Smart_Data *sd = (View_Smart_Data *)esd;
 
-   if (event->button != 1)
+   if (!_elm_config->thumbscroll_enable || event->button != 1)
      return _ewk_view_parent_sc.mouse_down(esd, event);
 
-   sd->mouse.pan_anim = ecore_animator_add(_view_pan_animator, sd);
    sd->mouse.longpress_timer = ecore_timer_add
        (_elm_config->longpress_timeout, _view_longpress_timer, sd);
    sd->mouse.move_count = 1;
@@ -292,25 +347,20 @@ static Eina_Bool
 _view_smart_mouse_up(Ewk_View_Smart_Data *esd,
                      const Evas_Event_Mouse_Up *event)
 {
-   // TODO: mimic elm_scroller and like
    // TODO-minor: offer hook?
+   // TODO: provide better event emulation
    View_Smart_Data *sd = (View_Smart_Data *)esd;
 
-   if (sd->mouse.pan_anim)
-     {
-        ecore_animator_del(sd->mouse.pan_anim);
-        sd->mouse.pan_anim = NULL;
-
-        if (sd->mouse.longpress_timer)
-          _ewk_view_parent_sc.mouse_down(esd, &sd->mouse.event);
-        else
-          return EINA_TRUE;
-     }
-
    if (sd->mouse.longpress_timer)
      {
         ecore_timer_del(sd->mouse.longpress_timer);
         sd->mouse.longpress_timer = NULL;
+
+        if (_elm_config->thumbscroll_enable &&
+            event->button == 1 &&
+            sd->mouse.x == event->canvas.x &&
+            sd->mouse.y == event->canvas.y)
+          _ewk_view_parent_sc.mouse_down(esd, &sd->mouse.event);
      }
 
    sd->mouse.move_count = 0;
@@ -321,8 +371,8 @@ static Eina_Bool
 _view_smart_mouse_move(Ewk_View_Smart_Data *esd,
                        const Evas_Event_Mouse_Move *event)
 {
-   // TODO: mimic elm_scroller and like
    // TODO-minor: offer hook?
+   // TODO: provide better event emulation
    View_Smart_Data *sd = (View_Smart_Data *)esd;
 
    sd->mouse.move_count++;
@@ -335,14 +385,22 @@ _view_smart_mouse_move(Ewk_View_Smart_Data *esd,
         sd->mouse.longpress_timer = NULL;
      }
 
-   if (sd->mouse.pan_anim)
-     {
-        return EINA_FALSE;
-     }
+   if (!_elm_config->thumbscroll_enable)
+     return _ewk_view_parent_sc.mouse_move(esd, event);
 
-   return _ewk_view_parent_sc.mouse_move(esd, event);
+   return EINA_TRUE;
 }
 
+static Eina_Bool
+_view_smart_mouse_wheel(Ewk_View_Smart_Data *esd,
+                       const Evas_Event_Mouse_Wheel *event)
+{
+   if (!_elm_config->thumbscroll_enable)
+     return _ewk_view_parent_sc.mouse_wheel(esd, event);
+
+   return EINA_TRUE;
+}
+
 static Evas_Object *
 _view_smart_window_create(Ewk_View_Smart_Data *vsd,
                           Eina_Bool javascript,
@@ -751,6 +809,24 @@ _view_smart_focus_can_cycle(Ewk_View_Smart_Data *s
    return EINA_TRUE;
 }
 
+static void
+_view_smart_calculate(Evas_Object *obj)
+{
+   Eina_Bool size_changed, position_changed;
+   View_Smart_Data *sd = evas_object_smart_data_get(obj);
+
+   size_changed = sd->base.changed.size;
+   position_changed = sd->base.changed.position;
+
+   _ewk_view_parent_sc.sc.calculate(obj);
+
+   if (size_changed || position_changed)
+     {
+        evas_object_smart_callback_call(sd->wsd->pan_obj, "changed", NULL);
+        evas_object_smart_changed(sd->wsd->pan_obj);
+     }
+}
+
 /**
  * Creates a new view object given the parent.
  *
@@ -785,11 +861,11 @@ _view_add(Evas_Object *parent)
         // TODO: ie: run_javascript_alert() should present an elm_win
         // TODO: by default, but user could override it to show as inwin.
         api.sc.add = _view_smart_add;
-        api.sc.del = _view_smart_del;
-        //api.sc.calculate = _view_smart_calculate;
+        api.sc.calculate = _view_smart_calculate;
         api.mouse_down = _view_smart_mouse_down;
         api.mouse_up = _view_smart_mouse_up;
         api.mouse_move = _view_smart_mouse_move;
+        api.mouse_wheel = _view_smart_mouse_wheel;
         api.add_console_message = _view_smart_add_console_message;
         api.window_create = _view_smart_window_create;
         api.window_close = _view_smart_window_close;
@@ -890,10 +966,9 @@ static Eina_Bool
 _reset_zoom_timer_cb(void *data)
 {
    Elm_Web_Smart_Data *sd = data;
-   Elm_Widget_Smart_Data *wd = eo_data_get(sd->obj, ELM_OBJ_WIDGET_CLASS);
 
    sd->zoom.timer = ecore_timer_add(0.0, _restore_zoom_mode_timer_cb, sd);
-   ewk_view_zoom_set(wd->resize_obj, 1.0, 0, 0);
+   ewk_view_zoom_set(sd->content, 1.0, 0, 0);
 
    return EINA_FALSE;
 }
@@ -1071,10 +1146,8 @@ _bring_in_anim_cb(void *data,
                   double pos)
 {
    Elm_Web_Smart_Data *sd = data;
-   Elm_Widget_Smart_Data *wd = eo_data_get(sd->obj, ELM_OBJ_WIDGET_CLASS);
 
-   Evas_Object *frame =
-     ewk_view_frame_main_get(wd->resize_obj);
+   Evas_Object *frame = ewk_view_frame_main_get(sd->content);
    int sx, sy, rx, ry;
 
    sx = sd->bring_in.start.x;
@@ -1130,55 +1203,82 @@ _elm_web_smart_add(Eo *obj, void *_pd, va_list *li
    Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
 
 #ifdef HAVE_ELEMENTARY_WEB
-   wd->resize_obj = _view_add(obj);
-#else
-   wd->resize_obj = elm_label_add(obj);
-   elm_object_text_set
-     (wd->resize_obj, "WebKit not supported!");
-   evas_object_show(wd->resize_obj);
+   Evas_Coord minw, minh;
+   View_Smart_Data *view_data;
+   Elm_Web_Pan_Smart_Data *pan_data;
 #endif
 
    eo_do_super(obj, evas_obj_smart_add());
 
+   priv->hit_rect = evas_object_rectangle_add(evas_object_evas_get(obj));
+   evas_object_data_set(priv->hit_rect, "_elm_leaveme", obj);
+   evas_object_smart_member_add(priv->hit_rect, obj);
+   elm_widget_sub_object_add(obj, priv->hit_rect);
+
+   /* common scroller hit rectangle setup */
+   evas_object_color_set(priv->hit_rect, 0, 0, 0, 0);
+   evas_object_show(priv->hit_rect);
+   evas_object_repeat_events_set(priv->hit_rect, EINA_TRUE);
+
+   elm_widget_can_focus_set(obj, EINA_TRUE);
+
+   elm_layout_theme_set(obj, "web", "base", elm_widget_style_get(obj));
+
 #ifdef HAVE_ELEMENTARY_WEB
-   ewk_view_setting_user_agent_set
-     (wd->resize_obj, ELM_WEB_USER_AGENT);
+   priv->content = _view_add(obj);
 
+   view_data = evas_object_smart_data_get(priv->content);
+   view_data->wsd = priv;
+#else
+   priv->content = elm_label_add(obj);
+   elm_object_text_set(priv->content, "WebKit not supported!");
+#endif
+
+   evas_object_show(priv->content);
+
+   eo_do(obj, elm_scrollable_interface_objects_set(wd->resize_obj, priv->hit_rect));
+
+#ifdef HAVE_ELEMENTARY_WEB
+   priv->pan_obj = eo_add(MY_PAN_CLASS, evas_object_evas_get(obj));
+   pan_data = eo_data_get(priv->pan_obj, MY_PAN_CLASS);
+   pan_data->wobj = obj;
+   pan_data->wsd = priv;
+
+   eo_do(obj, elm_scrollable_interface_extern_pan_set(priv->pan_obj));
+
+   edje_object_size_min_calc(wd->resize_obj, &minw, &minh);
+   evas_object_size_hint_min_set(obj, minw, minh);
+
+   ewk_view_setting_user_agent_set(priv->content, ELM_WEB_USER_AGENT);
+
    priv->input_method = ELM_WIN_KEYBOARD_OFF;
    evas_object_smart_callback_add
-     (wd->resize_obj, "inputmethod,changed",
+     (priv->content, "inputmethod,changed",
      _ewk_view_inputmethod_change_cb, priv);
    evas_object_smart_callback_add
-     (wd->resize_obj, "load,started",
-     _ewk_view_load_started_cb, priv);
+     (priv->content, "load,started", _ewk_view_load_started_cb, priv);
    evas_object_smart_callback_add
-     (wd->resize_obj, "popup,create",
-     _ewk_view_popup_create_cb, priv);
+     (priv->content, "popup,create", _ewk_view_popup_create_cb, priv);
    evas_object_smart_callback_add
-     (wd->resize_obj, "load,finished",
-     _ewk_view_load_finished_cb, priv);
+     (priv->content, "load,finished", _ewk_view_load_finished_cb, priv);
    evas_object_smart_callback_add
-     (wd->resize_obj, "viewport,changed",
-     _ewk_view_viewport_changed_cb, priv);
+     (priv->content, "viewport,changed", _ewk_view_viewport_changed_cb, priv);
    evas_object_smart_callback_add
-     (wd->resize_obj, "view,resized",
-     _ewk_view_resized_cb, priv);
+     (priv->content, "view,resized", _ewk_view_resized_cb, priv);
 
    priv->tab_propagate = EINA_FALSE;
    priv->inwin_mode = _elm_config->inwin_dialogs_enable;
-   priv->zoom.min =
-     ewk_view_zoom_range_min_get(wd->resize_obj);
-   priv->zoom.max =
-     ewk_view_zoom_range_max_get(wd->resize_obj);
+   priv->zoom.min = ewk_view_zoom_range_min_get(priv->content);
+   priv->zoom.max = ewk_view_zoom_range_max_get(priv->content);
    priv->zoom.current = 1.0;
 
-   _view_smart_callback_proxy(wd->resize_obj, obj);
+   _view_smart_callback_proxy(priv->content, obj);
    eo_do(obj, elm_wdg_theme(NULL));
+#endif
 
-   elm_widget_can_focus_set(obj, EINA_TRUE);
-#else
-   (void)priv;
-#endif
+   eo_do(obj, elm_scrollable_interface_content_set(priv->content));
+
+   elm_layout_sizing_eval(obj);
 }
 
 static void
@@ -1198,6 +1298,10 @@ _elm_web_smart_del(Eo *obj, void *_pd, va_list *li
         ecore_animator_del(sd->bring_in.animator);
         sd->bring_in.animator = NULL;
      }
+
+   eo_unref(sd->pan_obj);
+   evas_object_del(sd->pan_obj);
+   sd->pan_obj = NULL;
 #else
    (void)_pd;
 #endif
@@ -1205,6 +1309,32 @@ _elm_web_smart_del(Eo *obj, void *_pd, va_list *li
    eo_do_super(obj, evas_obj_smart_del());
 }
 
+static void
+_elm_web_smart_resize(Eo *obj, void *_pd, va_list *list)
+{
+   Evas_Coord w = va_arg(*list, Evas_Coord);
+   Evas_Coord h = va_arg(*list, Evas_Coord);
+   Elm_Web_Smart_Data *sd = _pd;
+
+   eo_do_super(obj, evas_obj_smart_resize(w, h));
+
+   evas_object_resize(sd->hit_rect, w, h);
+   evas_object_resize(sd->content, w, h);
+}
+
+static void
+_elm_web_smart_move(Eo *obj, void *_pd, va_list *list)
+{
+   Evas_Coord x = va_arg(*list, Evas_Coord);
+   Evas_Coord y = va_arg(*list, Evas_Coord);
+   Elm_Web_Smart_Data *sd = _pd;
+
+   eo_do_super(obj, evas_obj_smart_move(x, y));
+
+   evas_object_move(sd->hit_rect, x, y);
+   evas_object_move(sd->content, x, y);
+}
+
 EAPI Evas_Object *
 elm_web_add(Evas_Object *parent)
 {
@@ -1242,9 +1372,8 @@ _webkit_view_get(Eo *obj, void *_pd EINA_UNUSED, v
 {
    Evas_Object **ret = va_arg(*list, Evas_Object **);
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
-
-   *ret = wd->resize_obj;
+   ELM_WEB_DATA_GET(obj, sd);
+   *ret = sd->content;
 #else
    ERR("Elementary not compiled with EWebKit support.");
    *ret =  NULL;
@@ -1423,10 +1552,9 @@ _useragent_set(Eo *obj, void *_pd EINA_UNUSED, va_
 {
    const char *user_agent = va_arg(*list, const char *);
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   ewk_view_setting_user_agent_set
-     (wd->resize_obj, user_agent);
+   ewk_view_setting_user_agent_set(sd->content, user_agent);
 #else
    (void)user_agent;
    (void)obj;
@@ -1448,9 +1576,9 @@ _useragent_get(Eo *obj, void *_pd EINA_UNUSED, va_
    const char **ret = va_arg(*list, const char **);
 
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   *ret = ewk_view_setting_user_agent_get(wd->resize_obj);
+   *ret = ewk_view_setting_user_agent_get(sd->content);
 #else
    *ret = NULL;
    (void)obj;
@@ -1522,9 +1650,9 @@ _uri_set(Eo *obj, void *_pd EINA_UNUSED, va_list *
 
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret = EINA_FALSE;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_uri_set(wd->resize_obj, uri);
+   int_ret = ewk_view_uri_set(sd->content, uri);
    if (ret) *ret = int_ret;
 #else
    (void)uri;
@@ -1547,9 +1675,9 @@ _uri_get(Eo *obj, void *_pd EINA_UNUSED, va_list *
 {
    const char **ret = va_arg(*list, const char **);
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   *ret = ewk_view_uri_get(wd->resize_obj);
+   *ret = ewk_view_uri_get(sd->content);
 #else
    *ret = NULL;
    (void)obj;
@@ -1573,9 +1701,9 @@ _title_get(Eo *obj, void *_pd EINA_UNUSED, va_list
 #ifdef HAVE_ELEMENTARY_WEB
    const Ewk_Text_With_Direction *txt;
 
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   txt = ewk_view_title_get(wd->resize_obj);
+   txt = ewk_view_title_get(sd->content);
    if (txt) *ret = txt->string;
 
 #else
@@ -1603,9 +1731,9 @@ _bg_color_set(Eo *obj, void *_pd EINA_UNUSED, va_l
    int b = va_arg(*list, int);
    int a = va_arg(*list, int);
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   ewk_view_bg_color_set(wd->resize_obj, r, g, b, a);
+   ewk_view_bg_color_set(sd->content, r, g, b, a);
 #else
    (void)obj;
    (void)r;
@@ -1639,9 +1767,9 @@ _bg_color_get(Eo *obj, void *_pd EINA_UNUSED, va_l
    if (b) *b = 0;
    if (a) *a = 0;
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   return ewk_view_bg_color_get(wd->resize_obj, r, g, b, a);
+   return ewk_view_bg_color_get(sd->content, r, g, b, a);
 #else
    (void)obj;
 #endif
@@ -1661,9 +1789,9 @@ _selection_get(Eo *obj, void *_pd EINA_UNUSED, va_
 {
    const char **ret = va_arg(*list, const char **);
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   *ret = ewk_view_selection_get(wd->resize_obj);
+   *ret = ewk_view_selection_get(sd->content);
 #else
    *ret = NULL;
    (void)obj;
@@ -1683,8 +1811,8 @@ _popup_selected_set(Eo *obj, void *_pd EINA_UNUSED
 {
    int idx = va_arg(*list, int);
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
-   ewk_view_popup_selected_set(wd->resize_obj, idx);
+   ELM_WEB_DATA_GET(obj, sd);
+   ewk_view_popup_selected_set(sd->content, idx);
 #else
    (void)idx;
    (void)obj;
@@ -1707,8 +1835,8 @@ _popup_destroy(Eo *obj, void *_pd EINA_UNUSED, va_
    if (ret) *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret = EINA_FALSE;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
-   int_ret = ewk_view_popup_destroy(wd->resize_obj);
+   ELM_WEB_DATA_GET(obj, sd);
+   int_ret = ewk_view_popup_destroy(sd->content);
    if (ret) *ret = int_ret;
 #else
    (void)obj;
@@ -1740,11 +1868,10 @@ _text_search(Eo *obj, void *_pd EINA_UNUSED, va_li
 
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret = EINA_FALSE;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
    int_ret = ewk_view_text_search
-            (wd->resize_obj, string,
-            case_sensitive, forward, wrap);
+            (sd->content, string, case_sensitive, forward, wrap);
    if (ret) *ret = int_ret;
 #else
    (void)string;
@@ -1780,10 +1907,9 @@ _text_matches_mark(Eo *obj, void *_pd EINA_UNUSED,
 
 #ifdef HAVE_ELEMENTARY_WEB
    unsigned int int_ret = 0;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
    int_ret = ewk_view_text_matches_mark
-            (wd->resize_obj, string,
-            case_sensitive, highlight, limit);
+            (sd->content, string, case_sensitive, highlight, limit);
    if (ret) *ret = int_ret;
 #else
    (void)string;
@@ -1810,9 +1936,9 @@ _text_matches_unmark_all(Eo *obj, void *_pd EINA_U
    if (ret) *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret = EINA_FALSE;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_text_matches_unmark_all(wd->resize_obj);
+   int_ret = ewk_view_text_matches_unmark_all(sd->content);
    if (ret) *ret = int_ret;
 #else
    (void)obj;
@@ -1838,10 +1964,9 @@ _text_matches_highlight_set(Eo *obj, void *_pd EIN
 
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_text_matches_highlight_set
-            (wd->resize_obj, highlight);
+   int_ret = ewk_view_text_matches_highlight_set(sd->content, highlight);
    if (ret) *ret = int_ret;
 #else
    (void)obj;
@@ -1865,9 +1990,9 @@ _text_matches_highlight_get(Eo *obj, void *_pd EIN
    if (ret) *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret = EINA_FALSE;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_text_matches_highlight_get(wd->resize_obj);
+   int_ret = ewk_view_text_matches_highlight_get(sd->content);
    if (ret) *ret = int_ret;
 #else
    (void)obj;
@@ -1889,9 +2014,9 @@ _load_progress_get(Eo *obj, void *_pd EINA_UNUSED,
    double *ret = va_arg(*list, double *);
    *ret = -1.0;
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   *ret = ewk_view_load_progress_get(wd->resize_obj);
+   *ret = ewk_view_load_progress_get(sd->content);
 #else
    (void)obj;
 #endif
@@ -1913,9 +2038,9 @@ _stop(Eo *obj, void *_pd EINA_UNUSED, va_list *lis
    if (ret) *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_stop(wd->resize_obj);
+   int_ret = ewk_view_stop(sd->content);
    if (ret) *ret = int_ret;
 #else
    (void)obj;
@@ -1938,9 +2063,9 @@ _reload(Eo *obj, void *_pd EINA_UNUSED, va_list *l
    if (ret) *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_reload(wd->resize_obj);
+   int_ret = ewk_view_reload(sd->content);
    if (ret) *ret = int_ret;
 #else
    (void)obj;
@@ -1963,9 +2088,9 @@ _reload_full(Eo *obj, void *_pd EINA_UNUSED, va_li
    if (ret) *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_reload_full(wd->resize_obj);
+   int_ret = ewk_view_reload_full(sd->content);
    if (ret) *ret = int_ret;
 #else
    (void)obj;
@@ -1988,9 +2113,9 @@ _back(Eo *obj, void *_pd EINA_UNUSED, va_list *lis
    if (ret) *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_back(wd->resize_obj);
+   int_ret = ewk_view_back(sd->content);
    if (ret) *ret = int_ret;
 #else
    (void)obj;
@@ -2013,9 +2138,9 @@ _forward(Eo *obj, void *_pd EINA_UNUSED, va_list *
    if (ret) *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_forward(wd->resize_obj);
+   int_ret = ewk_view_forward(sd->content);
    if (ret) *ret = int_ret;
 #else
    (void)obj;
@@ -2041,9 +2166,9 @@ _navigate(Eo *obj, void *_pd EINA_UNUSED, va_list
 
 #ifdef HAVE_ELEMENTARY_WEB
    Eina_Bool int_ret;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   int_ret = ewk_view_navigate(wd->resize_obj, steps);
+   int_ret = ewk_view_navigate(sd->content, steps);
    if (ret) *ret = int_ret;
 #else
    (void)steps;
@@ -2072,9 +2197,9 @@ _back_possible_get(Eo *obj, void *_pd EINA_UNUSED,
    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
    *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   *ret = ewk_view_back_possible(wd->resize_obj);
+   *ret = ewk_view_back_possible(sd->content);
 #else
    (void)obj;
 #endif
@@ -2095,9 +2220,9 @@ _forward_possible_get(Eo *obj, void *_pd EINA_UNUS
    Eina_Bool *ret = va_arg(*list, Eina_Bool *);
    *ret = EINA_FALSE;
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   *ret = ewk_view_forward_possible(wd->resize_obj);
+   *ret = ewk_view_forward_possible(sd->content);
 #else
    (void)obj;
 #endif
@@ -2121,9 +2246,9 @@ _navigate_possible_get(Eo *obj, void *_pd EINA_UNU
    *ret = EINA_FALSE;
 
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   *ret = ewk_view_navigate_possible(wd->resize_obj, steps);
+   *ret = ewk_view_navigate_possible(sd->content, steps);
 #else
    (void)steps;
    (void)obj;
@@ -2146,9 +2271,9 @@ _history_enabled_get(Eo *obj, void *_pd EINA_UNUSE
    *ret = EINA_FALSE;
 
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   *ret = ewk_view_history_enable_get(wd->resize_obj);
+   *ret = ewk_view_history_enable_get(sd->content);
 #else
    (void)obj;
 #endif
@@ -2167,9 +2292,9 @@ _history_enabled_set(Eo *obj, void *_pd EINA_UNUSE
 {
    Eina_Bool enable = va_arg(*list, int);
 #ifdef HAVE_ELEMENTARY_WEB
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
+   ELM_WEB_DATA_GET(obj, sd);
 
-   ewk_view_history_enable_set(wd->resize_obj, enable);
+   ewk_view_history_enable_set(sd->content, enable);
 #else
    (void)enable;
    (void)obj;
@@ -2193,13 +2318,11 @@ _zoom_set(Eo *obj, void *_pd, va_list *list)
 
 #ifdef HAVE_ELEMENTARY_WEB
    Elm_Web_Smart_Data *sd = _pd;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
 
    int vw, vh, cx, cy;
    float z = 1.0;
 
-   evas_object_geometry_get
-     (wd->resize_obj, NULL, NULL, &vw, &vh);
+   evas_object_geometry_get(sd->content, NULL, NULL, &vw, &vh);
    cx = vw / 2;
    cy = vh / 2;
    if (zoom > sd->zoom.max) zoom = sd->zoom.max;
@@ -2211,8 +2334,7 @@ _zoom_set(Eo *obj, void *_pd, va_list *list)
    if (sd->zoom.mode == ELM_WEB_ZOOM_MODE_MANUAL) z = zoom;
    else if (sd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FIT)
      {
-        Evas_Object *frame =
-          ewk_view_frame_main_get(wd->resize_obj);
+        Evas_Object *frame = ewk_view_frame_main_get(sd->content);
         Evas_Coord fw, fh, pw, ph;
 
         if (!ewk_frame_contents_size_get(frame, &fw, &fh)) return;
@@ -2237,8 +2359,7 @@ _zoom_set(Eo *obj, void *_pd, va_list *list)
      }
    else if (sd->zoom.mode == ELM_WEB_ZOOM_MODE_AUTO_FILL)
      {
-        Evas_Object *frame =
-          ewk_view_frame_main_get(wd->resize_obj);
+        Evas_Object *frame = ewk_view_frame_main_get(sd->content);
         Evas_Coord fw, fh, pw, ph;
 
         if (!ewk_frame_contents_size_get(frame, &fw, &fh)) return;
@@ -2262,11 +2383,10 @@ _zoom_set(Eo *obj, void *_pd, va_list *list)
           }
      }
    if (sd->zoom.no_anim)
-     ewk_view_zoom_set(wd->resize_obj, z, cx, cy);
+     ewk_view_zoom_set(sd->content, z, cx, cy);
    else
      ewk_view_zoom_animated_set
-       (wd->resize_obj, z,
-       _elm_config->zoom_friction, cx, cy);
+       (sd->content, z, _elm_config->zoom_friction, cx, cy);
    sd->zoom.no_anim = EINA_FALSE;
 #else
    (void)obj;
@@ -2378,10 +2498,8 @@ _region_show(Eo *obj, void *_pd, va_list *list)
 
 #ifdef HAVE_ELEMENTARY_WEB
    Elm_Web_Smart_Data *sd = _pd;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
 
-   Evas_Object *frame =
-     ewk_view_frame_main_get(wd->resize_obj);
+   Evas_Object *frame = ewk_view_frame_main_get(sd->content);
    int fw, fh, zw, zh, rx, ry;
    float zoom;
 
@@ -2428,10 +2546,8 @@ _region_bring_in(Eo *obj, void *_pd, va_list *list
 
 #ifdef HAVE_ELEMENTARY_WEB
    Elm_Web_Smart_Data *sd = _pd;
-   Elm_Widget_Smart_Data *wd = eo_data_get(obj, ELM_OBJ_WIDGET_CLASS);
 
-   Evas_Object *frame =
-     ewk_view_frame_main_get(wd->resize_obj);
+   Evas_Object *frame = ewk_view_frame_main_get(sd->content);
    int fw, fh, zw, zh, rx, ry, sx, sy;
    float zoom;
 
@@ -2631,6 +2747,8 @@ _class_constructor(Eo_Class *klass)
 
         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_ADD), _elm_web_smart_add),
         EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_DEL), _elm_web_smart_del),
+        EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_RESIZE), _elm_web_smart_resize),
+        EO_OP_FUNC(EVAS_OBJ_SMART_ID(EVAS_OBJ_SMART_SUB_ID_MOVE), _elm_web_smart_move),
 
         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_THEME), _elm_web_smart_theme),
         EO_OP_FUNC(ELM_WIDGET_ID(ELM_WIDGET_SUB_ID_ON_FOCUS), _elm_web_smart_on_focus),
@@ -2743,5 +2861,5 @@ static const Eo_Class_Description class_desc = {
      NULL
 };
 
-EO_DEFINE_CLASS(elm_obj_web_class_get, &class_desc, ELM_OBJ_WIDGET_CLASS, NULL);
+EO_DEFINE_CLASS(elm_obj_web_class_get, &class_desc, ELM_OBJ_LAYOUT_CLASS, ELM_SCROLLABLE_INTERFACE, NULL);
 #endif
Index: src/lib/elm_web.h
===================================================================
--- src/lib/elm_web.h	(리비전 79836)
+++ src/lib/elm_web.h	(작업 사본)
@@ -84,6 +84,10 @@
  * - @ref web_example_02
  */
 
+#define ELM_OBJ_WEB_PAN_CLASS elm_obj_web_pan_class_get()
+
+const Eo_Class *elm_obj_web_pan_class_get(void) EINA_CONST;
+
 #define ELM_OBJ_WEB_CLASS elm_obj_web_class_get()
 
 const Eo_Class *elm_obj_web_class_get(void) EINA_CONST;
Index: data/themes/default-desktop.edc
===================================================================
--- data/themes/default-desktop.edc	(리비전 79836)
+++ data/themes/default-desktop.edc	(작업 사본)
@@ -760,6 +760,7 @@ collections {
         alias: "elm/list/base/default";
         alias: "elm/genlist/base/default";
         alias: "elm/gengrid/base/default";
+        alias: "elm/web/base/default";
 
         data {
             item: "focus_highlight" "on";
Index: data/themes/widgets/scroller.edc
===================================================================
--- data/themes/widgets/scroller.edc	(리비전 79836)
+++ data/themes/widgets/scroller.edc	(작업 사본)
@@ -5,6 +5,7 @@ group { name: "elm/scroller/base/default";
    alias: "elm/gengrid/base/default";
    alias: "elm/scroller/base/map_bubble";
    alias: "elm/genscroller/base/default";
+   alias: "elm/web/base/default";
 
    data {
       item: "focus_highlight" "on";
