Suppress build warning message
[platform/upstream/elementary.git] / src / lib / elm_widget.c
index 8d163ae..ab47a74 100644 (file)
@@ -37,6 +37,11 @@ const char SIG_WIDGET_UNFOCUSED[] = "unfocused";
 const char SIG_WIDGET_LANG_CHANGED[] = "language,changed";
 const char SIG_WIDGET_ACCESS_CHANGED[] = "access,changed";
 
+// TIZEN_ONLY(20161018): add highlighted/unhighlighted signal for atspi
+const char SIG_WIDGET_ATSPI_HIGHLIGHTED[] = "atspi,highlighted";
+const char SIG_WIDGET_ATSPI_UNHIGHLIGHTED[] = "atspi,unhighlighted";
+//
+
 typedef struct _Elm_Event_Cb_Data         Elm_Event_Cb_Data;
 typedef struct _Elm_Label_Data            Elm_Label_Data;
 typedef struct _Elm_Translate_String_Data Elm_Translate_String_Data;
@@ -276,7 +281,7 @@ _on_sub_obj_del(void *data,
                 const Eo_Event_Description *desc EINA_UNUSED,
                 void *event_info EINA_UNUSED)
 {
-   ELM_WIDGET_DATA_GET(data, sd);
+   ELM_WIDGET_DATA_GET_OR_RETURN(data, sd, EINA_FALSE);
 
    if (_elm_widget_is(obj))
      {
@@ -306,6 +311,10 @@ static const Evas_Smart_Cb_Description _smart_callbacks[] =
    {SIG_WIDGET_UNFOCUSED, ""},
    {SIG_WIDGET_LANG_CHANGED, ""},
    {SIG_WIDGET_ACCESS_CHANGED, ""},
+   // TIZEN_ONLY(20161018): add highlighted/unhighlighted signal for atspi
+   {SIG_WIDGET_ATSPI_HIGHLIGHTED, ""},
+   {SIG_WIDGET_ATSPI_UNHIGHLIGHTED, ""},
+   //
    {NULL, NULL}
 };
 
@@ -508,6 +517,7 @@ _elm_widget_evas_object_smart_del(Eo *obj, Elm_Widget_Smart_Data *sd)
    _if_focused_revert(obj, EINA_TRUE);
    elm_widget_focus_custom_chain_unset(obj);
    eina_stringshare_del(sd->access_info);
+   eina_stringshare_del(sd->accessible_name);
    evas_object_smart_data_set(obj, NULL);
 }
 
@@ -550,7 +560,7 @@ _elm_widget_evas_object_smart_show(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUS
    Eina_Iterator *it;
    Evas_Object *o;
 
-   if (_elm_config->atspi_mode)
+   if (_elm_atspi_enabled())
      {
         Eo *parent;
         eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
@@ -565,7 +575,7 @@ _elm_widget_evas_object_smart_show(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUS
      }
    eina_iterator_free(it);
 
-   if (_elm_config->atspi_mode)
+   if (_elm_atspi_enabled())
      {
         elm_interface_atspi_accessible_added(obj);
         if (_elm_widget_onscreen_is(obj))
@@ -587,8 +597,30 @@ _elm_widget_evas_object_smart_hide(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUS
      }
    eina_iterator_free(it);
 
-   if (_elm_config->atspi_mode)
-     elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_SHOWING, EINA_FALSE);
+   if (_elm_atspi_enabled())
+     {
+        //TIZEN_ONLY(20161223) check if the parent of highlighted object is hide
+        Eo *highlighted_obj;
+        highlighted_obj = _elm_object_accessibility_currently_highlighted_get();
+        if (highlighted_obj && highlighted_obj != obj)
+          {
+             Eo *parent;
+             eo_do(highlighted_obj, parent = elm_interface_atspi_accessible_parent_get());
+             while (parent)
+               {
+                  if (parent == obj)
+                    {
+                       elm_interface_atspi_accessible_state_changed_signal_emit(highlighted_obj, ELM_ATSPI_STATE_SHOWING, EINA_FALSE);
+                       eo_do(highlighted_obj, elm_interface_atspi_component_highlight_clear());
+                       break;
+                    }
+                  eo_do(parent, parent = elm_interface_atspi_accessible_parent_get());
+               }
+          }
+        //
+
+        elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_SHOWING, EINA_FALSE);
+     }
 }
 
 EOLIAN static void
