Index: chrome/browser/ui/aura/accessibility/automation_manager_aura.cc |
diff --git a/chrome/browser/ui/aura/accessibility/automation_manager_aura.cc b/chrome/browser/ui/aura/accessibility/automation_manager_aura.cc |
index 462a087b66268f1f3da7eb392122f69c8f60ca99..1818c1134b1f38e6d871a218b1124b3964c64e23 100644 |
--- a/chrome/browser/ui/aura/accessibility/automation_manager_aura.cc |
+++ b/chrome/browser/ui/aura/accessibility/automation_manager_aura.cc |
@@ -15,9 +15,11 @@ |
#include "chrome/common/extensions/chrome_extension_messages.h" |
#include "content/public/browser/ax_event_notification_details.h" |
#include "content/public/browser/browser_context.h" |
+#include "content/public/browser/render_frame_host.h" |
#include "ui/accessibility/ax_action_data.h" |
#include "ui/accessibility/ax_enums.h" |
#include "ui/accessibility/ax_tree_id_registry.h" |
+#include "ui/accessibility/platform/aura_window_properties.h" |
#include "ui/aura/env.h" |
#include "ui/aura/window.h" |
#include "ui/views/accessibility/ax_aura_obj_wrapper.h" |
@@ -25,6 +27,7 @@ |
#include "ui/views/widget/widget.h" |
#if defined(OS_CHROMEOS) |
+#include "ash/shell.h" // nogncheck |
#include "ash/wm/window_util.h" // nogncheck |
#endif |
@@ -81,10 +84,16 @@ void AutomationManagerAura::HandleAlert(content::BrowserContext* context, |
SendEvent(context, obj, ui::AX_EVENT_ALERT); |
} |
-void AutomationManagerAura::PerformAction( |
- const ui::AXActionData& data) { |
+void AutomationManagerAura::PerformAction(const ui::AXActionData& data) { |
CHECK(enabled_); |
+ // Unlike all of the other actions, a hit test requires determining the |
+ // node to perform the action on first. |
+ if (data.action == ui::AX_ACTION_HIT_TEST) { |
+ PerformHitTest(data); |
+ return; |
+ } |
+ |
current_tree_->HandleAccessibleAction(data); |
} |
@@ -161,3 +170,60 @@ void AutomationManagerAura::SendEvent(BrowserContext* context, |
pending_events_copy[i].second); |
} |
} |
+ |
+void AutomationManagerAura::PerformHitTest( |
+ const ui::AXActionData& original_action) { |
+#if defined(OS_CHROMEOS) |
+ ui::AXActionData action = original_action; |
+ aura::Window* root_window = ash::Shell::Get()->GetPrimaryRootWindow(); |
+ if (!root_window) |
+ return; |
+ |
+ // Determine which aura Window is associated with the target point. |
+ aura::Window* window = |
+ root_window->GetEventHandlerForPoint(action.target_point); |
+ if (!window) |
+ return; |
+ |
+ // Convert point to local coordinates of the hit window. |
+ aura::Window::ConvertPointToTarget(root_window, window, &action.target_point); |
+ |
+ // If the window has a child AX tree ID, forward the action to the |
+ // associated AXHostDelegate or RenderFrameHost. |
+ ui::AXTreeIDRegistry::AXTreeID child_ax_tree_id = |
+ window->GetProperty(ui::kChildAXTreeID); |
+ if (child_ax_tree_id != ui::AXTreeIDRegistry::kNoAXTreeID) { |
+ ui::AXTreeIDRegistry* registry = ui::AXTreeIDRegistry::GetInstance(); |
+ ui::AXHostDelegate* delegate = registry->GetHostDelegate(child_ax_tree_id); |
+ if (delegate) { |
+ delegate->PerformAction(action); |
+ return; |
+ } |
+ |
+ content::RenderFrameHost* rfh = |
+ content::RenderFrameHost::FromAXTreeID(child_ax_tree_id); |
+ if (rfh) |
+ rfh->AccessibilityPerformAction(action); |
+ return; |
+ } |
+ |
+ // If the window doesn't have a child tree ID, try to fire the event |
+ // on a View. |
+ views::Widget* widget = views::Widget::GetWidgetForNativeView(window); |
+ if (widget) { |
+ views::View* root_view = widget->GetRootView(); |
+ views::View* hit_view = |
+ root_view->GetEventHandlerForPoint(action.target_point); |
+ if (hit_view) { |
+ hit_view->NotifyAccessibilityEvent(action.hit_test_event_to_fire, true); |
+ return; |
+ } |
+ } |
+ |
+ // Otherwise, fire the event directly on the Window. |
+ views::AXAuraObjWrapper* window_wrapper = |
+ views::AXAuraObjCache::GetInstance()->GetOrCreate(window); |
+ if (window_wrapper) |
+ SendEvent(nullptr, window_wrapper, action.hit_test_event_to_fire); |
+#endif |
+} |