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 908e8737ed31b5d7d29ff1076bbef939e58ea61d..59916bc4a0cb815f538bf1f2cf0d7d2efe434f27 100644 |
--- a/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc |
+++ b/chrome/browser/chromeos/arc/accessibility/arc_accessibility_helper_bridge.cc |
@@ -25,10 +25,20 @@ namespace { |
class FocusStealer : public views::View { |
public: |
explicit FocusStealer(int32_t id) : id_(id) { |
- SetFocusBehavior(views::View::FocusBehavior::ALWAYS); |
set_owned_by_client(); |
} |
+ void StartStealing() { |
+ SetFocusBehavior(views::View::FocusBehavior::ALWAYS); |
+ RequestFocus(); |
+ parent()->NotifyAccessibilityEvent(ui::AX_EVENT_CHILDREN_CHANGED, false); |
+ } |
+ |
+ void StopStealing() { |
+ SetFocusBehavior(views::View::FocusBehavior::NEVER); |
+ parent()->NotifyAccessibilityEvent(ui::AX_EVENT_CHILDREN_CHANGED, false); |
+ } |
+ |
// views::View overrides. |
void GetAccessibleNodeData(ui::AXNodeData* node_data) override { |
node_data->AddIntAttribute(ui::AX_ATTR_CHILD_TREE_ID, id_); |
@@ -70,6 +80,25 @@ void DispatchFocusChange(arc::mojom::AccessibilityNodeInfoData* node_data) { |
accessibility_manager->OnViewFocusedInArc(bounds_in_screen); |
} |
+arc::mojom::AccessibilityFilterType GetFilterType() { |
+ chromeos::AccessibilityManager* accessibility_manager = |
+ chromeos::AccessibilityManager::Get(); |
+ if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
+ chromeos::switches::kEnableChromeVoxArcSupport)) |
Luis Héctor Chávez
2017/04/21 15:20:07
nit: you cannot elide braces on this block since t
David Tseng
2017/04/25 18:29:48
Done (though note that this seems somewhat ambiguo
|
+ return arc::mojom::AccessibilityFilterType::ALL; |
+ |
+ if (!accessibility_manager) |
+ return arc::mojom::AccessibilityFilterType::OFF; |
+ |
+ if (accessibility_manager->IsSpokenFeedbackEnabled()) |
+ return arc::mojom::AccessibilityFilterType::WHITELISTED_PACKAGE_NAME; |
+ |
+ if (accessibility_manager->IsFocusHighlightEnabled()) |
+ return arc::mojom::AccessibilityFilterType::FOCUS; |
+ |
+ return arc::mojom::AccessibilityFilterType::OFF; |
+} |
+ |
} // namespace |
namespace arc { |
@@ -90,19 +119,21 @@ void ArcAccessibilityHelperBridge::OnInstanceReady() { |
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_source_) { |
- tree_source_.reset(new AXTreeSourceArc(tree_id())); |
- focus_stealer_.reset(new FocusStealer(tree_source_->tree_id())); |
- exo::WMHelper::GetInstance()->AddActivationObserver(this); |
- } |
- } else if (accessibility_manager && |
- accessibility_manager->IsFocusHighlightEnabled()) { |
- instance->SetFilter(arc::mojom::AccessibilityFilterType::FOCUS); |
+ arc::mojom::AccessibilityFilterType filter_type = GetFilterType(); |
+ instance->SetFilter(filter_type); |
+ |
+ switch (filter_type) { |
+ case arc::mojom::AccessibilityFilterType::ALL: |
Luis Héctor Chávez
2017/04/21 15:20:07
Consider adding
// fallthrough
on the cases wher
David Tseng
2017/04/25 18:29:48
Acknowledged.
|
+ case arc::mojom::AccessibilityFilterType::WHITELISTED_PACKAGE_NAME: |
+ if (!tree_source_) { |
+ tree_source_.reset(new AXTreeSourceArc(tree_id())); |
+ focus_stealer_.reset(new FocusStealer(tree_source_->tree_id())); |
+ exo::WMHelper::GetInstance()->AddActivationObserver(this); |
+ } |
+ break; |
+ case arc::mojom::AccessibilityFilterType::FOCUS: |
+ case arc::mojom::AccessibilityFilterType::OFF: |
+ break; |
hidehiko
2017/04/21 06:27:02
nit: how about commenting
// Do nothing.
to expli
David Tseng
2017/04/25 18:29:48
Acknowledged.
|
} |
} |
@@ -115,6 +146,15 @@ void ArcAccessibilityHelperBridge::OnAccessibilityEventDeprecated( |
void ArcAccessibilityHelperBridge::OnAccessibilityEvent( |
mojom::AccessibilityEventDataPtr event_data) { |
+ arc::mojom::AccessibilityFilterType filter_type = GetFilterType(); |
+ |
+ if (!tree_source_ && |
yawano
2017/04/21 04:26:36
How about to write this function as
switch (filte
David Tseng
2017/04/25 18:29:48
Acknowledged.
|
+ (filter_type == arc::mojom::AccessibilityFilterType::ALL || |
+ filter_type == |
+ arc::mojom::AccessibilityFilterType::WHITELISTED_PACKAGE_NAME)) { |
+ tree_source_.reset(new AXTreeSourceArc(tree_id())); |
+ } |
+ |
if (tree_source_) { |
tree_source_->NotifyAccessibilityEvent(event_data.get()); |
return; |
@@ -127,10 +167,16 @@ void ArcAccessibilityHelperBridge::OnAccessibilityEvent( |
DispatchFocusChange(event_data.get()->nodeData[0].get()); |
} |
+void ArcAccessibilityHelperBridge::OnAccessibilityTreeDestroyed() { |
+ tree_source_.reset(nullptr); |
hidehiko
2017/04/21 06:27:02
nit: s/reset(nullptr)/reset()/
David Tseng
2017/04/25 18:29:48
Acknowledged.
|
+ if (focus_stealer_->parent()) |
+ focus_stealer_->parent()->RemoveChildView(focus_stealer_.get()); |
+} |
+ |
void ArcAccessibilityHelperBridge::OnWindowActivated( |
aura::Window* gained_active, |
aura::Window* lost_active) { |
- if (gained_active == lost_active || !tree_source_) |
+ if (gained_active == lost_active) |
return; |
exo::Surface* active_surface = GetArcSurface(gained_active); |
@@ -142,8 +188,7 @@ void ArcAccessibilityHelperBridge::OnWindowActivated( |
views::Widget* widget = views::Widget::GetWidgetForNativeView(lost_active); |
if (widget && widget->GetContentsView()) { |
views::View* view = widget->GetContentsView(); |
- view->RemoveChildView(focus_stealer_.get()); |
- view->NotifyAccessibilityEvent(ui::AX_EVENT_CHILDREN_CHANGED, false); |
+ focus_stealer_->StopStealing(); |
} |
} |
@@ -155,8 +200,7 @@ void ArcAccessibilityHelperBridge::OnWindowActivated( |
views::View* view = widget->GetContentsView(); |
if (!view->Contains(focus_stealer_.get())) |
view->AddChildView(focus_stealer_.get()); |
- focus_stealer_->RequestFocus(); |
- view->NotifyAccessibilityEvent(ui::AX_EVENT_CHILDREN_CHANGED, false); |
+ focus_stealer_->StartStealing(); |
} |
} |