@@ -797,7 +829,7 @@ _elm_widget_focus_region_show(const Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNU
              Evas_Coord sx, sy;
              eo_do(o, elm_interface_scrollable_content_region_get(&sx, &sy, NULL, NULL));
 
-             // Get the object's on_focus_region position relative to the scroller. 
+             // Get the object's on_focus_region position relative to the scroller.
              Evas_Coord rx, ry;
              rx = ox + x - px + sx;
              ry = oy + y - py + sy;
@@ -814,11 +846,8 @@ _elm_widget_focus_region_show(const Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNU
                    break;
                }
 
-             if (!elm_widget_focus_region_get(o, &x, &y, &w, &h))
-               {
-                  o = elm_widget_parent_get(o);
-                  continue;
-               }
+             elm_widget_focus_region_get(o, &x, &y, &w, &h);
+             evas_object_geometry_get(o, &ox, &oy, NULL, NULL);
           }
         else
           {
@@ -923,9 +952,10 @@ elm_widget_access(Evas_Object *obj,
 
 //TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
 //register/unregister access objects accordingly.
+// TIZEN_ONLY(20170516): connect to at-spi dbus based on org.a11y.Status.IsEnabled property
 EAPI Eina_Bool
-elm_widget_atspi(Evas_Object *obj,
-                  Eina_Bool is_atspi)
+elm_widget_screen_reader(Evas_Object *obj,
+                  Eina_Bool is_screen_reader)
 {
    const Eina_List *l;
    Evas_Object *child;
@@ -935,7 +965,31 @@ elm_widget_atspi(Evas_Object *obj,
    EINA_LIST_FOREACH(sd->subobjs, l, child)
      {
         if (elm_widget_is(child))
-          ret &= elm_widget_atspi(child, is_atspi);
+          ret &= elm_widget_screen_reader(child, is_screen_reader);
+     }
+   eo_do(obj, elm_obj_widget_screen_reader(is_screen_reader));
+
+   return ret;
+}
+
+EOLIAN static void
+_elm_widget_screen_reader(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool is_screen_reader EINA_UNUSED)
+{
+}
+
+//TIZEN_ONLY(20170621) handle atspi proxy connection at runtime
+EAPI Eina_Bool
+elm_widget_atspi(Evas_Object *obj, Eina_Bool is_atspi)
+{
+   Eina_List *l, *children;
+   Evas_Object *child;
+   Eina_Bool ret = EINA_TRUE;
+
+   API_ENTRY return EINA_FALSE;
+   eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+   EINA_LIST_FOREACH(children, l, child)
+     {
+        ret &= elm_widget_atspi(child, is_atspi);
      }
    eo_do(obj, elm_obj_widget_atspi(is_atspi));
 
@@ -947,6 +1001,8 @@ _elm_widget_atspi(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, E
 {
 }
 //
+//
+//
 
 EOLIAN static void
 _elm_widget_access(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool is_access EINA_UNUSED)
@@ -1260,7 +1316,7 @@ _elm_widget_sub_object_add(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *sobj
 
         elm_widget_display_mode_set(sobj,
               evas_object_size_hint_display_mode_get(obj));
-        if (_elm_config->atspi_mode && !sdc->on_create)
+        if (_elm_atspi_enabled() && !sdc->on_create)
           {
              Elm_Interface_Atspi_Accessible *aparent;
              eo_do(sobj, aparent = elm_interface_atspi_accessible_parent_get());
@@ -1274,6 +1330,7 @@ _elm_widget_sub_object_add(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *sobj
           {
              sdc->paragraph_direction = evas_object_paragraph_direction_get(obj);
              _elm_widget_evas_object_paragraph_direction_set_internal(sobj, sdc, sdc->paragraph_direction);
+             eo_do_super(sobj, MY_CLASS, evas_obj_paragraph_direction_set(sdc->paragraph_direction));
           }
         /* END */
      }
@@ -1347,7 +1404,7 @@ _elm_widget_sub_object_del(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *sobj
                   parent = sdp->parent_obj;
                }
           }
-        if (_elm_config->atspi_mode && !sd->on_destroy)
+        if (_elm_atspi_enabled() && !sd->on_destroy)
           {
              Elm_Interface_Atspi_Accessible *aparent;
              eo_do(sobj, aparent = elm_interface_atspi_accessible_parent_get());
@@ -1364,6 +1421,7 @@ _elm_widget_sub_object_del(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *sobj
           {
              sdc->paragraph_direction = EVAS_BIDI_DIRECTION_NEUTRAL;
              _elm_widget_evas_object_paragraph_direction_set_internal(sobj, sdc, sdc->paragraph_direction);
+             eo_do_super(sobj, MY_CLASS, evas_obj_paragraph_direction_set(EVAS_BIDI_DIRECTION_NEUTRAL));
           }
         /* END */
      }
@@ -3050,7 +3108,7 @@ _elm_widget_focus_steal(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Object_Item *ite
         if (sd)
           {
              if (sd->resize_obj && elm_widget_is(sd->resize_obj) &&
-                   elm_widget_focus_get(sd->resize_obj))
+                   _is_focused(sd->resize_obj))
                {
                   eo_do(sd->resize_obj, elm_obj_widget_focused_object_clear());
                }
@@ -3060,7 +3118,7 @@ _elm_widget_focus_steal(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Object_Item *ite
                   Evas_Object *child;
                   EINA_LIST_FOREACH(sd->subobjs, l, child)
                     {
-                       if (_elm_widget_is(child) && elm_widget_focus_get(child))
+                       if (_elm_widget_is(child) && _is_focused(child))
                          {
                             eo_do(child, elm_obj_widget_focused_object_clear());
                             break;
@@ -3069,7 +3127,14 @@ _elm_widget_focus_steal(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Object_Item *ite
                }
           }
      }
+   /* TIZEN_ONLY(20161212): Some winsets should know whether it's focus target or not in _on_focus */
+   sd = eo_data_scope_get(obj, MY_CLASS);
+   sd->is_focus_target = EINA_TRUE;
+   //
    _parent_focus(obj, item);
+   /* TIZEN_ONLY(20161212): Some winsets should know whether it's focus target or not in _on_focus */
+   sd->is_focus_target = EINA_FALSE;
+   //
    elm_widget_focus_region_show(obj);
    return;
 }
@@ -3212,7 +3277,10 @@ _elm_widget_show_region_set(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Coord x, Ev
    Evas_Coord px, py, cx, cy, nx = 0, ny = 0;
 
 
+   /* TIZEN_ONLY(20161222): Update show region geometry when entry is resized
+      Move this code to the blow to update show region geometry properly.
    evas_smart_objects_calculate(evas_object_evas_get(obj));
+    */
 
    if (!forceshow && (x == sd->rx) && (y == sd->ry) &&
        (w == sd->rw) && (h == sd->rh)) return;
@@ -3221,6 +3289,25 @@ _elm_widget_show_region_set(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Coord x, Ev
    sd->ry = y;
    sd->rw = w;
    sd->rh = h;
+
+   /* TIZEN_ONLY(20161222): Update show region geometry when entry is resized */
+   /* Block nested call for evas_smart_objects_calculate() and region showing works */
+   if (sd->on_show_region_set) return;
+
+   sd->on_show_region_set = EINA_TRUE;
+
+   evas_smart_objects_calculate(evas_object_evas_get(obj));
+
+   sd->on_show_region_set = EINA_FALSE;
+
+   /* show_region geometry could be changed during processing elm_widget_show_region_set().
+      evas_smart_objects_calculate() can trigger nested show_region_set calls */
+   x = sd->rx;
+   y = sd->ry;
+   w = sd->rw;
+   h = sd->rh;
+   /* END */
+
    if (sd->on_show_region)
      {
         sd->on_show_region
@@ -3480,7 +3567,7 @@ elm_widget_scroll_item_align_enabled_get(const Evas_Object *obj)
 
 EAPI void
 elm_widget_scroll_item_valign_set(Evas_Object *obj,
-                                  char *scroll_item_valign)
+                                  const char *scroll_item_valign)
 {
    API_ENTRY return;
    if (sd->scroll_item_valign) eina_stringshare_del(sd->scroll_item_valign);
@@ -3890,6 +3977,38 @@ _elm_widget_style_set(Eo *obj, Elm_Widget_Smart_Data *sd, const char *style)
    return ELM_THEME_APPLY_SUCCESS;
 }
 
+/* TIZEN_ONLY(20161223): add widget style set furnction for internal usage
+                         this function is same with elm_widget_style_set
+                         but it doesn't apply sub object's theme */
+Elm_Theme_Apply
+_elm_widget_style_set_internal(Evas_Object *obj, const char *style)
+{
+   Elm_Theme_Apply ret = ELM_THEME_APPLY_SUCCESS;
+
+   API_ENTRY return ELM_THEME_APPLY_FAILED;
+
+   if (eina_stringshare_replace(&sd->style, style))
+     {
+        const Eina_List *l;
+        Elm_Tooltip *tt;
+        Elm_Cursor *cur;
+
+        if (sd->hover_obj) ret &= elm_widget_theme(sd->hover_obj);
+
+        EINA_LIST_FOREACH(sd->tooltips, l, tt)
+          elm_tooltip_theme(tt);
+        EINA_LIST_FOREACH(sd->cursors, l, cur)
+          elm_cursor_theme(cur);
+
+        Elm_Theme_Apply ret2 = ELM_THEME_APPLY_FAILED;
+        eo_do(obj, ret2 = elm_obj_widget_theme_apply());
+        ret &= ret2;
+     }
+
+   return ret;
+}
+/* END */
+
 EOLIAN static const char*
 _elm_widget_style_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
 {
@@ -4663,6 +4782,7 @@ _elm_widget_item_eo_base_destructor(Eo *eo_item, Elm_Widget_Item_Data *item)
    evas_object_del(item->view);
 
    eina_stringshare_del(item->access_info);
+   eina_stringshare_del(item->accessible_name);
 
    while (item->signals)
      _elm_widget_item_signal_callback_list_get(item, item->signals);
@@ -4683,8 +4803,19 @@ _elm_widget_item_eo_base_destructor(Eo *eo_item, Elm_Widget_Item_Data *item)
    eo_do(eo_item,
          elm_interface_atspi_accessible_description_set(NULL),
          elm_interface_atspi_accessible_name_set(NULL),
+         //TIZEN_ONLY(20190922): add name callback, description callback.
+         elm_interface_atspi_accessible_description_cb_set(NULL, NULL),
+         elm_interface_atspi_accessible_name_cb_set(NULL, NULL),
+         //
+
+         //TIZEN_ONLY(20170405) Add gesture method to accessible interface
+         elm_interface_atspi_accessible_gesture_cb_set(NULL, NULL),
+         //
          elm_interface_atspi_accessible_translation_domain_set(NULL),
-         elm_interface_atspi_accessible_relationships_clear()
+         elm_interface_atspi_accessible_relationships_clear(),
+                // TIZEN_ONLY(20160930) : endless recursion fix
+         elm_interface_atspi_accessible_attributes_clear()
+                //
          );
 
    if (item->name)
@@ -4710,6 +4841,11 @@ _elm_widget_item_eo_base_destructor(Eo *eo_item, Elm_Widget_Item_Data *item)
    }
    //
 
+//TIZEN_ONLY(20161013): clean up elm color class feature
+   if (item->color_classes)
+     ELM_SAFE_FREE(item->color_classes, eina_hash_free);
+//
+
    EINA_MAGIC_SET(item, EINA_MAGIC_NONE);
 
    eo_do_super(eo_item, ELM_WIDGET_ITEM_CLASS, eo_destructor());
@@ -4887,6 +5023,130 @@ _elm_widget_item_onscreen_is(Elm_Object_Item *item)
    return EINA_TRUE;
 }
 
+const char*
+_elm_widget_accessible_plain_name_get(Evas_Object *obj, const char* name)
+{
+   char *accessible_plain_name;
+
+   API_ENTRY return NULL;
+
+   accessible_plain_name = _elm_util_mkup_to_text(name);
+   eina_stringshare_del(sd->accessible_name);
+   sd->accessible_name =  eina_stringshare_add(accessible_plain_name);
+   free(accessible_plain_name);
+   return sd->accessible_name;
+}
+
+const char*
+_elm_widget_item_accessible_plain_name_get(Elm_Object_Item *item, const char* name)
+{
+   char *accessible_plain_name;
+
+   Elm_Widget_Item_Data *id = eo_data_scope_get(item, ELM_WIDGET_ITEM_CLASS);
+   if (!id) return NULL;
+
+   accessible_plain_name = _elm_util_mkup_to_text(name);
+   eina_stringshare_del(id->accessible_name);
+   id->accessible_name =  eina_stringshare_add(accessible_plain_name);
+   free(accessible_plain_name);
+   return id->accessible_name;
+}
+
+//TIZEN_ONLY(20160929) : atspi: Improves how to find the can_highlight of the widget
+static Eina_Bool
+_elm_widget_can_highlight_get_by_class(Eo *obj)
+{
+   if (eo_isa(obj, ELM_WIDGET_ITEM_CLASS))
+     {
+        Elm_Widget_Item_Data *id = eo_data_scope_get(obj, ELM_WIDGET_ITEM_CLASS);
+        if (!id) return EINA_FALSE;
+        if (!id->can_highlight) return EINA_FALSE;
+     }
+   else
+     {
+        Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
+        if (!wd) return EINA_FALSE;
+        if (!wd->can_highlight) return EINA_FALSE;
+     }
+   return EINA_TRUE;
+}
+//
+
+//TIZEN_ONLY(20161107): enhance elm_atspi_accessible_can_highlight_set to set can_hihglight property to its children
+EAPI Eina_Bool
+_elm_widget_item_highlightable(Elm_Object_Item *item)
+{
+   Eo *parent;
+
+   Elm_Widget_Item_Data *id = eo_data_scope_get(item, ELM_WIDGET_ITEM_CLASS);
+   if (!id) return EINA_FALSE;
+   if (!id->can_highlight) return EINA_FALSE;
+
+   eo_do(item, parent = elm_interface_atspi_accessible_parent_get());
+   while (parent && !eo_isa(parent, ELM_ATSPI_APP_OBJECT_CLASS))
+     {
+        //TIZEN_ONLY(20160929) : atspi: Improves how to find the can_highlight of the widget
+        if (!_elm_widget_can_highlight_get_by_class(parent)) return EINA_FALSE;
+        //
+        eo_do(parent, parent = elm_interface_atspi_accessible_parent_get());
+     }
+   return EINA_TRUE;
+}
+//
+
+//TIZEN_ONLY(20170206): Add check the object is in the scroller content size
+Eina_Bool
+_accessible_object_on_scroll_is(Eo* obj)
+{
+   /* in case of genlist item, the item->view is NULL if item is unrealized.
+      this function is used to check if obj could have HIGHLIGHTABLE or not.
+      the unrealized genlist item should have HIGHLIGHTABLE state.
+      so if obj is NULL return EINA_TRUE */
+   if(!obj) return EINA_TRUE;
+
+   Evas_Object *target = obj;
+   Evas_Object *parent = NULL;
+   Evas_Coord x, y, w, h, wx, wy, ww = 0, wh = 0, nx = 0, ny = 0;
+
+   evas_object_geometry_get(target, &x, &y ,&w, &h);
+
+   if (elm_widget_is(target))
+     parent = elm_widget_parent_get(target);
+   else
+     parent = elm_widget_parent_widget_get(target);
+
+   while (parent)
+     {
+        if (eo_isa(parent, ELM_INTERFACE_SCROLLABLE_MIXIN))
+          {
+             evas_object_geometry_get(parent, &wx, &wy, NULL, NULL);
+             eo_do(parent, elm_interface_scrollable_content_size_get(&ww, &wh));
+             eo_do(parent, elm_interface_scrollable_content_pos_get(&nx, &ny));
+
+             /* widget implements scrollable interface but does not use scoller
+                in this case, use widget geometry */
+             if (ww == 0 || wh == 0)
+               {
+                  INF("%s is zero sized scrollable content", eo_class_name_get(eo_class_get(parent)));
+                  evas_object_geometry_get(parent, NULL, NULL, &ww, &wh);
+               }
+
+             wx -= nx;
+             wy -= ny;
+
+             if (((wx < x) && (wx + ww < x)) || ((wx > x + w) && (wx + ww > x + w)) ||
+                 ((wy < y) && (wy + wh < y)) || ((wy > y + h) && (wy + wh > y + h)))
+               return EINA_FALSE;
+
+             break;
+          }
+        parent = elm_widget_parent_get(parent);
+     }
+
+   return EINA_TRUE;
+}
+//
+
 EOLIAN static Elm_Atspi_State_Set
 _elm_widget_item_elm_interface_atspi_accessible_state_set_get(Eo *eo_item,
                                                               Elm_Widget_Item_Data *item)
@@ -4901,18 +5161,24 @@ _elm_widget_item_elm_interface_atspi_accessible_state_set_get(Eo *eo_item,
      {
         STATE_TYPE_SET(states, ELM_ATSPI_STATE_ENABLED);
         STATE_TYPE_SET(states, ELM_ATSPI_STATE_SENSITIVE);
-        STATE_TYPE_SET(states, ELM_ATSPI_STATE_VISIBLE);
      }
    if (_elm_widget_item_onscreen_is(eo_item))
      STATE_TYPE_SET(states, ELM_ATSPI_STATE_SHOWING);
 
+   //TIZEN_ONLY(20170207) : [ATSPI] enhance expose highlight information on atspi
+   /* unrealized genlist item does not have item->view,
+      and item cannot change its visibility, only widget can change the visibility */
+   if (evas_object_visible_get(item->widget))
+     STATE_TYPE_SET(states, ELM_ATSPI_STATE_VISIBLE);
+   //
+
    //TIZEN_ONLY(20170717) : expose highlight information on atspi
-   if (item->can_highlight)
+   if (_elm_widget_item_highlightable(eo_item) && _accessible_object_on_scroll_is(item->view))
      STATE_TYPE_SET(states, ELM_ATSPI_STATE_HIGHLIGHTABLE);
    else
      STATE_TYPE_UNSET(states, ELM_ATSPI_STATE_HIGHLIGHTABLE);
 
-   if (_elm_object_accessibility_currently_highlighted_get() == (void*)item->view)
+   if (_elm_object_accessibility_currently_highlighted_get() == (void*)item->eo_obj)
      STATE_TYPE_SET(states, ELM_ATSPI_STATE_HIGHLIGHTED);
    //
    return states;
@@ -5985,6 +6251,16 @@ _elm_widget_eo_base_constructor(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED)
    /* END */
 
    eo_do(obj, elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_UNKNOWN));
+
+   /* TIZEN_ONLY(20161117): Inherit paragraph direction from widget parent */
+   if (sd->paragraph_direction != evas_object_paragraph_direction_get(parent))
+     {
+        sd->paragraph_direction = evas_object_paragraph_direction_get(parent);
+        _elm_widget_evas_object_paragraph_direction_set_internal(obj, sd, sd->paragraph_direction);
+        eo_do_super(obj, MY_CLASS, evas_obj_paragraph_direction_set(sd->paragraph_direction));
+     }
+   /* END */
+
    return obj;
 }
 
@@ -5995,8 +6271,18 @@ _elm_widget_eo_base_destructor(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED)
    eo_do(obj,
          elm_interface_atspi_accessible_description_set(NULL),
          elm_interface_atspi_accessible_name_set(NULL),
+         //TIZEN_ONLY(20190922): add name callback, description callback.
+         elm_interface_atspi_accessible_description_cb_set(NULL, NULL),
+         elm_interface_atspi_accessible_name_cb_set(NULL, NULL),
+         //
+         //TIZEN_ONLY(20170405) Add gesture method to accessible interface
+         elm_interface_atspi_accessible_gesture_cb_set(NULL, NULL),
+         //
          elm_interface_atspi_accessible_translation_domain_set(NULL),
-         elm_interface_atspi_accessible_relationships_clear()
+         elm_interface_atspi_accessible_relationships_clear(),
+         // TIZEN_ONLY(20160930) : endless recursion fix
+         elm_interface_atspi_accessible_attributes_clear()
+         //
          );
    // TIZEN_ONLY(20150709) : atspi relations api
    if (sd->atspi_custom_relations)
@@ -6023,6 +6309,7 @@ _elm_widget_eo_base_destructor(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED)
        }
    }
    //
+
    eo_do_super(obj, ELM_WIDGET_CLASS, eo_destructor());
    sd->on_destroy = EINA_FALSE;
 
@@ -6040,7 +6327,7 @@ _elm_widget_on_focus(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Object_Item *item E
                evas_object_focus_set(obj, EINA_TRUE);
               eo_do(obj, eo_event_callback_call
                (ELM_WIDGET_EVENT_FOCUSED, NULL));
-             if (_elm_config->atspi_mode && !elm_widget_child_can_focus_get(obj))
+             if (_elm_atspi_enabled() && !elm_widget_child_can_focus_get(obj))
                elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_FOCUSED, EINA_TRUE);
           }
         else
@@ -6049,7 +6336,7 @@ _elm_widget_on_focus(Eo *obj, Elm_Widget_Smart_Data *sd, Elm_Object_Item *item E
                evas_object_focus_set(obj, EINA_FALSE);
              eo_do(obj, eo_event_callback_call
                (ELM_WIDGET_EVENT_UNFOCUSED, NULL));
-             if (_elm_config->atspi_mode && !elm_widget_child_can_focus_get(obj))
+             if (_elm_atspi_enabled() && !elm_widget_child_can_focus_get(obj))
                elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_FOCUSED, EINA_FALSE);
     }
      }
@@ -6115,51 +6402,295 @@ _elm_widget_elm_interface_atspi_component_focus_grab(Eo *obj, Elm_Widget_Smart_D
    return EINA_FALSE;
 }
 
+//TIZEN_ONLY(20170119): Show the object highlighted by highlight_grab when the object is completely out of the scroll
+void
+_elm_widget_showing_geometry_get(Eo *obj, int *x, int *y, int *w, int *h)
+{
+   Evas_Object *parent;
+   Evas_Coord px, py, sx, sy, sw, sh;
+
+   *x = 0;
+   *y = 0;
+   *w = 0;
+   *h = 0;
+
+   if (!obj) return;
+
+   evas_object_geometry_get(obj, x, y, w, h);
+
+   if (elm_widget_is(obj))
+     parent = elm_widget_parent_get(obj);
+   else
+     parent = elm_widget_parent_widget_get(obj);
+
+   while (parent)
+     {
+        if (eo_isa(parent, ELM_INTERFACE_SCROLLABLE_MIXIN))
+          {
+             evas_object_geometry_get(parent, &sx, &sy, &sw, &sh);
+             px = *x;
+             py = *y;
+             *x = *x > sx ? *x : sx;
+             *y = *y > sy ? *y : sy;
+             *w = px + *w < sx + sw ? px + *w - *x : sx + sw - *x;
+             *h = py + *h < sy + sh ? py + *h - *y : sy + sh - *y;
+          }
+        parent = elm_widget_parent_get(parent);
+     }
+}
+
+Eina_Bool
+_accessible_object_on_screen_is(Eo *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Eina_Bool is_complete)
+{
+   if(!obj) return EINA_FALSE;
+
+   Evas_Object *target = obj;
+   Evas_Object *parent = NULL;
+   Evas_Coord px, py, sx, sy, sw, sh, ox, oy, ow, oh;
+
+   /* uninitialized data could be read */
+   ow = 0;
+   oh = 0;
+
+   if (elm_widget_is(target))
+     parent = elm_widget_parent_get(target);
+   else
+     parent = elm_widget_parent_widget_get(target);
+
+   while (parent)
+     {
+        if (eo_isa(parent, ELM_INTERFACE_SCROLLABLE_MIXIN))
+          {
+             evas_object_geometry_get(parent, &sx, &sy, &sw, &sh);
+             px = ox = x;
+             py = oy = y;
+             ow = w;
+             oh = h;
+             ox = is_complete ? ox : ox + ow;
+             oy = is_complete ? oy : oy + oh;
+             ox = ox > sx ? ox : sx;
+             oy = oy > sy ? oy : sy;
+             ow = px + ow < sx + sw ? px + ow - ox : sx + sw - ox;
+             oh = py + oh < sy + sh ? py + oh - oy : sy + sh - oy;
+          }
+        if (ow <= 0 || oh <= 0)
+          return EINA_FALSE;
+
+        parent = elm_widget_parent_get(parent);
+     }
+   return EINA_TRUE;
+}
+
+Eina_List *
+_accessible_scrollable_parent_list_get(Eo *obj)
+{
+   if(!obj) return NULL;
+
+   Evas_Object *parent = NULL;
+   Eina_List *plist = NULL;
+
+   if (elm_widget_is(obj))
+     parent = elm_widget_parent_get(obj);
+   else
+     parent = elm_widget_parent_widget_get(obj);
+
+   while (parent)
+     {
+        if (_elm_scrollable_is(parent))
+          plist = eina_list_append(plist, parent);
+
+        parent = elm_widget_parent_get(parent);
+   }
+   return plist;
+}
+
+void
+_accessible_highlight_region_show(Eo* obj)
+{
+   if (!obj) return;
+
+   Evas_Object *target = obj;
+   Evas_Object *parent = NULL;
+   Evas_Object *parent_sub = NULL;
+   Eina_List *plist, *plist_sub;
+   Eina_List *l, *l2;
+
+   Evas_Coord target_x, target_y, target_w, target_h;
+
+   evas_object_geometry_get(target, &target_x, &target_y, &target_w, &target_h);
+
+   plist = _accessible_scrollable_parent_list_get(target);
+   if (!plist) return;
+
+   EINA_LIST_FOREACH(plist, l, parent)
+     {
+        if(!_accessible_object_on_screen_is(target, target_x, target_y, target_w, target_h, EINA_TRUE))
+          {
+             plist_sub = _accessible_scrollable_parent_list_get(parent);
+             plist_sub = eina_list_prepend(plist_sub, parent);
+             EINA_LIST_FOREACH(plist_sub, l2, parent_sub)
+               {
+                  Evas_Coord scroll_x = 0, scroll_y = 0;
+                  Evas_Coord scroll_x_back = 0, scroll_y_back = 0;
+                  Evas_Coord x, y, w, h;
+                  Evas_Coord px, py;
+
+                  eo_do(parent_sub, elm_interface_scrollable_content_region_get(&scroll_x_back, &scroll_y_back, NULL, NULL));
+                  evas_object_geometry_get(parent_sub, &px, &py, NULL, NULL);
+                  x = target_x; y = target_y; w = target_w; h = target_h;
+
+                  x -= (px - scroll_x_back);
+                  y -= (py - scroll_y_back);
+                  switch (_elm_config->focus_autoscroll_mode)
+                    {
+                       case ELM_FOCUS_AUTOSCROLL_MODE_SHOW:
+                          eo_do(parent_sub, elm_interface_scrollable_content_region_show(x, y, w, h));
+                          break;
+                       case ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN:
+                          eo_do(parent_sub, elm_interface_scrollable_region_bring_in(x, y, w, h));
+                          break;
+                       default:
+                          break;
+                    }
+                  eo_do(parent_sub, elm_interface_scrollable_content_region_get(&scroll_x, &scroll_y, NULL, NULL));
+
+                  target_x -= (scroll_x - scroll_x_back);
+                  target_y -= (scroll_y - scroll_y_back);
+
+                  if(_accessible_object_on_screen_is(target, target_x, target_y, target_w, target_h, EINA_FALSE))
+                    break;
+               }
+             eina_list_free(plist_sub);
+          }
+     }
+
+   eina_list_free(plist);
+}
+//
+
+//TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+Eina_Bool
+_elm_widget_accessibility_highlight_grabbing_get(Eo *obj)
+{
+   ELM_WIDGET_DATA_GET(obj, wd);
+   return wd->highlight_grabbing;
+}
+
+void
+_elm_widget_accessibility_highlight_grabbing_set(Eo *obj, Eina_Bool grabbing)
+{
+   ELM_WIDGET_DATA_GET(obj, wd);
+   wd->highlight_grabbing = grabbing;
+}
+//
+
 //TIZEN_ONLY(20160329): atspi: implement HighlightGrab and HighlightClear methods (29e253e2f7ef3c632ac3a64c489bf569df407f30)
 EOLIAN static Eina_Bool
 _elm_widget_elm_interface_atspi_component_highlight_grab(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED)
 {
+   if(!obj) return EINA_FALSE;
+   if(!_elm_atspi_enabled())
+      return EINA_FALSE;
+   // TIZEN_ONLY(20171020) : atspi : Do not send signal, if current object and highlight object are same
+   if (_elm_object_accessibility_currently_highlighted_get() == obj)
+      return EINA_FALSE;
+   //
+
+   //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+   _elm_widget_accessibility_highlight_grabbing_set(obj, EINA_TRUE);
+   //
+
+   //TIZEN_ONLY(20170119): Show the object highlighted by highlight_grab when the object is completely out of the scroll
+   _accessible_highlight_region_show(obj);
+   //
+
    elm_object_accessibility_highlight_set(obj, EINA_TRUE);
    elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_HIGHLIGHTED, EINA_TRUE);
+
+   // TIZEN_ONLY(20161018): add highlighted/unhighlighted signal for atspi
+   evas_object_smart_callback_call(obj, SIG_WIDGET_ATSPI_HIGHLIGHTED, NULL);
+   //
+   //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+   _elm_widget_accessibility_highlight_grabbing_set(obj, EINA_FALSE);
+   //
    return EINA_TRUE;
 }
 
 EOLIAN static Eina_Bool
 _elm_widget_elm_interface_atspi_component_highlight_clear(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED)
 {
+   if(!_elm_atspi_enabled())
+      return EINA_FALSE;
    elm_object_accessibility_highlight_set(obj, EINA_FALSE);
    elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_HIGHLIGHTED, EINA_FALSE);
+
+   // TIZEN_ONLY(20161018): add highlighted/unhighlighted signal for atspi
+   evas_object_smart_callback_call(obj, SIG_WIDGET_ATSPI_UNHIGHLIGHTED, NULL);
+   //
    return EINA_TRUE;
 }
 //
 
-EOLIAN static char*
-_elm_widget_elm_interface_atspi_accessible_name_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
+EOLIAN static const char*
+_elm_widget_elm_interface_atspi_accessible_name_get(Eo *obj, Elm_Widget_Smart_Data *_pd)
 {
-   const char *ret;
+   //TIZEN_ONLY(20190922): add name callback, description callback.
+   const char *ret = NULL;
+   eo_do_super(obj, ELM_WIDGET_CLASS, ret = elm_interface_atspi_accessible_name_get());
+   if (ret) return ret;
+   //
+
    //TIZEN_ONLY(20150717) add widget name setter
    if (_pd->name)
      {
 #ifdef HAVE_GETTEXT
         if (_pd->atspi_translation_domain)
-          return strdup(dgettext(_pd->atspi_translation_domain, _pd->name));
-        else
-          return strdup(_pd->name);
-#else
-        return strdup(_pd->name);
+          return dgettext(_pd->atspi_translation_domain, _pd->name);
 #endif
+        return _pd->name;
      }
    //
 
+   //TIZEN_ONLY(20170110) : Ignore text from elm_object_text_set in accessible_name_get
+   Elm_Atspi_Role role;
+   eo_do(obj, role = elm_interface_atspi_accessible_role_get());
+   if(role == ELM_ATSPI_ROLE_DIALOG)
+     return NULL;
+   //
+
    ret = elm_object_text_get(obj);
    if (!ret) return NULL;
 
-   return _elm_util_mkup_to_text(ret);
+   return _elm_widget_accessible_plain_name_get(obj, ret);
+}
+//TIZEN_ONLY(20161111) add widget/widget_item description get/set
+EOLIAN void
+_elm_widget_elm_interface_atspi_accessible_description_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data* _pd EINA_UNUSED, const char *description)
+{
+   if (_pd->description)
+     eina_stringshare_del(_pd->description);
+
+   _pd->description = eina_stringshare_add(description);
 }
 
