diff options
author | Youngsun Suh <youngsun.suh@samsung.com> | 2024-06-20 03:36:48 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@review> | 2024-06-20 03:36:48 +0000 |
commit | eda8c1579dcc29673de9b51a09a9a9a9715bc459 (patch) | |
tree | 417c83ad9b1530ec4adae5a7d31051b8395a92de /dali/internal | |
parent | b97714d463bcd59c77f2cd5a3ea6080a1eed72a3 (diff) | |
parent | 041778a56ac12a9220df7d1b59fbf0d19dbbdf47 (diff) | |
download | dali-adaptor-eda8c1579dcc29673de9b51a09a9a9a9715bc459.tar.gz dali-adaptor-eda8c1579dcc29673de9b51a09a9a9a9715bc459.tar.bz2 dali-adaptor-eda8c1579dcc29673de9b51a09a9a9a9715bc459.zip |
Merge "Make sure invalid default label is removed before searching the list" into devel/master
Diffstat (limited to 'dali/internal')
-rw-r--r-- | dali/internal/accessibility/bridge/bridge-base.cpp | 39 | ||||
-rw-r--r-- | dali/internal/accessibility/bridge/bridge-base.h | 22 | ||||
-rw-r--r-- | dali/internal/accessibility/bridge/dummy/dummy-atspi.h | 10 |
3 files changed, 42 insertions, 29 deletions
diff --git a/dali/internal/accessibility/bridge/bridge-base.cpp b/dali/internal/accessibility/bridge/bridge-base.cpp index 30e6cf4f9..ba4e15452 100644 --- a/dali/internal/accessibility/bridge/bridge-base.cpp +++ b/dali/internal/accessibility/bridge/bridge-base.cpp @@ -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) diff --git a/dali/internal/accessibility/bridge/bridge-base.h b/dali/internal/accessibility/bridge/bridge-base.h index 6c72399f2..2cfcab094 100644 --- a/dali/internal/accessibility/bridge/bridge-base.h +++ b/dali/internal/accessibility/bridge/bridge-base.h @@ -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; diff --git a/dali/internal/accessibility/bridge/dummy/dummy-atspi.h b/dali/internal/accessibility/bridge/dummy/dummy-atspi.h index a5ed28962..7f1166f36 100644 --- a/dali/internal/accessibility/bridge/dummy/dummy-atspi.h +++ b/dali/internal/accessibility/bridge/dummy/dummy-atspi.h @@ -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::Accessible* obj) override { } |