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 3d4850e0bc26a827e2b7090a7f1bc941c679716e..6db74c6bb75736dd8cd34a42352b523bdcb164c1 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,15 +106,61 @@ 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() { |
+ //if (focus_client_) |
David Tseng
2016/01/28 02:00:56
nit: remove
dmazzoni
2016/01/30 00:02:41
Done.
|
+ // focus_client_->RemoveObserver(this); |
is_destroying_ = true; |
STLDeleteContainerPairSecondPointers(cache_.begin(), cache_.end()); |
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); |
David Tseng
2016/01/28 02:00:56
Do we want to break once we find a non-null widget
dmazzoni
2016/01/30 00:02:41
Not necessary since this is at the bottom of the w
|
+ } |
+ |
+ 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, |