+EOLIAN static const char*
+_elm_widget_elm_interface_atspi_accessible_description_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
+{
+   const char *ret = NULL;
+   eo_do_super(obj, ELM_WIDGET_CLASS, ret = elm_interface_atspi_accessible_description_get());
+   if (ret) return ret;
+
+#ifdef HAVE_GETTEXT
+   if (_pd->atspi_translation_domain)
+     return dgettext(_pd->atspi_translation_domain, _pd->description);
+#endif
+   return _pd->description;
+}
+//
+
 //TIZEN_ONLY(20150713) : add atspi name setter to widget_item
 EOLIAN void
-_elm_widget_item_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data* _pd EINA_UNUSED, char *name)
+_elm_widget_item_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data* _pd EINA_UNUSED, const char *name)
 {
    if (_pd->name)
      eina_stringshare_del(_pd->name);
@@ -6167,27 +6698,53 @@ _elm_widget_item_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, El
    _pd->name = eina_stringshare_add(name);
 }
 
-EOLIAN char*
+EOLIAN const char*
 _elm_widget_item_elm_interface_atspi_accessible_name_get(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *_pd EINA_UNUSED)
 {
+   //TIZEN_ONLY(20190922): add name callback, description callback.
+   const char *ret = NULL;
+   eo_do_super(obj, ELM_WIDGET_ITEM_CLASS, ret = elm_interface_atspi_accessible_name_get());
+   if (ret) return ret;
+   //
+
    if (_pd->name)
      {
 #ifdef HAVE_GETTEXT
         if (_pd->atspi_translation_domain)
-          return strdup(dgettext(_pd->atspi_translation_domain, _pd->name));
-        else
-          return strdup(_pd->name);
-#else
-        return strdup(_pd->name);
+          return dgettext(_pd->atspi_translation_domain, _pd->name);
 #endif
+        return _pd->name;
      }
 
    return NULL;
 }
 //
