Make sure invalid default label is removed before searching the list 65/312765/4
authorYoungsun Suh <youngsun.suh@samsung.com>
Fri, 14 Jun 2024 04:21:01 +0000 (13:21 +0900)
committerYoungsun Suh <youngsun.suh@samsung.com>
Mon, 17 Jun 2024 05:39:04 +0000 (14:39 +0900)
Change-Id: I36a639e05b73f6cda82d0f770f47651ff60328cc

dali/devel-api/adaptor-framework/accessibility-bridge.h
dali/devel-api/adaptor-framework/accessibility.cpp
dali/devel-api/atspi-interfaces/accessible.h
dali/internal/accessibility/bridge/bridge-base.cpp
dali/internal/accessibility/bridge/bridge-base.h
dali/internal/accessibility/bridge/dummy/dummy-atspi.h

index 6d30da6..3cac8f5 100644 (file)
@@ -99,7 +99,7 @@ struct DALI_ADAPTOR_API Bridge
    *
    * @param[in] object The accessible object
    */
-  virtual void RegisterDefaultLabel(Accessible* object) = 0;
+  virtual void RegisterDefaultLabel(std::shared_ptr<Accessible> object) = 0;
 
   /**
    * @brief Removes object from the stack of "default label" sourcing objects.
@@ -108,7 +108,7 @@ struct DALI_ADAPTOR_API Bridge
    *
    * @param[in] object The accessible object
    */
-  virtual void UnregisterDefaultLabel(Accessible* object) = 0;
+  virtual void UnregisterDefaultLabel(std::shared_ptr<Accessible> object) = 0;
 
   /**
    * @brief Gets the top-most object from the stack of "default label" sourcing objects.
@@ -126,7 +126,7 @@ struct DALI_ADAPTOR_API Bridge
    * Following strings are valid values for "default_label" attribute: "enabled", "disabled".
    * Any other value will be interpreted as "enabled".
    */
-  virtual Accessible* GetDefaultLabel(Accessible* root) const = 0;
+  virtual Accessible* GetDefaultLabel(Accessible* root) = 0;
 
   /**
    * @brief Sets name of current application which will be visible on accessibility bus.
@@ -302,14 +302,14 @@ struct DALI_ADAPTOR_API Bridge
    *
    * @param obj Accessible Object
    */
-  virtual void EmitScrollStarted(Accessible *obj) = 0;
+  virtual void EmitScrollStarted(Accessibleobj) = 0;
 
-    /**
+  /**
    * @brief Emits ScrollFinished event on at-spi bus.
    *
    * @param obj Accessible Object
    */
-  virtual void EmitScrollFinished(Accessible *obj) = 0;
+  virtual void EmitScrollFinished(Accessibleobj) = 0;
 
   /**
    * @brief Emits state-changed event on at-spi bus.
@@ -357,7 +357,7 @@ struct DALI_ADAPTOR_API Bridge
    * The actual number of events emitted during a given time interval may be smaller
    * than the number of calls to this method, but at least one is guaranteed.
    */
