Index: ui/views/accessibility/ax_aura_obj_cache.cc |
diff --git a/ui/views/accessibility/ax_aura_obj_cache.cc b/ui/views/accessibility/ax_aura_obj_cache.cc |
index 47964bee739a40487fc24c7fc673fcfd6ad6ac15..72abde71a028195511abdb3141eaa3d754a1cb58 100644 |
--- a/ui/views/accessibility/ax_aura_obj_cache.cc |
+++ b/ui/views/accessibility/ax_aura_obj_cache.cc |
@@ -6,6 +6,7 @@ |
#include "base/memory/singleton.h" |
#include "base/stl_util.h" |
+#include "ui/aura/client/focus_client.h" |
#include "ui/aura/window.h" |
#include "ui/views/accessibility/ax_aura_obj_wrapper.h" |
#include "ui/views/accessibility/ax_view_obj_wrapper.h" |
@@ -30,6 +31,14 @@ AXAuraObjWrapper* AXAuraObjCache::GetOrCreate(Widget* widget) { |
} |
AXAuraObjWrapper* AXAuraObjCache::GetOrCreate(aura::Window* window) { |
+ if (!focus_client_) { |
+ aura::Window* root_window = window->GetRootWindow(); |
+ if (root_window) { |
+ focus_client_ = aura::client::GetFocusClient(root_window); |
+ if (focus_client_) |
+ focus_client_->AddObserver(this); |
+ } |
+ } |
return CreateInternal<AXWindowObjWrapper>(window, window_to_id_map_); |
} |
@@ -97,7 +106,17 @@ void AXAuraObjCache::GetTopLevelWindows( |
} |
} |
-AXAuraObjCache::AXAuraObjCache() : current_id_(1), is_destroying_(false) { |
+AXAuraObjWrapper* AXAuraObjCache::GetFocus() { |
+ View* focused_view = GetFocusedView(); |
+ if (focused_view) |
+ return GetOrCreate(focused_view); |
+ return nullptr; |
+} |
+ |
+AXAuraObjCache::AXAuraObjCache() |
+ : current_id_(1), |
+ focus_client_(nullptr), |
+ is_destroying_(false) { |
} |
AXAuraObjCache::~AXAuraObjCache() { |
@@ -106,6 +125,40 @@ AXAuraObjCache::~AXAuraObjCache() { |
cache_.clear(); |
} |
+View* AXAuraObjCache::GetFocusedView() { |
+ if (!focus_client_) |
+ return nullptr; |
+ |
+ aura::Window* focused_window = focus_client_->GetFocusedWindow(); |
+ if (!focused_window) |
+ return nullptr; |
+ |
+ Widget* focused_widget = Widget::GetWidgetForNativeView(focused_window); |
+ while (!focused_widget) { |
+ focused_window = focused_window->parent(); |
+ if (!focused_window) |
+ break; |
+ |
+ focused_widget = Widget::GetWidgetForNativeView(focused_window); |
+ } |
+ |
+ if (!focused_widget) |
+ return nullptr; |
+ |
+ FocusManager* focus_manager = focused_widget->GetFocusManager(); |
+ if (!focus_manager) |
+ return nullptr; |
+ |
+ return focus_manager->GetFocusedView(); |
+} |
+ |
+void AXAuraObjCache::OnWindowFocused(aura::Window* gained_focus, |
+ aura::Window* lost_focus) { |
+ View* view = GetFocusedView(); |
+ if (view) |
+ view->NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, true); |
+} |
+ |
template <typename AuraViewWrapper, typename AuraView> |
AXAuraObjWrapper* AXAuraObjCache::CreateInternal( |
AuraView* aura_view, |