-
-//TIZEN_ONLY(20150709) : spatially sort atspi children
-static int _sort_vertically(const void *data1, const void *data2)
+//TIZEN_ONLY(20161111) add widget/widget_item description get/set
+EOLIAN void
+_elm_widget_item_elm_interface_atspi_accessible_description_set(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data* _pd EINA_UNUSED, const char *description)
+{
+   if (_pd->description)
+     eina_stringshare_del(_pd->description);
+
+   _pd->description = eina_stringshare_add(description);
+}
+
+EOLIAN const char*
+_elm_widget_item_elm_interface_atspi_accessible_description_get(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *_pd EINA_UNUSED)
+{
+   const char *ret = NULL;
+   eo_do_super(obj, ELM_WIDGET_ITEM_CLASS, ret = elm_interface_atspi_accessible_description_get());
+   if (ret) return ret;
+
+#ifdef HAVE_GETTEXT
+   if (_pd->atspi_translation_domain)
+     return dgettext(_pd->atspi_translation_domain, _pd->description);
+#endif
+   return _pd->description;
+}
+//
+//TIZEN_ONLY(20150709) : spatially sort atspi children
+static int _sort_vertically(const void *data1, const void *data2)
 {
    Evas_Coord y1, y2;
    evas_object_geometry_get(data1, NULL, &y1, NULL, NULL);
@@ -6227,7 +6784,7 @@ static Eina_List *_lines_split(Eina_List *children)
         evas_object_geometry_get(c, NULL, &y, NULL, &h);
 
         /* remove child if its height == 0 */
-        if (h == 0) continue;
+        if (h == 0 && !eo_isa(c, ELM_ATSPI_PROXY_CLASS)) continue;
 
         if ((yl + (int)(0.25 * hl)) >= y)
           {
@@ -6247,27 +6804,6 @@ static Eina_List *_lines_split(Eina_List *children)
 }
 //
 
-// TIZEN ONLY
-static void
-_ewk_view_load_finished(Eo *plug,
-                        Evas_Object *obj,
-                        const char *addr)
-{
-   char *bus, *path;
-
-   if (addr && !evas_object_data_get(obj, "__plug_connected"))
-     {
-       if (_elm_atspi_bridge_plug_id_split(addr, &bus, &path))
-         {
-            eo_do(plug, elm_obj_atspi_proxy_address_set(bus, path));
-            elm_atspi_bridge_utils_proxy_connect(plug);
-            evas_object_data_set(obj, "__plug_connected", (void*)1);
-            free(bus);
-            free(path);
-        }
-     }
-}
-
 // TIZEN_ONLY(20160705) - enable atspi_proxy to work
 static void
 _proxy_widget_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
@@ -6308,6 +6844,58 @@ _on_proxy_connected_cb(void *data, Eo *obj, const Eo_Event_Description *desc EIN
 //
 // TIZEN ONLY - END
 
+//TIZEN_ONLY(20170621) handle atspi proxy connection at runtime
+static Eo *
+_plug_type_proxy_get(Eo *obj, Evas_Object *widget)
+{
+   Eo *proxy = NULL;
+   const char *plug_id;
+   char *svcname, *svcnum;
+
+   if ((plug_id = evas_object_data_get(widget, "___PLUGID")) != NULL)
+     {
+        // TIZEN_ONLY(20160930) : endless recursion fix
+        eo_do_super(obj, MY_CLASS, elm_interface_atspi_accessible_attribute_append("___PlugID", plug_id));
+
+        proxy = evas_object_data_get(widget, "__widget_proxy");
+        if (proxy) return proxy;
+
+        if (_elm_atspi_bridge_plug_id_split(plug_id, &svcname, &svcnum))
+          {
+             proxy = _elm_atspi_bridge_utils_proxy_create(obj, svcname, atoi(svcnum), ELM_ATSPI_PROXY_TYPE_PLUG);
+             evas_object_data_set(widget, "__widget_proxy", proxy);
+             eo_do(widget, eo_event_callback_add(EO_EV_DEL, _on_widget_del, proxy));
+             eo_do(proxy, eo_event_callback_add(ELM_ATSPI_PROXY_EVENT_CONNECTED, _on_proxy_connected_cb, widget));
+             elm_atspi_bridge_utils_proxy_connect(proxy);
+             free(svcname);
+             free(svcnum);
+          }
+     }
+
+   return proxy;
+}
+
+EAPI Eo *
+elm_widget_atspi_plug_type_proxy_get(Evas_Object *obj)
+{
+   Elm_Widget_Smart_Data *wd;
+   Evas_Object *widget;
+   Eina_List *l;
+
+   wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
+   if (!wd) return NULL;
+
+   Eo *proxy = NULL;
+   EINA_LIST_FOREACH(wd->subobjs, l, widget)
+     {
+        if (evas_object_data_get(widget, "___PLUGID"))
+           proxy = _plug_type_proxy_get(obj, widget);
+        if (proxy) break;
+     }
+   return proxy;
+}
+//
+
 EOLIAN static Eina_List*
 _elm_widget_elm_interface_atspi_accessible_children_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED)
 {
@@ -6323,59 +6911,34 @@ _elm_widget_elm_interface_atspi_accessible_children_get(Eo *obj, Elm_Widget_Smar
 
    EINA_LIST_FOREACH(wd->subobjs, l, widget)
      {
-        // TIZEN_ONLY(20160824): Do not append a child, if its accessible parent is different with widget parent
-        eo_do(widget, parent = elm_interface_atspi_accessible_parent_get());
-        if (parent && (parent != obj)) continue;
-        //
-
+        const char *type = evas_object_type_get(widget);
         // TIZEN ONLY
-        // Ugly Tizen hack to integrate AT-SPI2 accessibility provided by WebKit with
-        // elementary one. Due to problematic cross dependencies between Webkit
-        // and elementary, instead of directly using ewk API to integrate accessibility
-        // we use evas_object_data_set with pre defined key to share data
-        // between webkit and elemetary libraries.
-        const char *plug_id;
-        if ((plug_id = evas_object_data_get(widget, "__PlugID")) != NULL)
-          {
-             Eo *plug = evas_object_data_get(widget, "__ewk_proxy");
-             if (!plug)
-               {
-                  plug = eo_add(ELM_ATSPI_PROXY_CLASS, obj, elm_obj_atspi_proxy_constructor(ELM_ATSPI_PROXY_TYPE_PLUG));
-                  evas_object_data_set(widget, "__ewk_proxy", plug);
-                  eo_do(widget, eo_event_callback_add(EO_EV_DEL, _on_widget_del, plug));
-                  _ewk_view_load_finished(plug, widget, plug_id);
-               }
-             if (plug && evas_object_data_get(widget, "__plug_connected"))
-                accs = eina_list_append(accs, plug);
-             continue;
-          }
+        // Ugly Tizen hack to integrate AT-SPI2 accessibility provided by WebKit/Chromium with elementary one.
+        // This wrapper class should be implemented in Webkit/Chromium EFL ports
+        if (type && (!strcmp(type, "EWebView") || !strcmp(type, "WebView"))) {
+           elm_atspi_ewk_wrapper_a11y_init(obj, widget);
+        }
+     }
+
+   Eo *proxy = NULL;
+   EINA_LIST_FOREACH(wd->subobjs, l, widget)
+     {
+        // TIZEN_ONLY(20160824): Do not append a child, if its accessible parent is different with widget parent
+        if (eo_isa(widget, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN)) {
+           eo_do(widget, parent = elm_interface_atspi_accessible_parent_get());
+           if (parent && (parent != obj)) continue;
+        }
 
         // TIZEN_ONLY(20160705) - enable atspi_proxy to work
-        const char *plug_id_2;
-        if ((plug_id_2 = evas_object_data_get(widget, "___PLUGID")) != NULL)
+        /* This assumes that only one proxy exists in obj */
+        if (!proxy)
           {
-             Eo *proxy;
-             char *svcname, *svcnum;
-
-             proxy = evas_object_data_get(widget, "__widget_proxy");
+             proxy = _plug_type_proxy_get(obj, widget);
              if (proxy)
                {
                   accs = eina_list_append(accs, proxy);
                   continue;
                }
-
-             if (_elm_atspi_bridge_plug_id_split(plug_id_2, &svcname, &svcnum))
-               {
-                  proxy = _elm_atspi_bridge_utils_proxy_create(obj, svcname, atoi(svcnum), ELM_ATSPI_PROXY_TYPE_PLUG);
-                  evas_object_data_set(widget, "__widget_proxy", proxy);
-                  eo_do(widget, eo_event_callback_add(EO_EV_DEL, _on_widget_del, proxy));
-                  eo_do(proxy, eo_event_callback_add(ELM_ATSPI_PROXY_EVENT_CONNECTED,  _on_proxy_connected_cb, widget));
-                  elm_atspi_bridge_utils_proxy_connect(proxy);
-                  accs = eina_list_append(accs, proxy);
-                  free(svcname);
-                  free(svcnum);
-               }
-             continue;
           }
         //
         // TIZEN ONLY - END
@@ -6391,6 +6954,30 @@ _elm_widget_elm_interface_atspi_accessible_children_get(Eo *obj, Elm_Widget_Smar
    EINA_LIST_FREE(lines, line)
      accs = eina_list_merge(accs, eina_list_sort(line, -1, _sort_horizontally));
    //
+
+   if (proxy)
+     {
+        Eo *deputy = NULL;
+        accs = eina_list_remove(accs, proxy);
+        EINA_LIST_FOREACH(accs, l, widget)
+          {
+              if (eo_isa(widget, ELM_ACCESS_CLASS))
+                {
+                   Elm_Access_Info *info = _elm_access_info_get(widget);
+                   if (!info) continue;
+                   if (obj == info->part_object)
+                     {
+                        deputy = widget;
+                        break;
+                     }
+                }
+          }
+
+        if (deputy)
+          {
+             accs = eina_list_append_relative(accs, proxy, deputy);
+          }
+     }
    return accs;
 }
 
@@ -6403,6 +6990,28 @@ _elm_widget_elm_interface_atspi_accessible_parent_get(Eo *obj EINA_UNUSED, Elm_W
    return ret ? ret : pd->parent_obj;
 }
 
+//TIZEN_ONLY(20161107): enhance elm_atspi_accessible_can_highlight_set to set can_hihglight property to its children
+EAPI Eina_Bool
+_elm_widget_highlightable(Evas_Object *obj)
+{
+   Eo *parent;
+
+   Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
+   if (!wd) return EINA_FALSE;
+   if (!wd->can_highlight) return EINA_FALSE;
+
+   eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
+   while (parent && !eo_isa(parent, ELM_ATSPI_APP_OBJECT_CLASS))
+     {
+        //TIZEN_ONLY(20160929) : atspi: Improves how to find the can_highlight of the widget
+        if (!_elm_widget_can_highlight_get_by_class(parent)) return EINA_FALSE;
+        //
+        eo_do(parent, parent = elm_interface_atspi_accessible_parent_get());
+     }
+   return EINA_TRUE;
+}
+//
+
 EOLIAN static Elm_Atspi_State_Set
 _elm_widget_elm_interface_atspi_accessible_state_set_get(Eo *obj, Elm_Widget_Smart_Data *pd)
 {
@@ -6430,7 +7039,7 @@ _elm_widget_elm_interface_atspi_accessible_state_set_get(Eo *obj, Elm_Widget_Sma
      }
 
    //TIZEN_ONLY(20170717) : expose highlight information on atspi
-   if (pd->can_highlight)
+   if (_elm_widget_highlightable(obj) && _accessible_object_on_scroll_is(obj))
      STATE_TYPE_SET(states, ELM_ATSPI_STATE_HIGHLIGHTABLE);
    else
      STATE_TYPE_UNSET(states, ELM_ATSPI_STATE_HIGHLIGHTABLE);
@@ -6444,10 +7053,12 @@ _elm_widget_elm_interface_atspi_accessible_state_set_get(Eo *obj, Elm_Widget_Sma
 
 //TIZEN_ONLY(20160729): attributes_get, append APIs added/updated.
 EOLIAN static Eina_List*
-_elm_widget_elm_interface_atspi_accessible_attributes_get(Eo *obj, Elm_Widget_Smart_Data *pd)
+_elm_widget_elm_interface_atspi_accessible_attributes_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED)
 {
    Eina_List *attr_list = NULL;
-   Eina_List *l = NULL;
+   // TIZEN_ONLY(20160930) : endless recursion fix
+   eo_do_super(obj, MY_CLASS, attr_list = elm_interface_atspi_accessible_attributes_get());
+   //
    //Add type and style information in addition.
    Elm_Atspi_Attribute *attr = NULL;
    attr = calloc(1, sizeof(Elm_Atspi_Attribute));
@@ -6466,35 +7077,9 @@ _elm_widget_elm_interface_atspi_accessible_attributes_get(Eo *obj, Elm_Widget_Sm
         attr_list = eina_list_append(attr_list, attr);
      }
 
-   if (pd->attr_list)
-     {
-        Elm_Atspi_Attribute *t_attr = NULL;
-        EINA_LIST_FOREACH(pd->attr_list, l, t_attr)
-          {
-             attr = calloc(1, sizeof(Elm_Atspi_Attribute));
-             if (attr)
-               {
-                  attr->key = eina_stringshare_add(t_attr->key);
-                  attr->value = eina_stringshare_add(t_attr->value);
-                  attr_list = eina_list_append(attr_list, attr);
-               }
-          }
-     }
    return attr_list;
 }
 
-EOLIAN static void
-_elm_widget_elm_interface_atspi_accessible_attribute_append(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd, char* key, char* value)
-{
-   if (!key || !value) return;
-   Elm_Atspi_Attribute *attr = calloc(1, sizeof(Elm_Atspi_Attribute));
-   if (!attr) return;
-   attr->key = eina_stringshare_add(key);
-   attr->value = eina_stringshare_add(value);
-   pd->attr_list = eina_list_append(pd->attr_list, attr);
-}
-//
-
 //TIZEN_ONLY(20150709) : atspi relations api
 EOLIAN static Elm_Atspi_Relation_Set
 _elm_widget_elm_interface_atspi_accessible_relation_set_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
@@ -6507,6 +7092,21 @@ _elm_widget_item_elm_interface_atspi_accessible_relation_set_get(Eo *obj EINA_UN
 {
    return elm_atspi_relation_set_clone(&sd->atspi_custom_relations);
 }
+
+EOLIAN static void
+_elm_widget_elm_interface_atspi_accessible_relationships_clear(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
+{
+   elm_atspi_relation_set_free(&sd->atspi_custom_relations);
+   sd->atspi_custom_relations = NULL;
+}
+//
+
+EOLIAN static void
+_elm_widget_item_elm_interface_atspi_accessible_relationships_clear(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd)
+{
+   elm_atspi_relation_set_free(&sd->atspi_custom_relations);
+   sd->atspi_custom_relations = NULL;
+}
 //
 
 EOLIAN static void
@@ -6556,48 +7156,50 @@ _elm_widget_item_elm_interface_atspi_component_focus_grab(Eo *obj EINA_UNUSED, E
 }
 
 //TIZEN_ONLY(20160329): atspi: implement HighlightGrab and HighlightClear methods
+
 EOLIAN static Eina_Bool
 _elm_widget_item_elm_interface_atspi_component_highlight_grab(Eo *obj, Elm_Widget_Item_Data *sd)
 {
+   if (!sd) return EINA_FALSE;
+   if (!sd->view) return EINA_FALSE;
+   // TIZEN_ONLY(20171020) : atspi : Do not send signal, if current object and highlight object are same
+   if (_elm_object_accessibility_currently_highlighted_get() == obj)
+      return EINA_FALSE;
+   //
 
-   if (!obj) return EINA_FALSE;
+   //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+   _elm_widget_accessibility_highlight_grabbing_set(sd->view, EINA_TRUE);
+   //
 
-   Evas_Object *o = elm_object_parent_widget_get(sd->view);
-   if (_elm_scrollable_is(o))
-     {
-        Evas_Coord bx, by, bw, bh;
-        Evas_Coord x, y, w, h;
-        Evas_Object *w1 = elm_object_parent_widget_get(o);
-        evas_object_geometry_get(sd->view, &x, &y, &w, &h);
-        evas_object_geometry_get(o, &bx, &by, &bw, &bh);
-        x -= bx;
-        y -= by;
-        switch (_elm_config->focus_autoscroll_mode)
-          {
-           case ELM_FOCUS_AUTOSCROLL_MODE_SHOW:
-              eo_do(w1, elm_interface_scrollable_content_region_show(x, y, w, h));
-              break;
-           case ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN:
-              eo_do(w1, elm_interface_scrollable_region_bring_in(x, y, w, h));
-              break;
-           default:
-              break;
-          }
-     }
+   //TIZEN_ONLY(20170119): Show the object highlighted by highlight_grab when the object is completely out of the scroll
+   _accessible_highlight_region_show(sd->view);
+   //
+
+   if (!sd->eo_obj) return EINA_FALSE;
+   elm_object_accessibility_highlight_set(sd->eo_obj, EINA_TRUE);
 
-   elm_object_accessibility_highlight_set(sd->view, EINA_TRUE);
+   if (!obj) return EINA_FALSE;
    elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_HIGHLIGHTED, EINA_TRUE);
 
+   //TIZEN_ONLY(20170412) Make atspi,(un)highlighted work on widget item
+   evas_object_smart_callback_call(sd->widget, SIG_WIDGET_ATSPI_HIGHLIGHTED, obj);
+   //
+   //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+   _elm_widget_accessibility_highlight_grabbing_set(sd->view, EINA_FALSE);
+   //
    return EINA_TRUE;
-
 }
 
 EOLIAN static Eina_Bool
 _elm_widget_item_elm_interface_atspi_component_highlight_clear(Eo *obj, Elm_Widget_Item_Data *sd)
 {
    if (!obj) return EINA_FALSE;
-   elm_object_accessibility_highlight_set(sd->view, EINA_FALSE);
+   elm_object_accessibility_highlight_set(sd->eo_obj, EINA_FALSE);
    elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_HIGHLIGHTED, EINA_FALSE);
+
+   //TIZEN_ONLY(20170412) Make atspi,(un)highlighted work on widget item
+   evas_object_smart_callback_call(sd->widget, SIG_WIDGET_ATSPI_UNHIGHLIGHTED, obj);
+   //
    return EINA_TRUE;
 }
 //
@@ -6614,7 +7216,7 @@ _elm_widget_item_elm_interface_atspi_component_alpha_get(Eo *obj EINA_UNUSED, El
 
 //TIZEN_ONLY(20150717) add widget name setter
 EOLIAN void
-_elm_widget_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data* _pd EINA_UNUSED, char *name)
+_elm_widget_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data* _pd EINA_UNUSED, const char *name)
 {
    if (_pd->name)
      eina_stringshare_del(_pd->name);
@@ -6624,10 +7226,202 @@ _elm_widget_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Wid
 //
 
 //TIZEN_ONLY(20160329): widget: improve accessibile_at_point getter (a8aff0423202b9a55dbb3843205875226678fbd6)
-EOLIAN static Eo *
-_elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool screen_coords, int x, int y)
+static void
+_coordinate_system_based_point_translate(Eo *obj, Eina_Bool screen_coords, int *x, int *y)
+{
+   Ecore_Evas *ee;
+   int ee_x = 0;
+   int ee_y = 0;
+
+   if (screen_coords)
+     {
+        ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
+        if (!ee) return;
+
+        ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL);
+        *x -= ee_x;
+        *y -= ee_y;
+     }
+}
+
+static Evas_Object *
+_parent_get(Evas_Object *obj)
+{
+   Evas_Object *parent;
+
+   parent = evas_object_smart_parent_get(obj);
+   if (!parent)
+     {
+        if (strcmp("Elm_Win", eo_class_name_get(eo_class_get(obj))))
+          parent = elm_widget_parent_get(obj);
+     }
+
+   return parent;
+}
+
+static Eina_Bool
+_is_inside(Evas_Object *obj, int x, int y)
+{
+   Eina_Bool ret = EINA_TRUE;
+   Evas_Coord cx = 0;
+   Evas_Coord cy = 0;
+   Evas_Coord cw = 0;
+   Evas_Coord ch = 0;
+   if (eo_isa(obj, ELM_WIDGET_ITEM_CLASS))
+     {
+        Elm_Widget_Item_Data *id = eo_data_scope_get(obj, ELM_WIDGET_ITEM_CLASS);
+        evas_object_geometry_get(id->view, &cx, &cy, &cw, &ch);
+     }
+   else
+     evas_object_geometry_get(obj, &cx, &cy, &cw, &ch);
+
+   /* check the point is out of bound */
+   if (x < cx || x > cx + cw || y < cy || y > cy + ch)
+     {
+        ret = EINA_FALSE;
+     }
+   return ret;
+}
+
+static Eina_Bool
+_is_ancestor_of(Evas_Object *smart_parent, Evas_Object *obj)
+{
+   Eina_Bool ret = EINA_FALSE;
+   Evas_Object *parent = elm_widget_parent_get(obj);
+   while (parent)
+     {
+        /* No need to check more, the smart_parent is parent of obj */
+        if (smart_parent == parent)
+          {
+             ret = EINA_TRUE;
+             break;
+          }
+        parent = elm_widget_parent_get(parent);
+     }
+
+   return ret;
+}
+
+static int _sort_by_size(const void *data1, const void *data2)
+{
+   Evas_Coord w, h;
+   Evas_Coord w2, h2;
+
+   evas_object_geometry_get(data1, NULL, NULL, &w, &h);
+   evas_object_geometry_get(data2, NULL, NULL, &w2, &h2);
+
+   if ((w * h) > (w2 * h2)) return 1;
+   return -1;
+}
+
+Eina_Bool
+_elm_widget_atspi_role_acceptable_check(Eo *obj)
+{
+   Elm_Atspi_Role role;
+   eo_do(obj, role = elm_interface_atspi_accessible_role_get());
+
+   switch (role)
+     {
+       case ELM_ATSPI_ROLE_APPLICATION:
+       case ELM_ATSPI_ROLE_FILLER:
+       case ELM_ATSPI_ROLE_SCROLL_PANE:
+       case ELM_ATSPI_ROLE_SPLIT_PANE:
+       case ELM_ATSPI_ROLE_WINDOW:
+       case ELM_ATSPI_ROLE_IMAGE:
+       case ELM_ATSPI_ROLE_LIST:
+       case ELM_ATSPI_ROLE_ICON:
+       case ELM_ATSPI_ROLE_TOOL_BAR:
+       case ELM_ATSPI_ROLE_REDUNDANT_OBJECT:
+       case ELM_ATSPI_ROLE_COLOR_CHOOSER:
+       case ELM_ATSPI_ROLE_TREE_TABLE:
+       case ELM_ATSPI_ROLE_PAGE_TAB_LIST:
+       case ELM_ATSPI_ROLE_PAGE_TAB:
+       case ELM_ATSPI_ROLE_SPIN_BUTTON:
+       case ELM_ATSPI_ROLE_INPUT_METHOD_WINDOW:
+       case ELM_ATSPI_ROLE_EMBEDDED:
+       case ELM_ATSPI_ROLE_INVALID:
+       case ELM_ATSPI_ROLE_NOTIFICATION:
+       case ELM_ATSPI_ROLE_DATE_EDITOR:
+         return EINA_FALSE;
+       default:
+         break;
+     }
+
+   return EINA_TRUE;
+}
+
+static Eo *
+_child_object_at_point_get(Eo *obj, int x, int y)
+{
+   Eina_List *l, *l_next, *children, *valid_children = NULL;
+   Eo *child;
+   Eo *target;
+   int count;
+
+   eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+
+   EINA_LIST_FOREACH(children, l, child)
+     {
+        if (_is_inside(child, x, y))
+          valid_children = eina_list_append(valid_children, child);
+     }
+
+   EINA_LIST_FOREACH_SAFE(valid_children, l, l_next, child)
+     {
+        eo_do(child, children = elm_interface_atspi_accessible_children_get());
+
+        /* do not use unacceptable leaf node */
+        if (!_elm_widget_atspi_role_acceptable_check(child) &&
+            eina_list_count(children) == 0)
+          valid_children = eina_list_remove_list(valid_children, l);
+     }
+
+   count = eina_list_count(valid_children);
+   if (count > 0)
+     {
+        valid_children = eina_list_sort(valid_children, -1, _sort_by_size);
+        target = eina_list_nth(valid_children, 0);
+
+        return _child_object_at_point_get(target, x, y);
+     }
+
+   return obj;
+}
+
+static Eina_Bool
+_acceptable_child_is(Eo *obj)
 {
-   Eina_List *l, *l2, *children;
+   Elm_Atspi_Role role;
+   Eina_List *children;
+   Elm_Atspi_State_Set ss;
+
+   eo_do(obj, role = elm_interface_atspi_accessible_role_get());
+   switch (role)
+     {
+       case ELM_ATSPI_ROLE_IMAGE:
+       case ELM_ATSPI_ROLE_ICON:
+         /* remove unacceptable leaf node */
+         eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+         if (!children) return EINA_FALSE;
+         break;
+
+       case ELM_ATSPI_ROLE_PANEL:
+         /* remove closed panel fron children list */
+         eo_do(obj, ss = elm_interface_atspi_accessible_state_set_get());
+         if (!STATE_TYPE_GET(ss, ELM_ATSPI_STATE_SHOWING)) return EINA_FALSE;
+         break;
+
+       default:
+         break;
+     }
+
+   return EINA_TRUE;
+}
+
+static Eo *
+_accessible_at_point_top_down_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool screen_coords, int x, int y)
+{
+   Eina_List *l, *l2, *children, *valid_children = NULL;
    Eo *child;
    Evas_Object *stack_item;
    Eo *compare_obj;
@@ -6635,26 +7429,34 @@ _elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_W
    Eo *proxy;
    Evas_Coord px, py, pw, ph;
    //
-   int ee_x, ee_y;
 
-   if (screen_coords)
+   _coordinate_system_based_point_translate(obj, screen_coords, &x, &y);
+
+   eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+
+   EINA_LIST_FOREACH(children, l2, child)
      {
-        Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
-        if (!ee) return NULL;
-        ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL);
-        x -= ee_x;
-        y -= ee_y;
+        if (_is_inside(child, x, y) && _acceptable_child_is(child))
+          valid_children = eina_list_append(valid_children, child);
      }
 
-   eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+   /* If there is only one valid child at point, then return it.
+      The evas_tree_objects_at_xy_get could not find proper object,
+      if application does not have well aligned objects. */
+   if (eina_list_count(valid_children) == 1)
+     {
+        eina_list_free(children);
+        child = eina_list_nth(valid_children, 0);
+        return child;
+     }
 
    /* Get evas_object stacked at given x,y coordinates starting from top */
    Eina_List *stack = evas_tree_objects_at_xy_get(evas_object_evas_get(obj), NULL, x, y);
    /* Foreach stacked object starting from top */
    EINA_LIST_FOREACH(stack, l, stack_item)
      {
-        /* Foreach at-spi children traverse stack_item evas_objects hierarchy */
-        EINA_LIST_FOREACH(children, l2, child)
+        /* Foreach at-spi valid children traverse stack_item evas_objects hierarchy */
+        EINA_LIST_FOREACH(valid_children, l2, child)
           {
              /* Compare object used to compare with stacked evas objects */
              compare_obj = child;
@@ -6663,13 +7465,39 @@ _elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_W
                {
                   Elm_Widget_Item_Data *id = eo_data_scope_get(child, ELM_WIDGET_ITEM_CLASS);
                   compare_obj = id->view;
+                  if (TIZEN_PROFILE_WEARABLE)
+                    {
+                       Eo* it_view = evas_object_image_source_get(stack_item);
+                       if (it_view && it_view == compare_obj)
+                         {
+                            eina_list_free(children);
+                            eina_list_free(stack);
+                            return child;
+                         }
+                    }
                }
              /* In case of access object compare should be 'wrapped' evas_object */
              if (eo_isa(child, ELM_ACCESS_CLASS))
                {
-                  Elm_Access_Info *info = _elm_access_info_get(child);
-                  compare_obj = info->part_object;
+                   Elm_Access_Info *info = _elm_access_info_get(child);
+                   if (!info) continue;
+                   compare_obj = info->part_object;
+                }
+             /* In case of widget is registerd by elm_access_object_register */
+             Evas_Object *ao = elm_access_object_get(child);
+             if (ao)
+               {
+                  eina_list_free(children);
+                  eina_list_free(stack);
+                  return ao;
                }
+
+             /* In case of ewk wrapper object compare with internal ewk_view evas_object */
+             if (eo_isa(child, ELM_ATSPI_EWK_WRAPPER_CLASS))
+               {
+                  compare_obj = elm_atspi_ewk_wrapper_ewk_view_get(child);
+               }
+
              /* If spacial eo children do not have backing evas_object continue with search */
              if (!compare_obj)
                continue;
@@ -6697,7 +7525,9 @@ _elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_W
                           }
                      }
                    //
-                   smart_parent = evas_object_smart_parent_get(smart_parent);
+
+                   smart_parent = _parent_get(smart_parent);
+                   if (_is_ancestor_of(smart_parent, obj)) break;
                }
           }
      }
