Implementing ATK functions get_index_in_parent & ref_relation_set for Chrome UI

BUG=463671

Review URL: https://codereview.chromium.org/1029043002

Cr-Commit-Position: refs/heads/master@{#321929}
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc
index ad55defc..3ecb4e46 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.cc
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -86,6 +86,28 @@
       ui::AX_ATTR_DESCRIPTION).c_str();
 }
 
+static gint ax_platform_node_auralinux_get_index_in_parent(
+    AtkObject* atk_object) {
+  ui::AXPlatformNodeAuraLinux* obj =
+    AtkObjectToAXPlatformNodeAuraLinux(atk_object);
+
+  if (!obj || !obj->GetParent())
+    return -1;
+
+  AtkObject* obj_parent = obj->GetParent();
+
+  unsigned child_count = atk_object_get_n_accessible_children(obj_parent);
+  for (unsigned index = 0; index < child_count; index++) {
+    AtkObject* child = atk_object_ref_accessible_child(obj_parent, index);
+    bool atk_object_found = child == atk_object;
+    g_object_unref(child);
+    if (atk_object_found)
+      return index;
+  }
+
+  return obj->GetIndexInParent();
+}
+
 static AtkObject* ax_platform_node_auralinux_get_parent(AtkObject* atk_object) {
   ui::AXPlatformNodeAuraLinux* obj =
       AtkObjectToAXPlatformNodeAuraLinux(atk_object);
@@ -117,6 +139,21 @@
   return result;
 }
 
+static AtkRelationSet* ax_platform_node_auralinux_ref_relation_set(
+    AtkObject* atk_object) {
+  ui::AXPlatformNodeAuraLinux* obj =
+      AtkObjectToAXPlatformNodeAuraLinux(atk_object);
+  AtkRelationSet* atk_relation_set =
+      ATK_OBJECT_CLASS(ax_platform_node_auralinux_parent_class)->
+      ref_relation_set(atk_object);
+
+  if (!obj)
+    return atk_relation_set;
+
+  obj->GetAtkRelations(atk_relation_set);
+  return atk_relation_set;
+}
+
 static AtkRole ax_platform_node_auralinux_get_role(AtkObject* atk_object) {
   ui::AXPlatformNodeAuraLinux* obj =
       AtkObjectToAXPlatformNodeAuraLinux(atk_object);
@@ -175,6 +212,8 @@
   klass->ref_child = ax_platform_node_auralinux_ref_child;
   klass->get_role = ax_platform_node_auralinux_get_role;
   klass->ref_state_set = ax_platform_node_auralinux_ref_state_set;
+  klass->get_index_in_parent = ax_platform_node_auralinux_get_index_in_parent;
+  klass->ref_relation_set = ax_platform_node_auralinux_ref_relation_set;
 }
 
 GType ax_platform_node_auralinux_get_type() {
@@ -315,6 +354,10 @@
     atk_state_set_add_state(state_set, ATK_STATE_SELECTED);
 }
 
+void AXPlatformNodeAuraLinux::GetAtkRelations(AtkRelationSet* atk_relation_set)
+{
+}
+
 AXPlatformNodeAuraLinux::AXPlatformNodeAuraLinux()
     : atk_object_(nullptr) {
 }
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.h b/ui/accessibility/platform/ax_platform_node_auralinux.h
index 030a66a..8f86bc71 100644
--- a/ui/accessibility/platform/ax_platform_node_auralinux.h
+++ b/ui/accessibility/platform/ax_platform_node_auralinux.h
@@ -24,6 +24,7 @@
 
   AtkRole GetAtkRole();
   void GetAtkState(AtkStateSet* state_set);
+  void GetAtkRelations(AtkRelationSet* atk_relation_set);
 
   // AXPlatformNode overrides.
   void Destroy() override;