-  virtual void EmitPostRender(Accessible *obj) = 0;
+  virtual void EmitPostRender(Accessibleobj) = 0;
 
   /**
    * @brief Emits key event on at-spi bus.
index f69c96c..4b4fe25 100644 (file)
@@ -40,8 +40,8 @@
 #include <dali/devel-api/atspi-interfaces/hypertext.h>
 #include <dali/devel-api/atspi-interfaces/selection.h>
 #include <dali/devel-api/atspi-interfaces/socket.h>
-#include <dali/devel-api/atspi-interfaces/table.h>
 #include <dali/devel-api/atspi-interfaces/table-cell.h>
+#include <dali/devel-api/atspi-interfaces/table.h>
 #include <dali/devel-api/atspi-interfaces/text.h>
 #include <dali/devel-api/atspi-interfaces/value.h>
 #include <dali/internal/adaptor/common/adaptor-impl.h>
@@ -451,7 +451,7 @@ public:
       state[State::VISIBLE]   = true;
       state[State::ACTIVE]    = visible;
     }
-    else if (GetParent())
+    else if(GetParent())
     {
       auto parentState      = GetParent()->GetStates();
       state[State::SHOWING] = parentState[State::SHOWING];
@@ -495,22 +495,22 @@ public:
 
   void SetListenPostRender(bool enabled) override
   {
-    if (!mRoot)
+    if(!mRoot)
     {
       return;
     }
 
-    auto window                                 = Dali::DevelWindow::Get(Self());
+    auto                             window     = Dali::DevelWindow::Get(Self());
     Dali::Internal::Adaptor::Window& windowImpl = Dali::GetImplementation(window);
 
     if(!mRenderNotification)
     {
       mRenderNotification = std::unique_ptr<TriggerEventInterface>(
-                                           TriggerEventFactory::CreateTriggerEvent(MakeCallback(this, &AdaptorAccessible::OnPostRender),
-                                           TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER));
+        TriggerEventFactory::CreateTriggerEvent(MakeCallback(this, &AdaptorAccessible::OnPostRender),
+                                                TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER));
     }
 
-    if (enabled)
+    if(enabled)
     {
       windowImpl.SetRenderNotification(mRenderNotification.get());
     }
@@ -526,7 +526,7 @@ public:
   }
 }; // AdaptorAccessible
 
-using AdaptorAccessiblesType = std::unordered_map<const Dali::RefObject*, std::unique_ptr<AdaptorAccessible> >;
+using AdaptorAccessiblesType = std::unordered_map<const Dali::RefObject*, std::shared_ptr<AdaptorAccessible>>;
 
 // Save RefObject from an Actor in Accessible::Get()
 AdaptorAccessiblesType& GetAdaptorAccessibles()
@@ -535,7 +535,7 @@ AdaptorAccessiblesType& GetAdaptorAccessibles()
   return gAdaptorAccessibles;
 }
 
-std::function<Accessible*(Dali::Actor)> convertingFunctor = [](Dali::Actor) -> Accessible* {
+std::function<std::shared_ptr<Accessible>(Dali::Actor)> convertingFunctor = [](Dali::Actor) -> std::shared_ptr<Accessible> {
   return nullptr;
 };
 
@@ -550,12 +550,12 @@ void Accessible::SetObjectRegistry(ObjectRegistry registry)
   });
 }
 
-void Accessible::RegisterExternalAccessibleGetter(std::function<Accessible*(Dali::Actor)> functor)
+void Accessible::RegisterExternalAccessibleGetter(std::function<std::shared_ptr<Accessible>(Dali::Actor)> functor)
 {
   convertingFunctor = functor;
 }
 
-Accessible* Accessible::Get(Dali::Actor actor)
+std::shared_ptr<Accessible> Accessible::GetOwningPtr(Dali::Actor actor)
 {
   if(!actor)
   {
@@ -576,8 +576,14 @@ Accessible* Accessible::Get(Dali::Actor actor)
       }
       pair.first->second.reset(new AdaptorAccessible(actor, isRoot));
     }
-    accessible = pair.first->second.get();
+    accessible = pair.first->second;
   }
 
   return accessible;
 }
+
+Accessible* Accessible::Get(Dali::Actor actor)
+{
+  auto accessible = Accessible::GetOwningPtr(actor);
+  return accessible ? accessible.get() : nullptr;
+}
\ No newline at end of file
index f34f9e3..3590817 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_ADAPTOR_ATSPI_ACCESSIBLE_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -459,18 +459,27 @@ public:
    * @brief The method registers functor resposible for converting Actor into Accessible.
    * @param functor The returning Accessible handle from Actor object
    */
