Chromium Code Reviews| 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, |