elc_filselector: solve the mysterium of sometimes failing tests
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Wed, 27 Mar 2019 20:15:53 +0000 (21:15 +0100)
committerJunsuChoi <jsuya.choi@samsung.com>
Tue, 2 Apr 2019 04:14:38 +0000 (13:14 +0900)
so after a phone call, two days of debugging, tears, crying etc. etc. we
finally came to a point of enlightenment! *Someone* (bu5hm4n) moved
gengrid and genlist events from eo back to smart events, so we can work
arround legacy borks and event-name collisions, at this point he did not
knew that some widgets (fileselector) already relied on those *lovely*
events. Hence this broke theoretically the testsuite, however, the
fileselector testsuite is ultimatily buggy, and the wait function does
not return false when it timeouts, (i don't know why not). So this break
was never discovered.

Additionally there is a second issue. it appears, that when we
immidiatly quit the mainloop after we have got the selected callback,
that then genlist decides to forget about the sd->selected pointer, and
NULLs that one out. Which then results in the fact that
elm_fileselector_selected_get ends up returning invalid paths.

Reviewed-by: Cedric BAIL <cedric.bail@free.fr>
Differential Revision: https://phab.enlightenment.org/D8488

src/lib/elementary/elc_fileselector.c
src/tests/elementary/elm_test_fileselector.c

index 2663416..a433d46 100644 (file)
@@ -1164,10 +1164,10 @@ _clear_selections(Elm_Fileselector_Data *sd, Elm_Object_Item *last_selected)
 }
 
 static void
-_on_item_selected(void *data, const Efl_Event *event)
+_on_item_selected(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    //This event_info could be a list or gengrid item
-   Elm_Object_Item *it = event->info;
+   Elm_Object_Item *it = event_info;
    Elm_Fileselector_Item_Data *it_data = NULL;
 
    ELM_FILESELECTOR_DATA_GET(data, sd);
@@ -1254,12 +1254,12 @@ _on_item_selected(void *data, const Efl_Event *event)
 }
 
 static void
-_on_item_unselected(void *data, const Efl_Event *event)
+_on_item_unselected(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
 {
    Eina_List *li, *l;
    const Elm_Fileselector_Item_Data *it_data;
    Eina_Strbuf *buf;
-   Elm_Object_Item *it = event->info;
+   Elm_Object_Item *it = event_info;
    Elm_Object_Item *it2 = NULL;
    Eina_Bool first = EINA_TRUE;
 
@@ -1555,10 +1555,8 @@ _files_list_add(Evas_Object *obj)
    evas_object_data_set(li, "parent", obj);
    efl_ui_mirrored_automatic_set(li, EINA_FALSE);
 
-   efl_event_callback_add
-     (li, EFL_UI_EVENT_ITEM_SELECTED, _on_item_selected, obj);
-   efl_event_callback_add
-     (li, EFL_UI_EVENT_ITEM_UNSELECTED, _on_item_unselected, obj);
+   evas_object_smart_callback_add(li, "selected", _on_item_selected, obj);
+   evas_object_smart_callback_add(li, "unselected", _on_item_unselected, obj);
    efl_event_callback_add
      (li, ELM_GENLIST_EVENT_ACTIVATED, _on_item_activated, obj);
    efl_event_callback_add
@@ -1592,10 +1590,8 @@ _files_grid_add(Evas_Object *obj)
 
    elm_gengrid_align_set(grid, 0.0, 0.0);
 
-   efl_event_callback_add
-     (grid, EFL_UI_EVENT_ITEM_SELECTED, _on_item_selected, obj);
-   efl_event_callback_add
-     (grid, EFL_UI_EVENT_ITEM_UNSELECTED, _on_item_unselected, obj);
+   evas_object_smart_callback_add(grid, "selected", _on_item_selected, obj);
+   evas_object_smart_callback_add(grid, "unselected", _on_item_unselected, obj);
    efl_event_callback_add
      (grid, ELM_GENGRID_EVENT_ACTIVATED, _on_item_activated, obj);
    efl_event_callback_add
index c7ffaca..be8b53d 100644 (file)
@@ -86,8 +86,6 @@ _ready_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED
 {
     Eina_Bool *ret = data;
     *ret = EINA_TRUE;
-
-    ecore_main_loop_quit();
 }
 
 EFL_START_TEST(elm_fileselector_selected)
@@ -131,7 +129,7 @@ EFL_START_TEST(elm_fileselector_selected)
    selected = EINA_FALSE;
    ck_assert(elm_fileselector_selected_set(fileselector, exist));
    ck_assert(fileselector_test_helper_wait_flag(10, &selected));
-
+   ck_assert(selected == EINA_TRUE);
    ck_assert_str_eq(elm_fileselector_selected_get(fileselector), exist);
 
    eina_stringshare_del(exist);