-  static void RegisterExternalAccessibleGetter(std::function<Accessible*(Dali::Actor)> functor);
+  static void RegisterExternalAccessibleGetter(std::function<std::shared_ptr<Accessible>(Dali::Actor)> functor);
 
   /**
    * @brief Acquires Accessible object from Actor object.
    *
    * @param[in] actor Actor object
    *
-   * @return The handle to Accessible object
+   * @return The raw pointer to Accessible object
    */
   static Accessible* Get(Dali::Actor actor);
 
   /**
+   * @brief Acquires Accessible object from Actor object.
+   *
+   * @param[in] actor Actor object
+   *
+   * @return The owning pointer to Accessible object
+   */
+  static std::shared_ptr<Accessible> GetOwningPtr(Dali::Actor actor);
+
+  /**
    * @brief Obtains the DBus interface name for the specified AT-SPI interface.
    *
    * @param interface AT-SPI interface identifier (e.g. AtspiInterface::ACCESSIBLE)
index 30e6cf4..ba4e154 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -88,7 +88,7 @@ bool BridgeBase::TickCoalescableMessages()
       if(functor)
       {
         functor();
-        functor = {};
+        functor   = {};
         countdown = countdownBase;
       }
       else
@@ -234,24 +234,25 @@ void BridgeBase::CompressDefaultLabels()
 {
   // Remove entries for objects which no longer exist
   mDefaultLabels.remove_if([](const DefaultLabelType& label) {
-    return !label.first.GetBaseHandle(); // Check window's weak handle
-    // TODO: Once Accessible becomes a handle type, check its weak handle here as well
+    // Check 1) window's weak handle; 2) accessible's ref object
+    return !label.first.GetBaseHandle() || label.second.expired();
   });
 }
 
-void BridgeBase::RegisterDefaultLabel(Accessible* object)
+void BridgeBase::RegisterDefaultLabel(std::shared_ptr<Accessible> object)
 {
   CompressDefaultLabels();
 
-  Dali::WeakHandle<Dali::Window> window = GetWindow(object);
+  Dali::WeakHandle<Dali::Window> window = GetWindow(object.get());
   if(!window.GetBaseHandle()) // true also if `object` is null
   {
     DALI_LOG_ERROR("Cannot register default label: object does not belong to any window");
     return;
   }
 
-  auto it = std::find_if(mDefaultLabels.begin(), mDefaultLabels.end(), [object](const DefaultLabelType& label) {
-    return object == label.second;
+  auto it = std::find_if(mDefaultLabels.begin(), mDefaultLabels.end(), [&object](const DefaultLabelType& label) {
+    auto labelPtr = label.second.lock();
+    return labelPtr && object == labelPtr;
   });
 
   if(it == mDefaultLabels.end())
@@ -270,17 +271,20 @@ void BridgeBase::RegisterDefaultLabel(Accessible* object)
   }
 }
 
-void BridgeBase::UnregisterDefaultLabel(Accessible* object)
+void BridgeBase::UnregisterDefaultLabel(std::shared_ptr<Accessible> object)
 {
   CompressDefaultLabels();
 
-  mDefaultLabels.remove_if([object](const DefaultLabelType& label) {
-    return object == label.second;
+  mDefaultLabels.remove_if([&object](const DefaultLabelType& label) {
+    auto labelPtr = label.second.lock();
+    return labelPtr && object == labelPtr;
   });
 }
 
-Accessible* BridgeBase::GetDefaultLabel(Accessible* root) const
+Accessible* BridgeBase::GetDefaultLabel(Accessible* root)
 {
+  CompressDefaultLabels();
+
   Dali::WeakHandle<Dali::Window> window = GetWindow(root);
   if(!window.GetBaseHandle())
   {
@@ -291,7 +295,16 @@ Accessible* BridgeBase::GetDefaultLabel(Accessible* root) const
     return window == label.first;
   });
 
-  return (it == mDefaultLabels.rend()) ? root : it->second;
+  Accessible* rawPtr = root;
+  if(it != mDefaultLabels.rend())
+  {
+    if(auto labelPtr = it->second.lock())
+    {
+      rawPtr = labelPtr.get();
+    }
+  }
+
+  return rawPtr;
 }
 
 std::string BridgeBase::StripPrefix(const std::string& path)
index 6c72399..2cfcab0 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_ACCESSIBILITY_BRIDGE_BASE_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -283,12 +283,12 @@ public:
  */
 enum class CoalescableMessages
 {
-  BOUNDS_CHANGED, ///< Bounds changed
-  SET_OFFSET, ///< Set offset
-  POST_RENDER, ///< Post render
-  STATE_CHANGED_BEGIN = 500, ///< State changed (begin of reserved range)
-  STATE_CHANGED_END   = STATE_CHANGED_BEGIN + 99, ///< State changed (end of reserved range)
-  PROPERTY_CHANGED_BEGIN, ///< Property changed (begin of reserved range)
+  BOUNDS_CHANGED,                                     ///< Bounds changed
+  SET_OFFSET,                                         ///< Set offset
+  POST_RENDER,                                        ///< Post render
+  STATE_CHANGED_BEGIN = 500,                          ///< State changed (begin of reserved range)
+  STATE_CHANGED_END   = STATE_CHANGED_BEGIN + 99,     ///< State changed (end of reserved range)
+  PROPERTY_CHANGED_BEGIN,                             ///< Property changed (begin of reserved range)
   PROPERTY_CHANGED_END = PROPERTY_CHANGED_BEGIN + 99, ///< Property changed (end of reserved range)
 };
 
