efl_ui_focus_layer: elm_widget_top_get considered harmfull
authorMarcel Hollerbach <mail@marcel-hollerbach.de>
Fri, 29 Jun 2018 15:31:56 +0000 (11:31 -0400)
committerBowon Ryu <bowon.ryu@samsung.com>
Wed, 4 Jul 2018 05:15:16 +0000 (14:15 +0900)
Summary:
You think elm_widget_top_get returns a window object ? Oh no! For the
case that the widget tree splits, and the widget_parent gets NULL of
some widget in the chain, elm_widget_top_get returns where the NULL
reference is placed.

For the case of elm_notify this is somehow intended, as the notify does
not have a parent when the parent is deleted.

ref T7090

Reviewers: netstar, zmike, devilhorns

Reviewed By: zmike

Subscribers: cedric, #committers

Tags: #efl

Maniphest Tasks: T7090

Differential Revision: https://phab.enlightenment.org/D6471

src/lib/elementary/efl_ui_focus_layer.c

index b95ac53..e5ee624 100644 (file)
@@ -69,10 +69,10 @@ _efl_ui_focus_layer_efl_object_destructor(Eo *obj, Efl_Ui_Focus_Layer_Data *pd E
 }
 
 EOLIAN static Efl_Ui_Focus_Manager*
-_efl_ui_focus_layer_efl_ui_focus_object_focus_manager_get(const Eo *obj, Efl_Ui_Focus_Layer_Data *pd EINA_UNUSED)
+_efl_ui_focus_layer_efl_ui_focus_object_focus_manager_get(const Eo *obj EINA_UNUSED, Efl_Ui_Focus_Layer_Data *pd EINA_UNUSED)
 {
    if (pd->registered_manager)
-     return elm_widget_top_get(obj);
+     return pd->registered_manager;
    else
      return NULL;
 }
@@ -122,6 +122,7 @@ _efl_ui_focus_layer_enable_set(Eo *obj, Efl_Ui_Focus_Layer_Data *pd, Eina_Bool v
         Efl_Ui_Focus_Manager *manager;
 
         pd->registered_manager = elm_widget_top_get(obj);
+        EINA_SAFETY_ON_FALSE_RETURN(efl_isa(pd->registered_manager, EFL_UI_WIN_CLASS));
         manager = efl_ui_focus_util_active_manager(EFL_UI_FOCUS_UTIL_CLASS, pd->registered_manager);
 
         efl_ui_focus_manager_calc_register_logical(pd->registered_manager, obj, efl_ui_focus_manager_root_get(pd->registered_manager), obj);