15c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Copyright 2014 The Chromium Authors. All rights reserved.
25c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// Use of this source code is governed by a BSD-style license that can be
35c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// found in the LICENSE file.
45c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/ash/accessibility/ax_tree_source_ash.h"
65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include <vector>
85c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/accessibility/ax_aura_obj_cache.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/accessibility/ax_aura_obj_wrapper.h"
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing views::AXAuraObjCache;
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuusing views::AXAuraObjWrapper;
145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AXTreeSourceAsh::AXTreeSourceAsh() {
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  root_.reset(
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      new AXRootObjWrapper(AXAuraObjCache::GetInstance()->GetNextID()));
185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AXTreeSourceAsh::~AXTreeSourceAsh() {
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  root_.reset();
225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AXTreeSourceAsh::DoDefault(int32 id) {
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AXAuraObjWrapper* obj = AXAuraObjCache::GetInstance()->Get(id);
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK(obj);
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  obj->DoDefault();
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AXTreeSourceAsh::Focus(int32 id) {
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AXAuraObjWrapper* obj = AXAuraObjCache::GetInstance()->Get(id);
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK(obj);
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  obj->Focus();
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AXTreeSourceAsh::MakeVisible(int32 id) {
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AXAuraObjWrapper* obj = AXAuraObjCache::GetInstance()->Get(id);
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK(obj);
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  obj->MakeVisible();
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AXTreeSourceAsh::SetSelection(int32 id, int32 start, int32 end) {
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AXAuraObjWrapper* obj = AXAuraObjCache::GetInstance()->Get(id);
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  CHECK(obj);
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  obj->SetSelection(start, end);
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AXAuraObjWrapper* AXTreeSourceAsh::GetRoot() const {
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return root_.get();
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AXAuraObjWrapper* AXTreeSourceAsh::GetFromId(int32 id) const {
535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (id == root_->GetID())
545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return root_.get();
555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return AXAuraObjCache::GetInstance()->Get(id);
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int32 AXTreeSourceAsh::GetId(AXAuraObjWrapper* node) const {
595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return node->GetID();
605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AXTreeSourceAsh::GetChildren(AXAuraObjWrapper* node,
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    std::vector<AXAuraObjWrapper*>* out_children) const {
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  node->GetChildren(out_children);
655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AXAuraObjWrapper* AXTreeSourceAsh::GetParent(AXAuraObjWrapper* node) const {
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  AXAuraObjWrapper* parent = node->GetParent();
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!parent && root_->HasChild(node))
705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    parent = root_.get();
715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return parent;
725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AXTreeSourceAsh::IsValid(AXAuraObjWrapper* node) const {
755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return node && node->GetID() != -1;
765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool AXTreeSourceAsh::IsEqual(AXAuraObjWrapper* node1,
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                AXAuraObjWrapper* node2) const {
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  if (!node1 || !node2)
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    return false;
825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return node1->GetID() == node2->GetID() && node1->GetID() != -1;
845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AXAuraObjWrapper* AXTreeSourceAsh::GetNull() const {
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return NULL;
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AXTreeSourceAsh::SerializeNode(
915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    AXAuraObjWrapper* node, ui::AXNodeData* out_data) const {
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  node->Serialize(out_data);
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string AXTreeSourceAsh::ToString(
965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    AXAuraObjWrapper* root, std::string prefix) {
975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  ui::AXNodeData data;
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  root->Serialize(&data);
995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::string output = prefix + data.ToString() + '\n';
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  std::vector<AXAuraObjWrapper*> children;
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  root->GetChildren(&children);
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  prefix += prefix[0];
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  for (size_t i = 0; i < children.size(); ++i)
1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    output += ToString(children[i], prefix);
1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return output;
1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
110