From f36eb22ac29852170cdadfd1592bdd6360498f67 Mon Sep 17 00:00:00 2001 From: Shinwoo Kim Date: Sat, 7 May 2022 00:58:20 +0900 Subject: [PATCH] [AT-SPI] remove isRoot param from Accessible::Get The Accessibility::Accessible::Get for a window could be called before getting accessible to add window accessible. So far, we thought that the next part creates an accessible for window for the first time. accessible = Accessibility::Accessible::Get(rootLayer, true); bridge->AddTopLevelWindow(accessible); However, there is a case where it is created before this part caused by following symbol CSharp_Dali_Toolkit_DevelControl_GetAccessibilityStates+0x144 In this case, isRoot is set to `false`. Then window will have incorrect accessible information. For more information, please refer to the following. https://github.sec.samsung.net/tizen/atspi/issues/60 Change-Id: Id2d27f35426e72b67986f132f0c77979016b4252 --- dali/devel-api/adaptor-framework/accessibility.cpp | 8 +++++++- dali/devel-api/atspi-interfaces/accessible.h | 3 +-- dali/internal/accessibility/bridge/bridge-impl.cpp | 2 +- dali/internal/window-system/common/window-impl.cpp | 16 ++++++++-------- 4 files changed, 17 insertions(+), 12 deletions(-) diff --git a/dali/devel-api/adaptor-framework/accessibility.cpp b/dali/devel-api/adaptor-framework/accessibility.cpp index ddc4f20..b058328 100644 --- a/dali/devel-api/adaptor-framework/accessibility.cpp +++ b/dali/devel-api/adaptor-framework/accessibility.cpp @@ -501,7 +501,7 @@ void Accessible::RegisterExternalAccessibleGetter(std::functionsecond.reset(new AdaptorAccessible(actor, isRoot)); } accessible = pair.first->second.get(); diff --git a/dali/devel-api/atspi-interfaces/accessible.h b/dali/devel-api/atspi-interfaces/accessible.h index b42ad35..84fe37c 100644 --- a/dali/devel-api/atspi-interfaces/accessible.h +++ b/dali/devel-api/atspi-interfaces/accessible.h @@ -465,11 +465,10 @@ public: * @brief Acquires Accessible object from Actor object. * * @param[in] actor Actor object - * @param[in] isRoot True, if it's top level object (window) * * @return The handle to Accessible object */ - static Accessible* Get(Dali::Actor actor, bool isRoot = false); + static Accessible* Get(Dali::Actor actor); /** * @brief Obtains the DBus interface name for the specified AT-SPI interface. diff --git a/dali/internal/accessibility/bridge/bridge-impl.cpp b/dali/internal/accessibility/bridge/bridge-impl.cpp index 6d96eea..c48240c 100644 --- a/dali/internal/accessibility/bridge/bridge-impl.cpp +++ b/dali/internal/accessibility/bridge/bridge-impl.cpp @@ -780,7 +780,7 @@ void Bridge::EnableAutoInit() auto window = Dali::DevelWindow::Get(rootLayer); auto applicationName = Dali::Internal::Adaptor::Adaptor::GetApplicationPackageName(); - auto accessible = Accessibility::Accessible::Get(rootLayer, true); + auto accessible = Accessibility::Accessible::Get(rootLayer); auto bridge = Bridge::GetCurrentBridge(); bridge->AddTopLevelWindow(accessible); diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index e0a6cc5..2f1bd12 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -105,7 +105,7 @@ Window::~Window() { auto bridge = Accessibility::Bridge::GetCurrentBridge(); auto rootLayer = mScene.GetRootLayer(); - auto accessible = Accessibility::Accessible::Get(rootLayer, true); + auto accessible = Accessibility::Accessible::Get(rootLayer); bridge->RemoveTopLevelWindow(accessible); // Related to multi-window case. This is called for default window and non-default window, but it is effective for non-default window. bridge->Emit(accessible, Accessibility::WindowEvent::DESTROY); @@ -185,7 +185,7 @@ void Window::OnAdaptorSet(Dali::Adaptor& adaptor) if(bridge->IsUp()) { auto rootLayer = mScene.GetRootLayer(); - auto accessible = Accessibility::Accessible::Get(rootLayer, true); + auto accessible = Accessibility::Accessible::Get(rootLayer); bridge->AddTopLevelWindow(accessible); } @@ -671,7 +671,7 @@ void Window::SetSize(Dali::Window::WindowSize size) mSurface->SetFullSwapNextFrame(); - Dali::Accessibility::Accessible::Get(mScene.GetRootLayer(), true)->EmitBoundsChanged(Dali::Rect<>(oldRect.x, oldRect.y, size.GetWidth(), size.GetHeight())); + Dali::Accessibility::Accessible::Get(mScene.GetRootLayer())->EmitBoundsChanged(Dali::Rect<>(oldRect.x, oldRect.y, size.GetWidth(), size.GetHeight())); } Dali::Window::WindowSize Window::GetSize() const @@ -689,7 +689,7 @@ void Window::SetPosition(Dali::Window::WindowPosition position) mSurface->SetFullSwapNextFrame(); - Dali::Accessibility::Accessible::Get(mScene.GetRootLayer(), true)->EmitBoundsChanged(Dali::Rect<>(position.GetX(), position.GetY(), oldRect.width, oldRect.height)); + Dali::Accessibility::Accessible::Get(mScene.GetRootLayer())->EmitBoundsChanged(Dali::Rect<>(position.GetX(), position.GetY(), oldRect.width, oldRect.height)); } Dali::Window::WindowPosition Window::GetPosition() const @@ -732,7 +732,7 @@ void Window::SetPositionSize(PositionSize positionSize) mSurface->SetFullSwapNextFrame(); - Dali::Accessibility::Accessible::Get(mScene.GetRootLayer(), true)->EmitBoundsChanged(Dali::Rect<>(positionSize.x, positionSize.y, positionSize.width, positionSize.height)); + Dali::Accessibility::Accessible::Get(mScene.GetRootLayer())->EmitBoundsChanged(Dali::Rect<>(positionSize.x, positionSize.y, positionSize.width, positionSize.height)); } Dali::Layer Window::GetRootLayer() const @@ -882,7 +882,7 @@ void Window::OnUpdatePositionSize(Dali::PositionSize& positionSize) mSurface->SetFullSwapNextFrame(); - Dali::Accessibility::Accessible::Get(mScene.GetRootLayer(), true)->EmitBoundsChanged(Dali::Rect<>(positionSize.x, positionSize.y, positionSize.width, positionSize.height)); + Dali::Accessibility::Accessible::Get(mScene.GetRootLayer())->EmitBoundsChanged(Dali::Rect<>(positionSize.x, positionSize.y, positionSize.width, positionSize.height)); } void Window::OnTouchPoint(Dali::Integration::Point& point, int timeStamp) @@ -953,7 +953,7 @@ void Window::OnAccessibilityEnabled() { auto bridge = Accessibility::Bridge::GetCurrentBridge(); auto rootLayer = mScene.GetRootLayer(); - auto accessible = Accessibility::Accessible::Get(rootLayer, true); + auto accessible = Accessibility::Accessible::Get(rootLayer); bridge->AddTopLevelWindow(accessible); if(mFocused) @@ -967,7 +967,7 @@ void Window::OnAccessibilityDisabled() { auto bridge = Accessibility::Bridge::GetCurrentBridge(); auto rootLayer = mScene.GetRootLayer(); - auto accessible = Accessibility::Accessible::Get(rootLayer, true); + auto accessible = Accessibility::Accessible::Get(rootLayer); bridge->RemoveTopLevelWindow(accessible); } -- 2.7.4