@@ -6706,6 +7536,114 @@ _elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_W
    eina_list_free(stack);
    return NULL;
 }
+
+static int _sort_by_repeat_events(const void *data1, const void *data2)
+{
+   Evas_Object *ao1, *ao2;
+   Eina_Bool repeat1, repeat2;
+
+   ao1 = elm_access_object_get(data1);
+   ao2 = elm_access_object_get(data2);
+
+   repeat1 = evas_object_repeat_events_get(data1);
+   repeat2 = evas_object_repeat_events_get(data2);
+
+   if (repeat1 != repeat2)
+     {
+        if (repeat1 && !ao1) return 1;
+     }
+   else
+     {
+        if (repeat1 && !ao1 && ao2) return 1;
+     }
+
+   return -1;
+}
+
+static Eo *_item_at_point_get(Evas_Object *obj, int x, int y)
+{
+   Eo *child;
+   Eina_List *l, *children;
+
+   eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+
+   EINA_LIST_FOREACH(children, l, child)
+     {
+        if (_is_inside(child, x, y)) return child;
+     }
+
+   ERR("No child at point (%d, %d) on object %p", x, y, obj);
+   return NULL;
+}
+
+EOLIAN static Eo *
+_elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool screen_coords, int x, int y)
+{
+   Eina_List *l;
+   Evas_Object *stack_item;
+
+   if(strcmp("Elm_Win", eo_class_name_get(eo_class_get(obj))) &&
+      strcmp("Elm_Popup", eo_class_name_get(eo_class_get(obj))) &&
+      strcmp("Elm_Panel", eo_class_name_get(eo_class_get(obj))))
+     return _accessible_at_point_top_down_get(obj, _pd, screen_coords, x, y);
+
+   _coordinate_system_based_point_translate(obj, screen_coords, &x, &y);
+
+   Eina_List *stack = evas_tree_objects_at_xy_get(evas_object_evas_get(obj), NULL, x, y);
+   stack = eina_list_sort(stack, -1, _sort_by_repeat_events);
+
+   EINA_LIST_FOREACH(stack, l, stack_item)
+     {
+        Evas_Object *smart_parent = stack_item;
+        while (smart_parent)
+          {
+             /* If parent equals to obj, it is not necessary to go upper.
+                So the top down logic would be better than NULL return. */
+             if (smart_parent == obj)
+               return _accessible_at_point_top_down_get(obj, _pd, screen_coords, x, y);
+
+             Evas_Object *ao = elm_access_object_get(smart_parent);
+             if (ao) return ao;
+
+             if (eo_isa(smart_parent, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
+               {
+                  Eina_Bool acceptable = EINA_FALSE;
+                  Eo *item_child;
+                  Elm_Atspi_Role role;
+                  eo_do(smart_parent, role = elm_interface_atspi_accessible_role_get());
+                  switch (role)
+                    {
+                     case ELM_ATSPI_ROLE_FILLER: /* ex: View of colorselector item is layout */
+                     case ELM_ATSPI_ROLE_ICON:
+                     case ELM_ATSPI_ROLE_IMAGE:
+                     case ELM_ATSPI_ROLE_REDUNDANT_OBJECT:
+                     case ELM_ATSPI_ROLE_WINDOW:
+                       DBG("Go for parent: %s (%p)\n", evas_object_type_get(smart_parent), smart_parent);
+                       break;
+
+                     case ELM_ATSPI_ROLE_LIST:
+                       item_child = _item_at_point_get(smart_parent, x, y);
+                       if (TIZEN_PROFILE_WEARABLE)
+                         {
+                            item_child = _child_object_at_point_get(item_child, x, y);
+                            return item_child;
+                         }
+                       return item_child;
+                       break;
+
+                     default:
+                       acceptable = EINA_TRUE;
+                       break;
+                    }
+
+                    if (acceptable) return smart_parent;
+               }
+
+             smart_parent = _parent_get(smart_parent);
+          }
+     }
+   return _accessible_at_point_top_down_get(obj, _pd, screen_coords, x, y);
+}
 //
 
 //TIZEN_ONLY(20150709) add relations atpi
@@ -6759,67 +7697,52 @@ _elm_widget_item_elm_interface_atspi_accessible_translation_domain_get(Eo *obj E
    return _pd->atspi_translation_domain;
 }
 
-//TIZEN_ONLY(20160729): attributes_get, append APIs added/updated.
-EOLIAN Eina_List *
-_elm_widget_item_elm_interface_atspi_accessible_attributes_get(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *pd)
+//TIZEN_ONLY(20160726): add API elm_atspi_accessible_can_highlight_set/get
+static Eina_Bool
+_children_highlight_check(Eo *obj)
 {
-   Eina_List *attr_list = NULL;
-   Eina_List *l = NULL;
-   if (pd->attr_list)
+   Eina_List *children, *l;
+   Eo *child;
+
+   if (_elm_object_accessibility_currently_highlighted_get() == (void *)obj)
      {
-        Elm_Atspi_Attribute *t_attr = NULL;
-        Elm_Atspi_Attribute *attr = NULL;
-        EINA_LIST_FOREACH(pd->attr_list, l, t_attr)
-          {
-             attr = calloc(1, sizeof(Elm_Atspi_Attribute));
-             if (attr)
-               {
-                  attr->key = eina_stringshare_add(t_attr->key);
-                  attr->value = eina_stringshare_add(t_attr->value);
-                  attr_list = eina_list_append(attr_list, attr);
-               }
-          }
+        eo_do(obj, elm_interface_atspi_component_highlight_clear());
+        return EINA_TRUE;
      }
-   return attr_list;
-}
 
-EOLIAN static void
-_elm_widget_item_elm_interface_atspi_accessible_attribute_append(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *pd, char* key, char* value)
-{
-   if (!key || !value) return;
-   Elm_Atspi_Attribute *attr = calloc(1, sizeof(Elm_Atspi_Attribute));
-   if (!attr) return;
-   attr->key = eina_stringshare_add(key);
-   attr->value = eina_stringshare_add(value);
-   pd->attr_list = eina_list_append(pd->attr_list, attr);
-}
-//
+   eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+   EINA_LIST_FOREACH(children, l, child)
+     {
+        if (_children_highlight_check(child)) return EINA_TRUE;
+     }
 
-//
+   return EINA_FALSE;
+}
 
-//TIZEN_ONLY(20160726): add API elm_atspi_accessible_can_highlight_set/get
 EOLIAN static void
 _elm_widget_elm_interface_atspi_accessible_can_highlight_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd, Eina_Bool can_highlight)
 {
+   if (!can_highlight) _children_highlight_check(obj);
    _pd->can_highlight = !!can_highlight;
 }
 
 EOLIAN static Eina_Bool
