From: Radoslaw Cybulski Date: Mon, 22 Oct 2018 08:57:07 +0000 (+0200) Subject: Fix parent-children incosistencies in atspi tree X-Git-Tag: submit/tizen/20181108.080505~146 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ab83efe24c1c212cb5b67af0444350e65dd876be;p=platform%2Fupstream%2Fefl.git Fix parent-children incosistencies in atspi tree Fixes incosistencies (where obj A was child of object B, but object B's parent was different, than A) in atspi tree. Now atspi parent is retrieved by calling efl_access_object_access_parent_set. Change-Id: I3e20af88bd7f066f3f9faa5185e4028d0e5e05db --- diff --git a/src/lib/elementary/efl_access_object.c b/src/lib/elementary/efl_access_object.c index f266c42..5ad4587 100644 --- a/src/lib/elementary/efl_access_object.c +++ b/src/lib/elementary/efl_access_object.c @@ -163,6 +163,10 @@ struct _Efl_Access_Object_Data const char *translation_domain; Efl_Access_Role role; Efl_Access_Reading_Info_Type_Mask reading_info; + + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *parent; + // }; typedef struct _Efl_Access_Object_Data Efl_Access_Object_Data; @@ -175,10 +179,12 @@ EOLIAN static int _efl_access_object_index_in_parent_get(const Eo *obj, Efl_Access_Object_Data *pd EINA_UNUSED) { Eina_List *l, *children = NULL; - Eo *chld, *parent = NULL; + Eo *chld; int ret = 0; - parent = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *parent = efl_access_object_access_parent_get(obj); + // if (!parent) return -1; children = efl_access_object_access_children_get(parent); @@ -199,15 +205,19 @@ _efl_access_object_index_in_parent_get(const Eo *obj, Efl_Access_Object_Data *pd return ret; } - -EOLIAN static Efl_Object * -_efl_access_object_efl_object_provider_find(const Eo *obj, Efl_Access_Object_Data *pd EINA_UNUSED, const Efl_Object *klass) +//TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree +EOLIAN static Eo * +_efl_access_object_access_parent_get(const Eo *obj, Efl_Access_Object_Data *pd EINA_UNUSED) { - if (efl_isa(obj, klass)) - return (Eo*)obj; + return pd->parent; +} - return efl_provider_find(efl_super(obj, EFL_ACCESS_OBJECT_MIXIN), klass); +EOLIAN static void +_efl_access_object_access_parent_set(Eo *obj, Efl_Access_Object_Data *pd EINA_UNUSED, Eo *parent) +{ + pd->parent = parent; } +// EOLIAN Eina_List* _efl_access_object_attributes_get(const Eo *obj EINA_UNUSED, Efl_Access_Object_Data *pd) @@ -466,7 +476,12 @@ _efl_access_object_access_children_get(const Eo *obj, Efl_Access_Object_Data *pd EINA_ITERATOR_FOREACH(iter, chld) { if (efl_isa(chld, EFL_ACCESS_OBJECT_MIXIN)) - children = eina_list_append(children, chld); + { + children = eina_list_append(children, chld); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(chld, obj); + // + } } eina_iterator_free(iter); @@ -973,7 +988,9 @@ elm_atspi_accessible_parent_set(Elm_Interface_Atspi_Accessible *obj, Elm_Interfa EAPI Elm_Interface_Atspi_Accessible * elm_atspi_accessible_parent_get(const Elm_Interface_Atspi_Accessible *obj) { - return efl_provider_find(efl_parent_get(obj), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + return efl_access_object_access_parent_get(obj); + // } EAPI Elm_Atspi_State_Set diff --git a/src/lib/elementary/efl_access_object.eo b/src/lib/elementary/efl_access_object.eo index 86f9e35..983e41f 100644 --- a/src/lib/elementary/efl_access_object.eo +++ b/src/lib/elementary/efl_access_object.eo @@ -368,6 +368,18 @@ mixin Efl.Access.Object (Efl.Interface, Efl.Object) role: Efl.Access.Role; [[Accessible role]] } } + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + @property access_parent { + [[Gets object's accessible parent.]] + get { + } + set { + } + values { + parent: Efl.Access.Object; [[Accessible parent]] + } + } + // //TIZEN_ONLY(20190922): add name callback, description callback. @property description_cb { set { @@ -623,7 +635,6 @@ mixin Efl.Access.Object (Efl.Interface, Efl.Object) } implements { Efl.Object.destructor; - Efl.Object.provider_find; } events { property,changed: string; [[Called when property has changed]] diff --git a/src/lib/elementary/efl_ui_view_list.c b/src/lib/elementary/efl_ui_view_list.c index 09562be..57fa3fe 100644 --- a/src/lib/elementary/efl_ui_view_list.c +++ b/src/lib/elementary/efl_ui_view_list.c @@ -922,6 +922,12 @@ _efl_ui_view_list_efl_access_object_access_children_get(const Eo *obj, Efl_Ui_Vi Eina_List *ret = NULL, *ret2 = NULL; ret = efl_ui_view_list_relayout_elements_get(pd->relayout); + + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *it; + EINA_LIST_FOREACH(ret, ret2, it) + efl_access_object_access_parent_set(it, obj); + // ret2 = efl_access_object_access_children_get(efl_super(obj, EFL_UI_VIEW_LIST_CLASS)); return eina_list_merge(ret, ret2); diff --git a/src/lib/elementary/efl_ui_widget.c b/src/lib/elementary/efl_ui_widget.c index 2037350..6970cb4 100644 --- a/src/lib/elementary/efl_ui_widget.c +++ b/src/lib/elementary/efl_ui_widget.c @@ -1815,6 +1815,9 @@ _efl_ui_widget_widget_sub_object_add(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Ob } sd->subobjs = eina_list_append(sd->subobjs, sobj); evas_object_data_set(sobj, "elm-parent", obj); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(sobj, obj); + // _callbacks_add(sobj, obj); if (_elm_widget_is(sobj)) @@ -1884,6 +1887,9 @@ _efl_ui_widget_widget_sub_object_del(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Ob EINA_SAFETY_ON_TRUE_RETURN_VAL(obj == sobj, EINA_FALSE); sobj_parent = evas_object_data_del(sobj, "elm-parent"); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(sobj, NULL); + // if (sobj_parent && sobj_parent != obj) { static int abort_on_warn = -1; diff --git a/src/lib/elementary/efl_ui_win.c b/src/lib/elementary/efl_ui_win.c index 186e87b..1ad8c80 100644 --- a/src/lib/elementary/efl_ui_win.c +++ b/src/lib/elementary/efl_ui_win.c @@ -6724,6 +6724,11 @@ _efl_ui_win_efl_object_constructor(Eo *obj, Efl_Ui_Win_Data *pd) if (!efl_parent_get(obj)) efl_allow_parent_unref_set(obj, EINA_TRUE); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *root = efl_access_object_access_root_get(EFL_ACCESS_OBJECT_MIXIN); + efl_access_object_access_parent_set(obj, root); + // + return obj; } diff --git a/src/lib/elementary/elc_hoversel.c b/src/lib/elementary/elc_hoversel.c index 1502c67..88eeff5 100644 --- a/src/lib/elementary/elc_hoversel.c +++ b/src/lib/elementary/elc_hoversel.c @@ -1113,6 +1113,13 @@ _elm_hoversel_efl_access_object_access_children_get(const Eo *obj EINA_UNUSED, E //TIZEN_ONLY(20161121): Added hover object in children list //return eina_list_clone(pd->items); Eina_List *ret = NULL; + + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *it; + EINA_LIST_FOREACH(pd->items, ret, it) + efl_access_object_access_parent_set(it, obj); + // + ret = efl_access_object_access_children_get(efl_super(obj, ELM_HOVERSEL_CLASS)); ret = eina_list_merge(ret, eina_list_clone(pd->items)); diff --git a/src/lib/elementary/elc_multibuttonentry.c b/src/lib/elementary/elc_multibuttonentry.c index 4d558bf..9635fcf 100644 --- a/src/lib/elementary/elc_multibuttonentry.c +++ b/src/lib/elementary/elc_multibuttonentry.c @@ -2309,12 +2309,25 @@ _elm_multibuttonentry_efl_access_object_access_children_get(const Eo *obj, Elm_M */ Eina_List *ret = NULL; + + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *it; + EINA_LIST_FOREACH(sd->items, ret, it) + efl_access_object_access_parent_set(it, obj); + // + //TIZEN_ONLY(20160527) : Improve MBE atspi support if (sd->label && sd->label_packed) - ret = eina_list_append(ret, sd->label_access); + { + ret = eina_list_append(ret, sd->label_access); + efl_access_object_access_parent_set(sd->label_access, obj); + } ret = eina_list_merge(ret, eina_list_clone(sd->items)); if (sd->editable && (sd->view_state != MULTIBUTTONENTRY_VIEW_SHRINK)) - ret = eina_list_append(ret, sd->box); + { + ret = eina_list_append(ret, sd->box); + efl_access_object_access_parent_set(sd->box, obj); + } // return ret; } diff --git a/src/lib/elementary/elc_naviframe.c b/src/lib/elementary/elc_naviframe.c index e42e336..0bf3f51 100644 --- a/src/lib/elementary/elc_naviframe.c +++ b/src/lib/elementary/elc_naviframe.c @@ -2419,6 +2419,10 @@ _elm_naviframe_item_efl_access_object_access_children_get(const Eo *eo_item EINA { Eina_List *ret = NULL; + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(VIEW(nit), eo_item); + // + ret = eina_list_append(ret, VIEW(nit)); return ret; } diff --git a/src/lib/elementary/elm_atspi_app_object.c b/src/lib/elementary/elm_atspi_app_object.c index 983da98..675ab21 100644 --- a/src/lib/elementary/elm_atspi_app_object.c +++ b/src/lib/elementary/elm_atspi_app_object.c @@ -44,8 +44,13 @@ _elm_atspi_app_object_efl_access_object_access_children_get(const Eo *obj EINA_U */ //TIZEN_ONLY(20171108): make atspi_proxy work if (elm_win_type_get(win) != ELM_WIN_SOCKET_IMAGE) + { // - accs = eina_list_append(accs, win); + accs = eina_list_append(accs, win); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(win, obj); + // + } } return accs; diff --git a/src/lib/elementary/elm_atspi_bridge.c b/src/lib/elementary/elm_atspi_bridge.c index e30252c..ff2a177 100644 --- a/src/lib/elementary/elm_atspi_bridge.c +++ b/src/lib/elementary/elm_atspi_bridge.c @@ -665,6 +665,11 @@ _accessible_get_children(const Eldbus_Service_Interface *iface, const Eldbus_Mes { _bridge_iter_object_reference_append(bridge, iter_array, children); _bridge_object_register(bridge, children); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *parent = efl_access_object_access_parent_get(children); + if (parent != obj) + ERR("parent mismatch for object %p, should be %p, is %p", children, obj, parent); + // } eldbus_message_iter_container_close(iter, iter_array); @@ -895,6 +900,12 @@ _accessible_child_at_index(const Eldbus_Service_Interface *iface EINA_UNUSED, co child = eina_list_nth(children, idx); _bridge_iter_object_reference_append(bridge, iter, child); _bridge_object_register(bridge, child); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *parent = efl_access_object_access_parent_get(child); + if (parent != obj) + ERR("parent mismatch for object %p, should be %p, is %p", child, obj, parent); + // + eina_list_free(children); return ret; @@ -2912,6 +2923,21 @@ _bridge_object_from_path(Eo *bridge, const char *path) return ret; } +//TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree +static Eo * +_get_accessible_parent(const Eo *eo) +{ + if (!eo) return NULL; + Eo *parent = efl_access_object_access_parent_get(eo); + if (parent) return parent; + + Efl_Access_Role role = efl_access_object_role_get(eo); + if (role != EFL_ACCESS_ROLE_APPLICATION) + ERR("object %p has no parent, but is not an application!", eo); + return NULL; +} +// + static const char * _path_from_object(const Eo *eo) { @@ -2958,10 +2984,10 @@ _accessible_property_get(const Eldbus_Service_Interface *interface, const char * } else if (!strcmp(property, "Parent")) { - ret_obj = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_OBJECT_MIXIN); - Efl_Access_Role role = EFL_ACCESS_ROLE_INVALID; - role = efl_access_object_role_get(obj); - if ((!ret_obj) && (EFL_ACCESS_ROLE_APPLICATION == role)) + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + ret_obj = _get_accessible_parent(obj); + // + if (!ret_obj) _object_desktop_reference_append(iter); else _bridge_iter_object_reference_append(bridge, iter, ret_obj); @@ -3685,7 +3711,9 @@ _collection_sort_order_reverse_canonical(struct collection_match_rule *rule, Ein /* Get the current nodes index in it's parent and the parent object. */ indexinparent = efl_access_object_index_in_parent_get(obj); - parent = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + parent = _get_accessible_parent(obj); + // if ((indexinparent > 0) && ((max == 0) || (count < max))) { @@ -3740,8 +3768,9 @@ _collection_inorder(Eo *collection, struct collection_match_rule *rule, Eina_Lis while ((max == 0 || count < max) && obj && obj != collection) { - Eo *parent; - parent = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *parent = _get_accessible_parent(obj); + // idx = efl_access_object_index_in_parent_get(obj); count = _collection_sort_order_canonical(rule, list, count, max, parent, idx + 1, EINA_TRUE, NULL, EINA_TRUE, traverse); @@ -3819,7 +3848,9 @@ _collection_get_matches_from_handle(Eo *collection, Eo *current, struct collecti break; case ATSPI_Collection_TREE_RESTRICT_CHILDREN: idx = efl_access_object_index_in_parent_get(current); - parent = efl_provider_find(efl_parent_get(current), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + parent = _get_accessible_parent(current); + // _collection_query(rule, sortby, &result, 0, max, parent, idx, EINA_FALSE, NULL, EINA_TRUE, traverse); break; case ATSPI_Collection_TREE_RESTRICT_SIBLING: @@ -3880,7 +3911,9 @@ _collection_get_matches_to_handle(Eo *obj, Eo *current, struct collection_match_ Eo *collection = obj; if (limit) - collection = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + collection = _get_accessible_parent(obj); + // switch (tree) { @@ -4105,10 +4138,11 @@ _cache_item_reference_append_cb(Eo *bridge, Eo *data, Eldbus_Message_Iter *iter_ /* Marshall application */ _bridge_iter_object_reference_append(bridge, iter_struct, root); - Eo *parent = NULL; - parent = efl_provider_find(efl_parent_get(data), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *parent = _get_accessible_parent(data); + // /* Marshall parent */ - if ((!parent) && (EFL_ACCESS_ROLE_APPLICATION == role)) + if (!parent) _object_desktop_reference_append(iter_struct); else _bridge_iter_object_reference_append(bridge, iter_struct, parent); @@ -4450,13 +4484,16 @@ static unsigned char _accept_object(accessibility_navigation_pointer_table *tabl /* The target cannot be a parent of root */ static Eina_Bool _target_validation_check(Eo *target, Eo *root) { - Eo *parent; - parent = efl_provider_find(efl_parent_get(root), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *parent = _get_accessible_parent(root); + // while (parent) { if (parent == target) return EINA_FALSE; - parent = efl_provider_find(efl_parent_get(parent), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + parent = _get_accessible_parent(parent); + // } return EINA_TRUE; @@ -5000,8 +5037,10 @@ unsigned char _object_is_scrollable_impl(struct accessibility_navigation_pointer void *_get_parent_impl(struct accessibility_navigation_pointer_table *table EINA_UNUSED, void *ptr) { - Eo *obj = (Eo*)ptr, *ret_obj; - ret_obj = efl_provider_find(efl_parent_get(obj), EFL_ACCESS_OBJECT_MIXIN); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *obj = (Eo*)ptr; + Eo *ret_obj = efl_access_object_access_parent_get(obj); + // return ret_obj; } diff --git a/src/lib/elementary/elm_atspi_ewk_wrapper.c b/src/lib/elementary/elm_atspi_ewk_wrapper.c index 2db8d55..cbc2287 100644 --- a/src/lib/elementary/elm_atspi_ewk_wrapper.c +++ b/src/lib/elementary/elm_atspi_ewk_wrapper.c @@ -133,9 +133,13 @@ EOLIAN static Eina_List* _elm_atspi_ewk_wrapper_efl_access_object_access_children_get(const Eo *obj EINA_UNUSED, Elm_Atspi_Ewk_Wrapper_Data *_pd) { if (_pd->proxy) - return eina_list_append(NULL, _pd->proxy); - else - return NULL; + { + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(_pd->proxy, obj); + // + return eina_list_append(NULL, _pd->proxy); + } + return NULL; } static void diff --git a/src/lib/elementary/elm_colorselector.c b/src/lib/elementary/elm_colorselector.c index 3a4540a..4f00141 100644 --- a/src/lib/elementary/elm_colorselector.c +++ b/src/lib/elementary/elm_colorselector.c @@ -2715,6 +2715,11 @@ EOLIAN static Eina_List* _elm_colorselector_efl_access_object_access_children_get(const Eo *obj EINA_UNUSED, Elm_Colorselector_Data *sd) { Eina_List *ret = NULL; + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *it; + EINA_LIST_FOREACH(sd->items, ret, it) + efl_access_object_access_parent_set(it, obj); + // ret = efl_access_object_access_children_get(efl_super(obj, ELM_COLORSELECTOR_CLASS)); // filter - out box contiainer diff --git a/src/lib/elementary/elm_entry.c b/src/lib/elementary/elm_entry.c index 9a83e8c..ab4758c 100644 --- a/src/lib/elementary/elm_entry.c +++ b/src/lib/elementary/elm_entry.c @@ -8232,7 +8232,13 @@ _elm_entry_efl_access_object_access_children_get(const Eo *obj EINA_UNUSED, Elm_ if (!sd->editable) { EINA_LIST_FOREACH(sd->anchor_atspi_rects, l, rect) - ret = eina_list_append(ret, elm_access_object_get(rect)); + { + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *rect_eo = elm_access_object_get(rect); + ret = eina_list_append(ret, rect_eo); + efl_access_object_access_parent_set(rect_eo, obj); + // + } } return ret; } diff --git a/src/lib/elementary/elm_gengrid.c b/src/lib/elementary/elm_gengrid.c index c31af7f..ae9b39d 100644 --- a/src/lib/elementary/elm_gengrid.c +++ b/src/lib/elementary/elm_gengrid.c @@ -6831,6 +6831,12 @@ _elm_gengrid_efl_access_object_access_children_get(const Eo *obj, Elm_Gengrid_Da ret = eina_list_append(ret, EO_OBJ(it)); } + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *it2; + EINA_LIST_FOREACH(ret, ret2, it2) + efl_access_object_access_parent_set(it2, obj); + // + ret2 = efl_access_object_access_children_get(efl_super(obj, ELM_GENGRID_CLASS)); return eina_list_merge(ret, ret2); @@ -7086,6 +7092,9 @@ _elm_gengrid_item_efl_access_object_access_children_get(const Eo *eo_it EINA_UNU if (part && efl_isa(part, EFL_ACCESS_OBJECT_MIXIN)) { ret = eina_list_append(ret, part); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(part, eo_it); + // efl_parent_set(part, eo_it); } } diff --git a/src/lib/elementary/elm_index.c b/src/lib/elementary/elm_index.c index 985fb52..fd84a25 100644 --- a/src/lib/elementary/elm_index.c +++ b/src/lib/elementary/elm_index.c @@ -1779,6 +1779,12 @@ EOLIAN static Eina_List* _elm_index_efl_access_object_access_children_get(const Eo *obj, Elm_Index_Data *data) { Eina_List *ret; + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *it; + EINA_LIST_FOREACH(data->items, ret, it) + efl_access_object_access_parent_set(it, obj); + // + ret = efl_access_object_access_children_get(efl_super(obj, ELM_INDEX_CLASS)); return eina_list_merge(eina_list_clone(data->items), ret); } diff --git a/src/lib/elementary/elm_list.c b/src/lib/elementary/elm_list.c index ca5e215..31d72c3 100644 --- a/src/lib/elementary/elm_list.c +++ b/src/lib/elementary/elm_list.c @@ -2120,6 +2120,10 @@ _elm_list_item_elm_widget_item_del_pre(Eo *eo_item EINA_UNUSED, Elm_List_Item_Da item->deleted = EINA_TRUE; sd->items = eina_list_remove_list(sd->items, item->node); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + evas_object_data_del(item->node, "elm-parent"); + efl_access_object_access_parent_set(item->node, NULL); + // item->node = NULL; } @@ -2845,6 +2849,10 @@ _elm_list_item_append(Eo *obj, Elm_List_Data *sd, const char *label, Evas_Object it = _item_new(obj, label, icon, end, func, data); sd->items = eina_list_append(sd->items, EO_OBJ(it)); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + evas_object_data_set(EO_OBJ(it), "elm-parent", obj); + efl_access_object_access_parent_set(EO_OBJ(it), obj); + // it->node = eina_list_last(sd->items); elm_box_pack_end(sd->box, VIEW(it)); @@ -2862,6 +2870,10 @@ _elm_list_item_prepend(Eo *obj, Elm_List_Data *sd, const char *label, Evas_Objec it = _item_new(obj, label, icon, end, func, data); sd->items = eina_list_prepend(sd->items, EO_OBJ(it)); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + evas_object_data_set(EO_OBJ(it), "elm-parent", obj); + efl_access_object_access_parent_set(EO_OBJ(it), obj); + // it->node = sd->items; elm_box_pack_start(sd->box, VIEW(it)); @@ -2884,6 +2896,10 @@ _elm_list_item_insert_before(Eo *obj, Elm_List_Data *sd, Elm_Object_Item *eo_bef it = _item_new(obj, label, icon, end, func, data); sd->items = eina_list_prepend_relative_list(sd->items, EO_OBJ(it), before_it->node); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + evas_object_data_set(EO_OBJ(it), "elm-parent", obj); + efl_access_object_access_parent_set(EO_OBJ(it), obj); + // it->node = before_it->node->prev; elm_box_pack_before(sd->box, VIEW(it), VIEW(before_it)); @@ -2906,6 +2922,10 @@ _elm_list_item_insert_after(Eo *obj, Elm_List_Data *sd, Elm_Object_Item *eo_afte it = _item_new(obj, label, icon, end, func, data); sd->items = eina_list_append_relative_list(sd->items, EO_OBJ(it), after_it->node); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + evas_object_data_set(EO_OBJ(it), "elm-parent", obj); + efl_access_object_access_parent_set(EO_OBJ(it), obj); + // it->node = after_it->node->next; elm_box_pack_after(sd->box, VIEW(it), VIEW(after_it)); @@ -2924,6 +2944,10 @@ _elm_list_item_sorted_insert(Eo *obj, Elm_List_Data *sd, const char *label, Evas it = _item_new(obj, label, icon, end, func, data); sd->items = eina_list_sorted_insert(sd->items, cmp_func, EO_OBJ(it)); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + evas_object_data_set(EO_OBJ(it), "elm-parent", obj); + efl_access_object_access_parent_set(EO_OBJ(it), obj); + // l = eina_list_data_find_list(sd->items, EO_OBJ(it)); l = eina_list_next(l); if (!l) @@ -3239,6 +3263,12 @@ EOLIAN Eina_List* _elm_list_efl_access_object_access_children_get(const Eo *obj, Elm_List_Data *pd) { Eina_List *ret; + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *it; + EINA_LIST_FOREACH(pd->items, ret, it) + efl_access_object_access_parent_set(it, obj); + // + ret = efl_access_object_access_children_get(efl_super(obj, ELM_LIST_CLASS)); return eina_list_merge(eina_list_clone(pd->items), ret); } diff --git a/src/lib/elementary/elm_menu.c b/src/lib/elementary/elm_menu.c index 3040c08..3aa9eff 100644 --- a/src/lib/elementary/elm_menu.c +++ b/src/lib/elementary/elm_menu.c @@ -1313,6 +1313,12 @@ EOLIAN static Eina_List* _elm_menu_efl_access_object_access_children_get(const Eo *obj, Elm_Menu_Data *sd) { Eina_List *ret; + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eo *it; + EINA_LIST_FOREACH(sd->items, ret, it) + efl_access_object_access_parent_set(it, obj); + // + ret = efl_access_object_access_children_get(efl_super(obj, ELM_MENU_CLASS)); return eina_list_merge(eina_list_clone(sd->items), ret); } @@ -1320,6 +1326,13 @@ _elm_menu_efl_access_object_access_children_get(const Eo *obj, Elm_Menu_Data *sd EOLIAN static Eina_List* _elm_menu_item_efl_access_object_access_children_get(const Eo *obj EINA_UNUSED, Elm_Menu_Item_Data *sd) { + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + Eina_List *ret; + Eo *it; + EINA_LIST_FOREACH(sd->submenu.items, ret, it) + efl_access_object_access_parent_set(it, obj); + // + return eina_list_clone(sd->submenu.items); } diff --git a/src/lib/elementary/elm_toolbar.c b/src/lib/elementary/elm_toolbar.c index c7a1d03..ed06332 100644 --- a/src/lib/elementary/elm_toolbar.c +++ b/src/lib/elementary/elm_toolbar.c @@ -4238,7 +4238,12 @@ _elm_toolbar_efl_access_object_access_children_get(const Eo *obj EINA_UNUSED, El ret2 = efl_access_object_access_children_get(efl_super(obj, ELM_TOOLBAR_CLASS)); EINA_INLIST_FOREACH(sd->items, it) - ret = eina_list_append(ret, EO_OBJ(it)); + { + ret = eina_list_append(ret, EO_OBJ(it)); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(EO_OBJ(it), obj); + // + } return eina_list_merge(ret, ret2); } diff --git a/src/lib/elementary_tizen/elc_ctxpopup.c b/src/lib/elementary_tizen/elc_ctxpopup.c index 0cf7ccb..1c75792 100644 --- a/src/lib/elementary_tizen/elc_ctxpopup.c +++ b/src/lib/elementary_tizen/elc_ctxpopup.c @@ -2758,7 +2758,12 @@ _elm_ctxpopup_efl_access_object_access_children_get(const Eo *eo_item EINA_UNUSE Elm_Ctxpopup_Item_Data *it; EINA_LIST_FOREACH(sd->items, l, it) - ret = eina_list_append(ret, EO_OBJ(it)); + { + ret = eina_list_append(ret, EO_OBJ(it)); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(EO_OBJ(it), eo_item); + // + } return ret; } diff --git a/src/lib/elementary_tizen/elm_genlist.c b/src/lib/elementary_tizen/elm_genlist.c index ed96938..414fea4 100644 --- a/src/lib/elementary_tizen/elm_genlist.c +++ b/src/lib/elementary_tizen/elm_genlist.c @@ -9276,8 +9276,11 @@ _elm_genlist_item_efl_access_object_access_children_get(const Eo *eo_it EINA_UNU part = edje_object_part_swallow_get(VIEW(it), key); if (part && efl_isa(part, EFL_ACCESS_OBJECT_MIXIN)) { - ret = eina_list_append(ret, part); - efl_parent_set(part, eo_it); + ret = eina_list_append(ret, part); + efl_parent_set(part, eo_it); + //TIZEN_ONLY(20181024): Fix parent-children incosistencies in atspi tree + efl_access_object_access_parent_set(part, eo_it); + // } } } @@ -9454,14 +9457,23 @@ _elm_genlist_efl_access_widget_action_elm_actions_get(const Eo *obj EINA_UNUSED, EOLIAN Eina_List* _elm_genlist_efl_access_object_access_children_get(const Eo *obj, Elm_Genlist_Data *sd) { - Eina_List *ret = NULL, *ret2 = NULL; + Eina_List *ret = NULL, *ret2 = NULL, *ret3; Elm_Gen_Item *it; EINA_INLIST_FOREACH(sd->items, it) - ret = eina_list_append(ret, EO_OBJ(it)); + { + ret = eina_list_append(ret, EO_OBJ(it)); + efl_access_object_access_parent_set(EO_OBJ(it), obj); + } ret2 = efl_access_object_access_children_get(efl_super(obj, ELM_GENLIST_CLASS)); + Eo *eo; + EINA_LIST_FOREACH(ret2, ret3, eo) + { + efl_access_object_access_parent_set(eo, obj); + } + return eina_list_merge(ret, ret2); }