Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1855)

Unified Diff: ui/views/accessibility/ax_aura_obj_cache.cc

Issue 1589623002: Keep track of accessibility focus across windows. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: git cl format Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698