e_view_layout: Fix destroy error 20/320720/1
authorJunkyeong Kim <jk0430.kim@samsung.com>
Thu, 6 Mar 2025 10:21:27 +0000 (19:21 +0900)
committerTizen Window System <tizen.windowsystem@gmail.com>
Thu, 6 Mar 2025 11:28:36 +0000 (20:28 +0900)
Prevent e_view_layout_destroy abort.

Change-Id: I31686e41261a21b0798dba81dba51cba1e1d437d

src/bin/core/e_view_layout.c
tests/tc-e_view_layout.cpp

index a371de15c7f04c0bd1cbdf644ec64d6df52e0be2..7dc345e96e59d68a799fbfff4b1bc7a9c0bf4774 100644 (file)
@@ -31,39 +31,6 @@ struct _E_View_Layout_Item
    struct wl_list link;
 };
 
-static void _e_view_layout_disown(E_View *child);
-static void _view_layout_handle_destroy(E_View_Tree *tree);
-
-E_View_Tree_Impl view_layout_tree_impl = {
-   .destroy = _view_layout_handle_destroy,
-};
-
-static E_View_Layout *
-_view_layout_from_tree(E_View_Tree *tree)
-{
-   E_View_Layout *layout;
-   assert(tree->impl == &view_layout_tree_impl);
-   return wl_container_of(tree, layout, tree);
-}
-
-static void
-_view_layout_handle_destroy(E_View_Tree *tree)
-{
-   E_View_Layout *layout = _view_layout_from_tree(tree);
-   E_View_Layout_Item *li, *li_tmp;
-
-   if (!wl_list_empty(&layout->items))
-     {
-        wl_list_for_each_safe(li, li_tmp, &layout->items, link)
-         {
-            wl_list_remove(&li->link);
-            _e_view_layout_disown(li->view);
-         }
-     }
-
-   free(layout);
-}
-
 static void
 _e_view_layout_move_resize_item(E_View_Layout_Item *li)
 {
@@ -232,7 +199,7 @@ e_view_layout_create(E_View_Tree *parent)
 
    wl_list_init(&layout->items);
 
-   e_view_tree_init(&layout->tree, &view_layout_tree_impl, parent);
+   e_view_tree_init(&layout->tree, NULL, parent);
 //   e_view_reorderable_set(&layout->tree.view, false);
 
    layout->vw = 1;
@@ -241,16 +208,31 @@ e_view_layout_create(E_View_Tree *parent)
    layout->clip = e_view_rect_create(&layout->tree, 200002, 200002, color);
    e_view_position_set(e_view_rect_view_get(layout->clip), -100001, -100001);
 
-//   evas_object_intercept_layer_set_callback_add(obj, _e_layout_intercept_layer_set, sd);
-
    return layout;
 }
 
-E_API void e_view_layout_destroy(E_View_Layout *layout)
+E_API void
+e_view_layout_destroy(E_View_Layout *layout)
 {
+   E_View_Layout_Item *li, *li_tmp;
+   E_View *view;
+
    if (!layout) return;
 
-   e_view_destroy(e_view_tree_view_get(&layout->tree));
+   if (!wl_list_empty(&layout->items))
+     {
+        wl_list_for_each_safe(li, li_tmp, &layout->items, link)
+         {
+            wl_list_remove(&li->link);
+            _e_view_layout_disown(li->view);
+         }
+     }
+
+   e_view_destroy(e_view_rect_view_get(layout->clip));
+   view = e_view_tree_view_get(&layout->tree);
+   wl_list_remove(&view->link);
+
+   free(layout);
 }
 
 E_API void
index ace0f1a19930470316e4a4c2f1d7b8acebb8c82b..b126194b6e6a4b848c014ef3b740eb6f38fc355c 100644 (file)
@@ -76,7 +76,8 @@ TEST_F(EViewLayoutTest, Test_E_View_Layout_Pack_UnPack)
 
    EXPECT_CALL(*evasMock, evas_object_data_set(_, _, _))
       .Times(AnyNumber());
-   EXPECT_CALL(*evasMock, evas_object_layer_set(_, _));
+   EXPECT_CALL(*evasMock, evas_object_layer_set(_, _))
+      .Times(2);
    EXPECT_CALL(*evasMock, evas_object_stack_above(_, _));
    EXPECT_CALL(*evasMock, evas_object_move(_, _, _))
       .Times(3);
@@ -120,7 +121,7 @@ TEST_F(EViewLayoutTest, Test_E_View_Layout_Virtual_Size_Set)
       .WillOnce(Return(obj));
    EXPECT_CALL(*evasMock, evas_object_resize(obj, 200002, 200002));
    EXPECT_CALL(*evasMock, evas_object_move(obj, _, _))
-      .Times(2);;
+      .Times(2);
    EXPECT_CALL(*evasMock, evas_object_color_set(obj, color[0], color[1], color[2], color[3]));
    EXPECT_CALL(*evasMock, evas_object_data_set(_, _, _));
    E_View_Layout *layout = e_view_layout_create(this->tree);
@@ -152,7 +153,8 @@ TEST_F(EViewLayoutTest, Test_E_View_Layout_Children_Move)
 
    EXPECT_CALL(*evasMock, evas_object_data_set(_, _, _))
       .Times(AnyNumber());
-   EXPECT_CALL(*evasMock, evas_object_layer_set(_, _));
+   EXPECT_CALL(*evasMock, evas_object_layer_set(_, _))
+      .Times(2);
    EXPECT_CALL(*evasMock, evas_object_stack_above(_, _));
    EXPECT_CALL(*evasMock, evas_object_move(_, _, _))
       .Times(3);
@@ -208,7 +210,8 @@ TEST_F(EViewLayoutTest, Test_E_View_Layout_Children_Resize)
 
    EXPECT_CALL(*evasMock, evas_object_data_set(_, _, _))
       .Times(AnyNumber());
-   EXPECT_CALL(*evasMock, evas_object_layer_set(_, _));
+   EXPECT_CALL(*evasMock, evas_object_layer_set(_, _))
+      .Times(2);
    EXPECT_CALL(*evasMock, evas_object_stack_above(_, _));
    EXPECT_CALL(*evasMock, evas_object_move(_, _, _))
       .Times(3);
@@ -264,7 +267,8 @@ TEST_F(EViewLayoutTest, Test_E_View_Layout_Children_Raise)
 
    EXPECT_CALL(*evasMock, evas_object_data_set(_, _, _))
       .Times(AnyNumber());
-   EXPECT_CALL(*evasMock, evas_object_layer_set(_, _));
+   EXPECT_CALL(*evasMock, evas_object_layer_set(_, _))
+      .Times(2);
    EXPECT_CALL(*evasMock, evas_object_stack_above(_, _));
    EXPECT_CALL(*evasMock, evas_object_move(_, _, _))
       .Times(3);