| Index: ui/views/accessibility/native_view_accessibility.cc | 
| diff --git a/ui/views/accessibility/native_view_accessibility.cc b/ui/views/accessibility/native_view_accessibility.cc | 
| index a984c3c6c08c901fbe65b13d87166e5c075d3a78..3af5f52fef15530d6404de36c842d5b6b9dc552f 100644 | 
| --- a/ui/views/accessibility/native_view_accessibility.cc | 
| +++ b/ui/views/accessibility/native_view_accessibility.cc | 
| @@ -96,7 +96,16 @@ const ui::AXNodeData& NativeViewAccessibility::GetData() { | 
| } | 
|  | 
| int NativeViewAccessibility::GetChildCount() { | 
| -  int child_count = view_->child_count(); | 
| +  int child_count = 0; | 
| +  for (int i = 0; i < view_->child_count(); ++i) { | 
| +    View* child = view_->child_at(i); | 
| +    if (child->GetNativeViewAccessibility()->IsIgnored()) { | 
| +      // If not visible to accessibility clients, then use the children instead. | 
| +      child_count += child->GetNativeViewAccessibility()->GetChildCount(); | 
| +    } else { | 
| +      ++child_count; | 
| +    } | 
| +  } | 
|  | 
| std::vector<Widget*> child_widgets; | 
| PopulateChildWidgetVector(&child_widgets); | 
| @@ -106,14 +115,32 @@ int NativeViewAccessibility::GetChildCount() { | 
| } | 
|  | 
| gfx::NativeViewAccessible NativeViewAccessibility::ChildAtIndex(int index) { | 
| -  // If this is a root view, our widget might have child widgets. Include | 
| +  if (IsLeafElement()) | 
| +    return nullptr; | 
| + | 
| +  // Include the child widgets that may be present if this is a root view. | 
| std::vector<Widget*> child_widgets; | 
| PopulateChildWidgetVector(&child_widgets); | 
| int child_widget_count = static_cast<int>(child_widgets.size()); | 
|  | 
| -  if (index < view_->child_count()) { | 
| -    return view_->child_at(index)->GetNativeViewAccessible(); | 
| -  } else if (index < view_->child_count() + child_widget_count) { | 
| +  int ax_child_count = GetChildCount(); | 
| +  if (index < ax_child_count) { | 
| +    int curr_child_count = 0; | 
| +    for (int i = 0; i < view_->child_count(); ++i) { | 
| +      View* child = view_->child_at(i); | 
| +      bool ignored = child->GetNativeViewAccessibility()->IsIgnored(); | 
| +      int pending_children = | 
| +          ignored ? child->GetNativeViewAccessibility()->GetChildCount() : 1; | 
| +      if (index < curr_child_count + pending_children) { | 
| +        if (ignored) { | 
| +          return child->GetNativeViewAccessibility()->ChildAtIndex( | 
| +              index - curr_child_count); | 
| +        } | 
| +        return child->GetNativeViewAccessible(); | 
| +      } | 
| +      curr_child_count += pending_children; | 
| +    } | 
| +  } else if (index < ax_child_count + child_widget_count) { | 
| Widget* child_widget = child_widgets[index - view_->child_count()]; | 
| return child_widget->GetRootView()->GetNativeViewAccessible(); | 
| } | 
| @@ -128,8 +155,13 @@ gfx::NativeWindow NativeViewAccessibility::GetTopLevelWidget() { | 
| } | 
|  | 
| gfx::NativeViewAccessible NativeViewAccessibility::GetParent() { | 
| -  if (view_->parent()) | 
| -    return view_->parent()->GetNativeViewAccessible(); | 
| +  View* parent_view = view_->parent(); | 
| +  if (parent_view) { | 
| +    if (parent_view->GetNativeViewAccessibility()->IsIgnored()) | 
| +      return parent_view->GetNativeViewAccessibility()->GetParent(); | 
| +    else | 
| +      return parent_view->GetNativeViewAccessible(); | 
| +  } | 
|  | 
| // TODO: move this to NativeViewAccessibilityMac. | 
| #if defined(OS_MACOSX) | 
| @@ -162,14 +194,20 @@ gfx::NativeViewAccessible NativeViewAccessibility::HitTestSync(int x, int y) { | 
| return child_root_view->GetNativeViewAccessible(); | 
| } | 
|  | 
| +  if (IsLeafElement()) { | 
| +    if (IsIgnored()) | 
| +      return GetParent(); | 
| +    return GetNativeObject(); | 
| +  } | 
| + | 
| gfx::Point point(x, y); | 
| View::ConvertPointFromScreen(view_, &point); | 
| if (!view_->HitTestPoint(point)) | 
| return nullptr; | 
|  | 
| -  // Check if the point is within any of the immediate children of this | 
| -  // view. We don't have to search further because AXPlatformNode will | 
| -  // do a recursive hit test if we return anything other than |this| or NULL. | 
| +  // Check if the point is within any of the immediate children of this view. We | 
| +  // don't have to search further because AXPlatformNodeWin will do a recursive | 
| +  // hit test if we return anything other than |GetNativeObject()| or nullptr. | 
| for (int i = view_->child_count() - 1; i >= 0; --i) { | 
| View* child_view = view_->child_at(i); | 
| if (!child_view->visible()) | 
| @@ -245,6 +283,18 @@ void NativeViewAccessibility::SetParentWidget(Widget* parent_widget) { | 
| parent_widget_->AddObserver(this); | 
| } | 
|  | 
| +bool NativeViewAccessibility::IsLeafElement() { | 
| +  if (GetChildCount() != 0) | 
| +    return false; | 
| +  return true; | 
| +} | 
| + | 
| +bool NativeViewAccessibility::IsIgnored() { | 
| +  if (view_->focus_behavior() == ClientView::FocusBehavior::NEVER) | 
| +    return true; | 
| +  return false; | 
| +} | 
| + | 
| void NativeViewAccessibility::PopulateChildWidgetVector( | 
| std::vector<Widget*>* result_child_widgets) { | 
| // Only attach child widgets to the root view. | 
|  |