-_elm_widget_elm_interface_atspi_accessible_can_highlight_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd)
+_elm_widget_elm_interface_atspi_accessible_can_highlight_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
 {
-   return _pd->can_highlight;
+   return _elm_widget_highlightable(obj);
 }
 
 EOLIAN static void
 _elm_widget_item_elm_interface_atspi_accessible_can_highlight_set(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *_pd, Eina_Bool can_highlight)
 {
+   if (!can_highlight) _children_highlight_check(obj);
    _pd->can_highlight = !!can_highlight;
 }
 
 EOLIAN static Eina_Bool
-_elm_widget_item_elm_interface_atspi_accessible_can_highlight_get(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *_pd)
+_elm_widget_item_elm_interface_atspi_accessible_can_highlight_get(Eo *obj, Elm_Widget_Item_Data *_pd EINA_UNUSED)
 {
-   return _pd->can_highlight;
+   return _elm_widget_item_highlightable(obj);
 }
 //
 
@@ -6885,7 +7808,17 @@ _elm_widget_evas_object_paragraph_direction_set(Eo *obj, Elm_Widget_Smart_Data *
 }
 //
 
-//TIZEN_ONLY(20160629): add elm color interface
+
+//TIZEN_ONLY(20161013): clean up elm color class feature
+void
+_edje_color_class_free(void *data)
+{
+   Edje_Color_Class *cc = data;
+
+   if (cc->name) eina_stringshare_del(cc->name);
+   free(cc);
+}
+
 Eina_Stringshare *
 _elm_widget_edje_class_get(const Eo_Class *klass, const char *style, const char *part)
 {
@@ -6894,11 +7827,9 @@ _elm_widget_edje_class_get(const Eo_Class *klass, const char *style, const char
 
    buf = eina_strbuf_new();
 
-   eina_strbuf_append(buf, eo_class_name_get(klass));
+   eina_strbuf_append(buf, strchr(eo_class_name_get(klass), '_') + 1);
    eina_strbuf_tolower(buf);
 
-   eina_strbuf_replace_first(buf, "_", "/widget/");
-
    if (style)
      {
         eina_strbuf_append_printf(buf, "/%s/%s", style, part);
@@ -6914,59 +7845,430 @@ _elm_widget_edje_class_get(const Eo_Class *klass, const char *style, const char
    return str;
 }
 
-EOAPI Eina_Bool
-_elm_widget_efl_gfx_base_color_part_set(Eo *obj, Elm_Widget_Smart_Data *sd, const char *part, int r, int g, int b, int a)
+/* TIZEN_ONLY(20161025): Apply color_class parent-child relationship */
+Eina_Bool
+_elm_widget_color_class_set_internal(Evas_Object *obj, Evas_Object *edje, const char *color_class,
+                                     int r, int g, int b, int a,
+                                     int r2, int g2, int b2, int a2,
+                                     int r3, int g3, int b3, int a3)
 {
+   Eina_Bool int_ret = EINA_TRUE;
    Eina_Stringshare *buf;
-   Eina_Bool int_ret;
+   int temp_color[3][4] = { { r,  g,  b,  a },
+                            { r2, g2, b2, a2 },
+                            { r3, g3, b3, a3 } };
 
-   if (eo_isa(obj, ELM_LAYOUT_CLASS))
-     {
-        int r2 = 0, g2 = 0, b2 = 0, a2 = 0, r3 = 0, g3 = 0, b3 = 0, a3 = 0;
+   if (!color_class) return EINA_FALSE;
 
-        buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, part);
-        _elm_color_unpremul(a, &r, &g, &b);
+   buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class);
 
-        edje_object_color_class_get(sd->resize_obj, buf, NULL, NULL, NULL, NULL, &r2, &g2, &b2, &a2, &r3, &g3, &b3, &a3);
-        int_ret = edje_object_color_class_set(sd->resize_obj, buf, r, g, b, a, r2, g2, b2, a2, r3, g3, b3, a3);
+#define TEMP_COLOR(x, y) \
+   ((temp_color[x][y] == -1) ? &temp_color[x][y] : NULL)
 
-        eina_stringshare_del(buf);
+   edje_object_color_class_get(edje, buf,
+                               TEMP_COLOR(0, 0), TEMP_COLOR(0, 1), TEMP_COLOR(0, 2), TEMP_COLOR(0, 3),
+                               TEMP_COLOR(1, 0), TEMP_COLOR(1, 1), TEMP_COLOR(1, 2), TEMP_COLOR(1, 3),
+                               TEMP_COLOR(2, 0), TEMP_COLOR(2, 1), TEMP_COLOR(2, 2), TEMP_COLOR(2, 3));
 
-        return int_ret;
-     }
-   else
-     {
-        ERR("%s does not support %s API.", elm_widget_type_get(obj), "elm_object_part_color_set()");
-        return EINA_FALSE;
-     }
+#undef TEMP_COLOR
+
+#define TEMP_COLOR(x, y) \
+   ((temp_color[x][y] == -1) ? 0 : temp_color[x][y])
+
+   int_ret &= edje_object_color_class_set(edje, buf,
+                                          TEMP_COLOR(0, 0), TEMP_COLOR(0, 1), TEMP_COLOR(0, 2), TEMP_COLOR(0, 3),
+                                          TEMP_COLOR(1, 0), TEMP_COLOR(1, 1), TEMP_COLOR(1, 2), TEMP_COLOR(1, 3),
+                                          TEMP_COLOR(2, 0), TEMP_COLOR(2, 1), TEMP_COLOR(2, 2), TEMP_COLOR(2, 3));
+
+#undef TEMP_COLOR
+
+   eina_stringshare_del(buf);
+
+   return int_ret;
 }
 
-EOAPI Eina_Bool
-_elm_widget_efl_gfx_base_color_part_get(Eo *obj, Elm_Widget_Smart_Data *sd, const char *part, int *r, int *g, int *b, int *a)
+Eina_Bool
+_elm_widget_color_class_get_internal(Evas_Object *obj, Evas_Object *edje, const char *color_class,
+                                     int *r, int *g, int *b, int *a,
+                                     int *r2, int *g2, int *b2, int *a2,
+                                     int *r3, int *g3, int *b3, int *a3)
 {
+   Eina_Bool int_ret = EINA_TRUE;
    Eina_Stringshare *buf;
-   Eina_Bool int_ret;
 
-   if (eo_isa(obj, ELM_LAYOUT_CLASS))
-     {
-        buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, part);
+   if (!color_class) return EINA_FALSE;
 
-        int_ret = edje_object_color_class_get(sd->resize_obj, buf, r, g, b, a, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
+   buf = _elm_widget_edje_class_get(eo_class_get(obj), elm_widget_style_get(obj), color_class);
 
-        _elm_color_premul(*a, r, g, b);
+   int_ret &= edje_object_color_class_get(edje, buf,
+                                          r,  g,  b,  a,
+                                          r2, g2, b2, a2,
+                                          r3, g3, b3, a3);
 
-        eina_stringshare_del(buf);
+   eina_stringshare_del(buf);
 
-        return int_ret;
-     }
-   else
-     {
-        ERR("%s does not support %s API.", elm_widget_type_get(obj), "elm_object_part_color_get()");
-        return EINA_FALSE;
-     }
+   return int_ret;
+}
+/* END */
+
+EOLIAN Eina_Bool
+_elm_widget_class_color_set(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int r, int g, int b, int a)
+{
+   Evas_Object *edje;
+   Eina_Bool int_ret = EINA_TRUE;
+
+   if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+   edje = elm_layout_edje_get(obj);
+   int_ret &= _elm_widget_color_class_set_internal(obj, edje, color_class,
+                                                   r, g, b, a,
+                                                   -1, -1, -1, -1,
+                                                   -1, -1, -1, -1);
+
+   return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color_get(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int *r, int *g, int *b, int *a)
+{
+   Evas_Object *edje;
+   Eina_Bool int_ret = EINA_TRUE;
+
+   if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+   edje = elm_layout_edje_get(obj);
+   int_ret &= _elm_widget_color_class_get_internal(obj, edje, color_class,
+                                                   r, g, b, a,
+                                                   NULL, NULL, NULL, NULL,
+                                                   NULL, NULL, NULL, NULL);
+
+   return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color2_set(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int r, int g, int b, int a)
+{
+   Evas_Object *edje;
+   Eina_Bool int_ret = EINA_TRUE;
+
+   if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+   edje = elm_layout_edje_get(obj);
+   int_ret &= _elm_widget_color_class_set_internal(obj, edje, color_class,
+                                                   -1, -1, -1, -1,
+                                                   r, g, b, a,
+                                                   -1, -1, -1, -1);
+
+   return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color2_get(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int *r, int *g, int *b, int *a)
+{
+   Evas_Object *edje;
+   Eina_Bool int_ret = EINA_TRUE;
+
+   if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+   edje = elm_layout_edje_get(obj);
+   int_ret &= _elm_widget_color_class_get_internal(obj, edje, color_class,
+                                                   NULL, NULL, NULL, NULL,
+                                                   r, g, b, a,
+                                                   NULL, NULL, NULL, NULL);
+
+   return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color3_set(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int r, int g, int b, int a)
+{
+   Evas_Object *edje;
+   Eina_Bool int_ret = EINA_TRUE;
+
+   if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+   edje = elm_layout_edje_get(obj);
+   int_ret &= _elm_widget_color_class_set_internal(obj, edje, color_class,
+                                                   -1, -1, -1, -1,
+                                                   -1, -1, -1, -1,
+                                                   r, g, b, a);
+
+   return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color3_get(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int *r, int *g, int *b, int *a)
+{
+   Evas_Object *edje;
+   Eina_Bool int_ret = EINA_TRUE;
+
+   if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+   edje = elm_layout_edje_get(obj);
+   int_ret &= _elm_widget_color_class_get_internal(obj, edje, color_class,
+                                                   NULL, NULL, NULL, NULL,
+                                                   NULL, NULL, NULL, NULL,
+                                                   r, g, b, a);
+
+   return int_ret;
+}
+
+EOLIAN void
+_elm_widget_class_color_del(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd, const char *color_class)
+{
+   Eina_Stringshare *buf;
+
+   if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return;
+
+   buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class);
+   edje_object_color_class_del(sd->resize_obj, buf);
+   eina_stringshare_del(buf);
+}
+
+EOLIAN void
+_elm_widget_class_color_clear(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
+{
+   if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return;
+   edje_object_color_class_clear(sd->resize_obj);
+}
+
+#define ELM_COLOR_CLASS_UPDATE(obj, hash, cond)                                  \
+   Evas_Object *edje = NULL;                                                     \
+   Eina_Iterator *itr;                                                           \
+   Edje_Color_Class *cc;                                                         \
+   Eina_Bool int_ret = EINA_TRUE;                                                \
+   if (cond) return EINA_FALSE;                                                  \
+   if (eo_isa(obj, ELM_LAYOUT_CLASS))                                            \
+     edje =  elm_layout_edje_get(obj);                                           \
+   else if (eo_isa(obj, EDJE_OBJECT_CLASS))                                      \
+     edje = obj;                                                                 \
+   if (!edje) return EINA_FALSE;                                                 \
+   itr = eina_hash_iterator_data_new(hash);                                      \
+   EINA_ITERATOR_FOREACH(itr, cc)                                                \
+     {                                                                           \
+        int_ret &= edje_object_color_class_set(edje, cc->name,                   \
+                                               cc->r, cc->g, cc->b, cc->a,       \
+                                               cc->r2, cc->g2, cc->b2, cc->a2,   \
+                                               cc->r3, cc->g3, cc->b3, cc->a3);  \
+     }                                                                           \
+   eina_iterator_free(itr);                                                      \
+   return int_ret
+
+
+#define CHECK_BOUND(x)                                                           \
+   if (x > 0xff) x = 0xff;                                                       \
+   else if (x < 0) x = 0
+
+#define ELM_COLOR_CLASS_SET_START(obj, cr, cg, cb, ca)                           \
+   Eina_Bool int_ret = EINA_FALSE;                                               \
+   Edje_Color_Class *cc = NULL;                                                  \
+   Eina_Stringshare *buf;                                                        \
+   buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class);       \
+   CHECK_BOUND(r);                                                               \
+   CHECK_BOUND(g);                                                               \
+   CHECK_BOUND(b);                                                               \
+   CHECK_BOUND(a);                                                               \
+   _elm_color_unpremul(a, &r, &g, &b);                                           \
+   if (!sd->color_classes)                                                       \
+     sd->color_classes = eina_hash_string_small_new(_edje_color_class_free);     \
+   else                                                                          \
+     cc = eina_hash_find(sd->color_classes, buf);                                \
+   if (!cc)                                                                      \
+     {                                                                           \
+        cc = calloc(1, sizeof(Edje_Color_Class));                                \
+        cc->name = eina_stringshare_add(buf);                                    \
+        if (!cc->name)                                                           \
+          {                                                                      \
+             free(cc);                                                           \
+             eina_stringshare_del(buf);                                          \
+             return EINA_FALSE;                                                  \
+          }                                                                      \
+        eina_hash_direct_add(sd->color_classes, cc->name, cc);                   \
+     }                                                                           \
+   else if ((cc->cr == r) && (cc->cg == g) &&                                    \
+            (cc->cb == b) && (cc->ca == a))                                      \
+     {                                                                           \
+        eina_stringshare_del(buf);                                               \
+        return EINA_TRUE;                                                        \
+     }                                                                           \
+   cc->cr = r;                                                                   \
+   cc->cg = g;                                                                   \
+   cc->cb = b;                                                                   \
+   cc->ca = a;                                                                   \
+   int_ret = EINA_TRUE
+
+#define ELM_COLOR_CLASS_SET_END()                                                \
+   eina_stringshare_del(buf);                                                    \
+   return int_ret
+
+#define ELM_COLOR_CLASS_GET(obj, cr, cg, cb, ca)                                 \
+   Eina_Bool int_ret = EINA_FALSE;                                               \
+   Edje_Color_Class *cc;                                                         \
+   Eina_Stringshare *buf;                                                        \
+   int alpha = 0;                                                                \
+   buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class);       \
+   if ((!sd->color_classes) || !(cc = eina_hash_find(sd->color_classes, buf)))   \
+     {                                                                           \
+        if (r) *r = 0;                                                           \
+        if (g) *g = 0;                                                           \
+        if (b) *b = 0;                                                           \
+        if (a) *a = 0;                                                           \
+        int_ret = EINA_FALSE;                                                    \
+     }                                                                           \
+   else                                                                          \
+     {                                                                           \
+        if (r) *r = cc->cr;                                                      \
+        if (g) *g = cc->cg;                                                      \
+        if (b) *b = cc->cb;                                                      \
+        if (a) *a = cc->ca;                                                      \
+        alpha = cc->ca;                                                          \
+        int_ret = EINA_TRUE;                                                     \
+     }                                                                           \
+   _elm_color_premul(alpha, r, g, b);                                            \
+   eina_stringshare_del(buf);                                                    \
+   return int_ret
+
+Eina_Bool
+_elm_widget_item_color_class_update(Elm_Widget_Item_Data *sd)
+{
+   ELM_COLOR_CLASS_UPDATE(sd->view, sd->color_classes, (!sd) || (!sd->color_classes) || (!sd->view));
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color_set(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int r, int g, int b, int a)
+{
+   ELM_COLOR_CLASS_SET_START(obj, r, g, b, a);
+
+   int_ret &= _elm_widget_item_color_class_update(sd);
+
+   ELM_COLOR_CLASS_SET_END();
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color_get(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int *r, int *g, int *b, int *a)
+{
+   ELM_COLOR_CLASS_GET(obj, r, g, b, a);
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color2_set(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int r, int g, int b, int a)
+{
+   ELM_COLOR_CLASS_SET_START(obj, r2, g2, b2, a2);
+
+   int_ret &= _elm_widget_item_color_class_update(sd);
+
+   ELM_COLOR_CLASS_SET_END();
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color2_get(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int *r, int *g, int *b, int *a)
+{
+   ELM_COLOR_CLASS_GET(obj, r2, g2, b2, a2);
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color3_set(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int r, int g, int b, int a)
+{
+   ELM_COLOR_CLASS_SET_START(obj, r3, g3, b3, a3);
+
+   int_ret &= _elm_widget_item_color_class_update(sd);
+
+   ELM_COLOR_CLASS_SET_END();
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color3_get(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int *r, int *g, int *b, int *a)
+{
+   ELM_COLOR_CLASS_GET(obj, r3, g3, b3, a3);
+}
+
+static Evas_Object *
+_elm_widget_item_edje_get(Eo *obj, Elm_Widget_Item_Data *sd)
+{
+   if (!sd)
+     sd = eo_data_scope_get(obj, ELM_WIDGET_ITEM_CLASS);
+
+   if (eo_isa(sd->view, ELM_LAYOUT_CLASS))
+     return elm_layout_edje_get(sd->view);
+   else if (eo_isa(sd->view, EDJE_OBJECT_CLASS))
+     return sd->view;
+
+   return NULL;
+}
+
+EOLIAN void
+_elm_widget_item_class_color_del(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd, const char *color_class)
+{
+   Eina_Stringshare *buf;
+   Evas_Object *edje;
+   Edje_Color_Class *cc = NULL;
+
+   if (!color_class) return;
+
+   buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class);
+   eina_hash_del(sd->color_classes, buf, cc);
+
+   edje = _elm_widget_item_edje_get(obj, sd);
+   if (edje)
+     edje_object_color_class_del(edje, buf);
+
+   eina_stringshare_del(buf);
+}
+
+EOLIAN void
+_elm_widget_item_class_color_clear(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd)
+{
+   Evas_Object *edje;
+   ELM_SAFE_FREE(sd->color_classes, eina_hash_free);
+
+   edje = _elm_widget_item_edje_get(obj, sd);
+   if (!edje) return;
+
+   edje_object_color_class_clear(edje);
 }
 //
 
+/* TIZEN_ONLY(20161025): Apply color_class parent-child relationship */
+void
+_elm_widget_color_class_parent_set(Evas_Object *obj, Evas_Object *parent)
+{
+   Evas_Object *edje = NULL, *parent_edje = NULL;
+
+   if (!obj || !parent) return;
+
+   if (eo_isa(obj, ELM_LAYOUT_CLASS))
+     edje =  elm_layout_edje_get(obj);
+   else if (eo_isa(obj, EDJE_OBJECT_CLASS))
+     edje = obj;
+
+   if (eo_isa(parent, ELM_LAYOUT_CLASS))
+     parent_edje =  elm_layout_edje_get(parent);
+   else if (eo_isa(parent, EDJE_OBJECT_CLASS))
+     parent_edje = parent;
+
+   if (!edje || !parent_edje) return;
+
+   edje_object_color_class_parent_set(edje, parent_edje);
+}
+
+void
+_elm_widget_color_class_parent_unset(Evas_Object *obj)
+{
+   Evas_Object *edje = NULL;
+
+   if (!obj) return;
+
+   if (eo_isa(obj, ELM_LAYOUT_CLASS))
+     edje =  elm_layout_edje_get(obj);
+   else if (eo_isa(obj, EDJE_OBJECT_CLASS))
+     edje = obj;
+
+   if (!edje) return;
+
+   edje_object_color_class_parent_unset(edje);
+}
+/* END */
+
 //TIZEN_ONLY(20160527): widget: add AtspiAction interface to all widgets and widget_items, add handlers for reading stopped/cancelled
 EOLIAN const Elm_Atspi_Action *
 _elm_widget_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd EINA_UNUSED)