Chromium Code Reviews| Index: ui/views/accessibility/ax_window_obj_wrapper.cc |
| diff --git a/ui/views/accessibility/ax_window_obj_wrapper.cc b/ui/views/accessibility/ax_window_obj_wrapper.cc |
| index 4352db0109aaa9b011135308023987aed1fe1b2f..1bed99acaaf6200ee356c5cfb7312ea6d382fcba 100644 |
| --- a/ui/views/accessibility/ax_window_obj_wrapper.cc |
| +++ b/ui/views/accessibility/ax_window_obj_wrapper.cc |
| @@ -54,12 +54,24 @@ void AXWindowObjWrapper::Serialize(ui::AXNodeData* out_node_data) { |
| out_node_data->AddStringAttribute(ui::AX_ATTR_NAME, |
| base::UTF16ToUTF8(window_->GetTitle())); |
| out_node_data->state = 0; |
| - out_node_data->location = gfx::RectF(window_->bounds()); |
| + out_node_data->location = gfx::RectF(window_->GetBoundsInScreen()); |
| ui::AXTreeIDRegistry::AXTreeID child_ax_tree_id = |
| window_->GetProperty(ui::kChildAXTreeID); |
| - if (child_ax_tree_id != ui::AXTreeIDRegistry::kNoAXTreeID) |
| + if (child_ax_tree_id != ui::AXTreeIDRegistry::kNoAXTreeID) { |
| + // Most often, child AX trees are parented to Views. We need to handle |
| + // the case where they're not here, but we don't want the same AX tree |
| + // to be a child of two different parents. |
| + // |
| + // To avoid this double-parenting, only add the child tree ID of this |
| + // window if the top-level window doesn't have an associated Widget. |
| + if (!window_->GetToplevelWindow() || |
|
David Tseng
2017/04/27 23:03:12
What about this first case? Do we want to add the
dmazzoni
2017/04/27 23:20:15
I don't think that should ever happen for a legit
|
| + Widget::GetWidgetForNativeView(window_->GetToplevelWindow())) { |
| + return; |
| + } |
| + |
| out_node_data->AddIntAttribute(ui::AX_ATTR_CHILD_TREE_ID, child_ax_tree_id); |
| + } |
| } |
| int32_t AXWindowObjWrapper::GetID() { |
| @@ -85,6 +97,8 @@ void AXWindowObjWrapper::OnWindowHierarchyChanged( |
| void AXWindowObjWrapper::OnWindowBoundsChanged(aura::Window* window, |
| const gfx::Rect& old_bounds, |
| const gfx::Rect& new_bounds) { |
| + AXAuraObjCache::GetInstance()->FireEvent(this, ui::AX_EVENT_LOCATION_CHANGED); |
| + |
| Widget* widget = Widget::GetWidgetForNativeView(window); |
| if (widget) { |
| widget->GetRootView()->NotifyAccessibilityEvent( |
| @@ -92,4 +106,13 @@ void AXWindowObjWrapper::OnWindowBoundsChanged(aura::Window* window, |
| } |
| } |
| +void AXWindowObjWrapper::OnWindowPropertyChanged(aura::Window* window, |
| + const void* key, |
| + intptr_t old) { |
| + if (key == ui::kChildAXTreeID) { |
| + AXAuraObjCache::GetInstance()->FireEvent(this, |
|
David Tseng
2017/04/27 23:03:12
Is |this| always the wrapper for |window|?
dmazzoni
2017/04/27 23:20:15
Good catch, added check for window_ == window
|
| + ui::AX_EVENT_CHILDREN_CHANGED); |
| + } |
| +} |
| + |
| } // namespace views |