@@ -364,17 +364,17 @@ public:
   /**
    * @copydoc Dali::Accessibility::Bridge::RegisterDefaultLabel()
    */
-  void RegisterDefaultLabel(Dali::Accessibility::Accessible* object) override;
+  void RegisterDefaultLabel(std::shared_ptr<Dali::Accessibility::Accessible> object) override;
 
   /**
    * @copydoc Dali::Accessibility::Bridge::UnregisterDefaultLabel()
    */
-  void UnregisterDefaultLabel(Dali::Accessibility::Accessible* object) override;
+  void UnregisterDefaultLabel(std::shared_ptr<Dali::Accessibility::Accessible> object) override;
 
   /**
    * @copydoc Dali::Accessibility::Bridge::GetDefaultLabel()
    */
-  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) const override;
+  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) override;
 
   /**
    * @copydoc Dali::Accessibility::Bridge::GetApplication()
@@ -618,7 +618,7 @@ public:
 
 protected:
   // We use a weak handle in order not to keep a window alive forever if someone forgets to UnregisterDefaultLabel()
-  using DefaultLabelType  = std::pair<Dali::WeakHandle<Dali::Window>, Dali::Accessibility::Accessible*>;
+  using DefaultLabelType  = std::pair<Dali::WeakHandle<Dali::Window>, std::weak_ptr<Dali::Accessibility::Accessible>>;
   using DefaultLabelsType = std::list<DefaultLabelType>;
 
   mutable ApplicationAccessible mApplication;
index a5ed289..7f1166f 100644 (file)
@@ -18,8 +18,8 @@
  *
  */
 
-#include <dali/devel-api/adaptor-framework/accessibility.h>
 #include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
+#include <dali/devel-api/adaptor-framework/accessibility.h>
 
 namespace Dali::Accessibility
 {
@@ -46,15 +46,15 @@ struct DummyBridge : Dali::Accessibility::Bridge
   {
   }
 
-  void RegisterDefaultLabel(Accessibility::Accessible* object) override
+  void RegisterDefaultLabel(std::shared_ptr<Accessibility::Accessible> object) override
   {
   }
 
-  void UnregisterDefaultLabel(Accessibility::Accessible* object) override
+  void UnregisterDefaultLabel(std::shared_ptr<Accessibility::Accessible> object) override
   {
   }
 
-  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) const override
+  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) override
   {
     return nullptr;
   }
@@ -170,7 +170,7 @@ struct DummyBridge : Dali::Accessibility::Bridge
   {
   }
 
-  void EmitPostRender(Accessibility::Accessible *obj) override
+  void EmitPostRender(Accessibility::Accessibleobj) override
   {
   }