jaehyun pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=2f9b4a7080b0b3ed1cf3f98e73f19e7fa135afae

commit 2f9b4a7080b0b3ed1cf3f98e73f19e7fa135afae
Author: Jaehyun Cho <jae_hyun....@samsung.com>
Date:   Fri Mar 6 13:25:04 2020 +0900

    elc_naviframe: fix to delete item once by elm_object_item_del in pop_cb
    
    If elm_object_item_del is called in pop_cb and pop_cb returns
    EINA_FALSE, then the given item is destructed by _item_noref when
    efl_unref is called after pop_cb.
    
    After the above destruction, efl_del is called after the above efl_unref
    and it deletes the item again.
    
    Not to delete item after the item is destructed, efl_del after pop_cb is
    removed.
---
 src/bin/elementary/test_naviframe.c | 43 ++++++++++++++++++++++++++++++++++---
 src/lib/elementary/elc_naviframe.c  |  4 +---
 2 files changed, 41 insertions(+), 6 deletions(-)

diff --git a/src/bin/elementary/test_naviframe.c 
b/src/bin/elementary/test_naviframe.c
index 81696148ba..36e4bdb332 100644
--- a/src/bin/elementary/test_naviframe.c
+++ b/src/bin/elementary/test_naviframe.c
@@ -65,6 +65,43 @@ _promote(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
    elm_naviframe_item_promote(data);
 }
 
+Eina_Bool
+_pop_cb(void *data EINA_UNUSED, Elm_Object_Item *it)
+{
+   elm_object_item_del(it);
+
+   /* If EINA_TRUE is returned, pop transition effect happens and then the item
+    * is automatically deleted.
+    * If EINA_FALSE is returned, pop transition effect does not happen and the
+    * item is not automatically deleted.
+    */
+   return EINA_FALSE;
+}
+
+void
+_page9(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   Evas_Object *bt, *bt2, *nf = data;
+   Elm_Object_Item *it;
+
+   bt = elm_button_add(nf);
+   evas_object_size_hint_align_set(bt, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   BUTTON_TEXT_SET(bt, "Page 8");
+
+   bt2 = elm_button_add(nf);
+   evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   BUTTON_TEXT_SET(bt2, "Page 1");
+   evas_object_smart_callback_add(bt2, "clicked", _promote,
+                                  evas_object_data_get(nf, "page1"));
+
+   it = elm_naviframe_item_push(nf, "Page 9", bt, bt2, NULL, NULL);
+   elm_object_item_part_text_set(it, "subtitle", "Callback for naviframe item 
pop is set");
+
+   elm_naviframe_item_pop_cb_set(it, _pop_cb, NULL);
+
+   evas_object_smart_callback_add(bt, "clicked", _navi_pop, nf);
+}
+
 void
 _page8(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
@@ -78,9 +115,9 @@ _page8(void *data, Evas_Object *obj EINA_UNUSED, void 
*event_info EINA_UNUSED)
 
    bt2 = elm_button_add(nf);
    evas_object_size_hint_align_set(bt2, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   BUTTON_TEXT_SET(bt2, "Page 1");
-   evas_object_smart_callback_add(bt2, "clicked", _promote,
-                                  evas_object_data_get(nf, "page1"));
+   BUTTON_TEXT_SET(bt2, "Page 9");
+   evas_object_smart_callback_add(bt2, "clicked", _page9, nf);
+
    content = _content_new(nf, img6);
    it = elm_naviframe_item_push(nf, "Page 8", bt, bt2, content, NULL);
    elm_object_item_part_text_set(it, "subtitle", "Overlap style!");
diff --git a/src/lib/elementary/elc_naviframe.c 
b/src/lib/elementary/elc_naviframe.c
index 10368cb014..894d88e641 100644
--- a/src/lib/elementary/elc_naviframe.c
+++ b/src/lib/elementary/elc_naviframe.c
@@ -1733,9 +1733,7 @@ _elm_naviframe_item_pop(Eo *obj, Elm_Naviframe_Data *sd)
         if (!it->pop_cb(it->pop_data, eo_item))
           {
              efl_unref(eo_item);
-             if (it->delete_me)
-               efl_del(eo_item);
-             else
+             if (!it->delete_me)
                {
                   /* To avoid multiple item pops, the auto pushed button 
deletes
                      its clicked callback once it is called.

-- 


Reply via email to