From 75ebe22a022548f0c624efa26df0079f40a5e090 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Wed, 16 Sep 2026 21:05:20 -0300 Subject: [PATCH] fix(accessibility): stabilize inactive backend benchmark timing - expose whether native backend initialization has completed - distinguish completed initialization from backend availability - wait up to one second for asynchronous initialization in benchmark mode - exclude AT-SPI registration activity from notification timing - report backend readiness latency in benchmark results - verify disabled backends complete initialization immediately --- .../eepp/ui/accessibility/accessibilitymanager.hpp | 2 ++ .../scripts/benchmark_accessibility_inactive.py | 1 + src/eepp/ui/accessibility/accessibilitybackend.hpp | 2 ++ .../ui/accessibility/accessibilitybackendatspi.cpp | 6 ++++++ src/eepp/ui/accessibility/accessibilitymanager.cpp | 4 ++++ src/examples/ui_accessibility/ui_accessibility.cpp | 13 ++++++++++++- src/tests/unit_tests/uiscenenode_tests.cpp | 1 + 7 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/eepp/ui/accessibility/accessibilitymanager.hpp b/include/eepp/ui/accessibility/accessibilitymanager.hpp index 661e82982..a4ce0fad0 100644 --- a/include/eepp/ui/accessibility/accessibilitymanager.hpp +++ b/include/eepp/ui/accessibility/accessibilitymanager.hpp @@ -43,6 +43,8 @@ class EE_API AccessibilityManager { bool isBackendAvailable() const; + bool isBackendInitializationComplete() const; + bool hasActiveNativeClients() const; /** Updates the scene's cached fast-path flag after an actual native accessibility query. */ diff --git a/projects/scripts/benchmark_accessibility_inactive.py b/projects/scripts/benchmark_accessibility_inactive.py index 0fe193f82..d6b382d74 100644 --- a/projects/scripts/benchmark_accessibility_inactive.py +++ b/projects/scripts/benchmark_accessibility_inactive.py @@ -47,6 +47,7 @@ def run_sample(args, disabled): result = json.loads(completed.stdout) result["wall_ms"] = wall_ms result["initialization_ms"] = result.pop("initialization_us") / 1000 + result["readiness_ms"] = result.pop("readiness_us") / 1000 result["notifications_ms"] = result.pop("notifications_us") / 1000 return result diff --git a/src/eepp/ui/accessibility/accessibilitybackend.hpp b/src/eepp/ui/accessibility/accessibilitybackend.hpp index 68b19577b..05406365f 100644 --- a/src/eepp/ui/accessibility/accessibilitybackend.hpp +++ b/src/eepp/ui/accessibility/accessibilitybackend.hpp @@ -14,6 +14,8 @@ class AccessibilityBackend { virtual bool isAvailable() const = 0; + virtual bool isInitializationComplete() const { return true; } + virtual bool hasActiveClients() const { return false; } virtual void update() {} diff --git a/src/eepp/ui/accessibility/accessibilitybackendatspi.cpp b/src/eepp/ui/accessibility/accessibilitybackendatspi.cpp index e7a0647a0..9300745ea 100644 --- a/src/eepp/ui/accessibility/accessibilitybackendatspi.cpp +++ b/src/eepp/ui/accessibility/accessibilitybackendatspi.cpp @@ -302,6 +302,8 @@ class AtSpiApplication final : public std::enable_shared_from_thisisAvailable(); } + bool isInitializationComplete() const override { + return mApplication && mApplication->isInitialized(); + } + bool hasActiveClients() const { return mApplication && mApplication->hasActiveClients(); } void update() { diff --git a/src/eepp/ui/accessibility/accessibilitymanager.cpp b/src/eepp/ui/accessibility/accessibilitymanager.cpp index 6fa931c01..cf06504e2 100644 --- a/src/eepp/ui/accessibility/accessibilitymanager.cpp +++ b/src/eepp/ui/accessibility/accessibilitymanager.cpp @@ -261,6 +261,10 @@ bool AccessibilityManager::isBackendAvailable() const { return mBackend && mBackend->isAvailable(); } +bool AccessibilityManager::isBackendInitializationComplete() const { + return mBackend && mBackend->isInitializationComplete(); +} + bool AccessibilityManager::hasActiveNativeClients() const { return mBackend && mBackend->hasActiveClients(); } diff --git a/src/examples/ui_accessibility/ui_accessibility.cpp b/src/examples/ui_accessibility/ui_accessibility.cpp index 2e34045f1..3309cbfd0 100644 --- a/src/examples/ui_accessibility/ui_accessibility.cpp +++ b/src/examples/ui_accessibility/ui_accessibility.cpp @@ -104,14 +104,25 @@ EE_MAIN_FUNC int main( int argc, char** argv ) { auto status = content->find( "status" ); if ( benchmarkInactive ) { + auto manager = scene->getAccessibilityManager(); Clock clock; - scene->getAccessibilityManager()->update(); + manager->update(); const auto initializationUs = clock.getElapsedTime().asMicroseconds(); clock.restart(); + if ( !std::getenv( "EEPP_DISABLE_ACCESSIBILITY" ) ) { + while ( !manager->isBackendInitializationComplete() && + clock.getElapsedTime() < Seconds( 1 ) ) { + Sys::sleep( Milliseconds( 1 ) ); + manager->update(); + } + } + const auto readinessUs = clock.getElapsedTime().asMicroseconds(); + clock.restart(); for ( size_t i = 0; i < benchmarkIterations; ++i ) status->setText( i & 1 ? "Ready" : "Idle" ); const auto notificationsUs = clock.getElapsedTime().asMicroseconds(); std::cout << "{\"initialization_us\":" << initializationUs + << ",\"readiness_us\":" << readinessUs << ",\"iterations\":" << benchmarkIterations << ",\"notifications_us\":" << notificationsUs << "}\n"; return EXIT_SUCCESS; diff --git a/src/tests/unit_tests/uiscenenode_tests.cpp b/src/tests/unit_tests/uiscenenode_tests.cpp index 7fb71c18e..2b265d4f1 100644 --- a/src/tests/unit_tests/uiscenenode_tests.cpp +++ b/src/tests/unit_tests/uiscenenode_tests.cpp @@ -210,6 +210,7 @@ UTEST( UIApplication, CreatesSecondaryWindowWithoutChangingAmbientScene ) { nullptr ); app.getUI()->getAccessibilityManager()->update(); EXPECT_FALSE( app.getUI()->getAccessibilityManager()->isBackendAvailable() ); + EXPECT_TRUE( app.getUI()->getAccessibilityManager()->isBackendInitializationComplete() ); EXPECT_EQ( PixelDensity::getPixelDensity(), 1.5f ); ASSERT_TRUE( app.getUI()->getUIIconThemeManager()->getCurrentTheme() != nullptr ); EXPECT_TRUE( app.getUI()->getUIIconThemeManager()->findIcon( "go-up" ) != nullptr );