Chromium Code Reviews| Index: chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc |
| diff --git a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc |
| index 6e3c1a48f0a761e6d21c41b53bf39bb0fb0b2bb0..c987a945e5763173c1bfda4de9a7ca28e529b5d7 100644 |
| --- a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc |
| +++ b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc |
| @@ -4,11 +4,32 @@ |
| #include "chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.h" |
| +#include "base/command_line.h" |
| #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" |
| +#include "chrome/browser/chromeos/arc/accessibility/ax_tree_source_arc.h" |
| +#include "chromeos/chromeos_switches.h" |
| #include "components/arc/arc_bridge_service.h" |
| +#include "components/exo/shell_surface.h" |
| +#include "components/exo/surface.h" |
| #include "components/exo/wm_helper.h" |
| #include "ui/aura/window.h" |
| #include "ui/gfx/geometry/rect.h" |
| +#include "ui/views/view.h" |
| +#include "ui/views/widget/widget.h" |
| + |
| +namespace { |
| + |
| +exo::Surface* GetArcSurface(const aura::Window* window) { |
| + if (!window) |
| + return nullptr; |
| + |
| + exo::Surface* arc_surface = exo::Surface::AsSurface(window); |
| + if (!arc_surface) |
| + arc_surface = exo::ShellSurface::GetMainSurface(window); |
| + return arc_surface; |
| +} |
| + |
| +} // namespace |
| namespace arc { |
| @@ -27,37 +48,77 @@ void ArcAccessibilityHelperBridge::OnInstanceReady() { |
| arc_bridge_service()->accessibility_helper(), Init); |
| DCHECK(instance); |
| instance->Init(binding_.CreateInterfacePtrAndBind()); |
| + |
| + chromeos::AccessibilityManager* accessibility_manager = |
| + chromeos::AccessibilityManager::Get(); |
| + if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| + chromeos::switches::kEnableChromeVoxArcSupport)) { |
| + instance->SetFilter(arc::mojom::AccessibilityFilterType::ALL); |
| + if (!tree_) { |
| + tree_.reset(new AXTreeSourceArc()); |
| + exo::WMHelper::GetInstance()->AddActivationObserver(this); |
| + } |
| + } else if (accessibility_manager && |
| + accessibility_manager->IsFocusHighlightEnabled()) { |
| + instance->SetFilter(arc::mojom::AccessibilityFilterType::FOCUS); |
| + } |
| } |
| void ArcAccessibilityHelperBridge::OnAccessibilityEvent( |
| - mojom::AccessibilityEventType event_type, |
| - mojom::AccessibilityNodeInfoDataPtr event_source) { |
| - if (event_type != mojom::AccessibilityEventType::VIEW_FOCUSED || |
| - event_source.is_null()) { |
| - return; |
| - } |
| + mojom::AccessibilityEventDataPtr event_data) { |
| + if (tree_) { |
| + tree_->NotifyAccessibilityEvent(event_data.get()); |
| + } else { |
|
dmazzoni
2017/02/09 01:18:09
nit: maybe just return inside the first if block,
|
| + chromeos::AccessibilityManager* accessibility_manager = |
| + chromeos::AccessibilityManager::Get(); |
| + if (!accessibility_manager) |
| + return; |
| - chromeos::AccessibilityManager* accessibility_manager = |
| - chromeos::AccessibilityManager::Get(); |
| + exo::WMHelper* wmHelper = exo::WMHelper::GetInstance(); |
| + aura::Window* focused_window = wmHelper->GetFocusedWindow(); |
| + if (!focused_window) |
| + return; |
| - if (!accessibility_manager || |
| - !accessibility_manager->IsFocusHighlightEnabled()) { |
| - return; |
| - } |
| + aura::Window* toplevel_window = focused_window->GetToplevelWindow(); |
| - exo::WMHelper* wmHelper = exo::WMHelper::GetInstance(); |
| + CHECK_EQ(1, event_data.get()->nodeData.size()); |
| + gfx::Rect bounds_in_screen = gfx::ScaleToEnclosingRect( |
| + event_data.get()->nodeData[0]->boundsInScreen, |
| + 1.0f / toplevel_window->layer()->device_scale_factor()); |
| - aura::Window* focused_window = wmHelper->GetFocusedWindow(); |
| - if (!focused_window) |
| + accessibility_manager->OnViewFocusedInArc(bounds_in_screen); |
| + } |
| +} |
| + |
| +void ArcAccessibilityHelperBridge::OnWindowActivated( |
| + aura::Window* gained_active, |
| + aura::Window* lost_active) { |
| + if (gained_active == lost_active) |
| return; |
| - aura::Window* toplevel_window = focused_window->GetToplevelWindow(); |
| + exo::Surface* active_surface = GetArcSurface(gained_active); |
| + exo::Surface* inactive_surface = GetArcSurface(lost_active); |
| + if (inactive_surface) { |
| + views::Widget* widget = views::Widget::GetWidgetForNativeView(lost_active); |
| + if (widget && widget->GetContentsView()) { |
| + widget->GetContentsView()->RemoveChildView(tree_.get()); |
| + widget->GetContentsView()->NotifyAccessibilityEvent( |
| + ui::AX_EVENT_CHILDREN_CHANGED, false); |
| + } |
| + } |
| - gfx::Rect bounds_in_screen = gfx::ScaleToEnclosingRect( |
| - event_source.get()->boundsInScreen, |
| - 1.0f / toplevel_window->layer()->device_scale_factor()); |
| + if (!active_surface) |
| + return; |
| - accessibility_manager->OnViewFocusedInArc(bounds_in_screen); |
| + tree_.reset(new AXTreeSourceArc()); |
| + |
| + views::Widget* widget = views::Widget::GetWidgetForNativeView(gained_active); |
| + if (widget && widget->GetContentsView()) { |
| + widget->GetContentsView()->AddChildView(tree_.get()); |
| + widget->GetContentsView()->NotifyAccessibilityEvent( |
| + ui::AX_EVENT_CHILDREN_CHANGED, false); |
| + tree_->RequestFocus(); |
| + } |
| } |
| } // namespace arc |