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