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 55c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/accessibility/ax_aura_obj_cache.h" 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 75c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "base/memory/singleton.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/stl_util.h" 95c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/aura/window.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/accessibility/ax_aura_obj_wrapper.h" 115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/accessibility/ax_view_obj_wrapper.h" 125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/accessibility/ax_widget_obj_wrapper.h" 135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/accessibility/ax_window_obj_wrapper.h" 145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/view.h" 155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/views/widget/widget.h" 165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liunamespace views { 185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// static 205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuAXAuraObjCache* AXAuraObjCache::GetInstance() { 215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return Singleton<AXAuraObjCache>::get(); 225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuAXAuraObjWrapper* AXAuraObjCache::GetOrCreate(View* view) { 255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return CreateInternal<AXViewObjWrapper>(view, view_to_id_map_); 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuAXAuraObjWrapper* AXAuraObjCache::GetOrCreate(Widget* widget) { 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return CreateInternal<AXWidgetObjWrapper>(widget, widget_to_id_map_); 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuAXAuraObjWrapper* AXAuraObjCache::GetOrCreate(aura::Window* window) { 335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return CreateInternal<AXWindowObjWrapper>(window, window_to_id_map_); 345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuint32 AXAuraObjCache::GetID(View* view) { 375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return GetIDInternal(view, view_to_id_map_); 385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuint32 AXAuraObjCache::GetID(Widget* widget) { 415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return GetIDInternal(widget, widget_to_id_map_); 425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuint32 AXAuraObjCache::GetID(aura::Window* window) { 455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return GetIDInternal(window, window_to_id_map_); 465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid AXAuraObjCache::Remove(View* view) { 495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RemoveInternal(view, view_to_id_map_); 505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid AXAuraObjCache::Remove(Widget* widget) { 535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RemoveInternal(widget, widget_to_id_map_); 545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid AXAuraObjCache::Remove(aura::Window* window) { 575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu RemoveInternal(window, window_to_id_map_); 585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 595c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuAXAuraObjWrapper* AXAuraObjCache::Get(int32 id) { 615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu std::map<int32, AXAuraObjWrapper*>::iterator it = cache_.find(id); 625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (it == cache_.end()) 645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return NULL; 655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return it->second; 675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid AXAuraObjCache::Remove(int32 id) { 705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AXAuraObjWrapper* obj = Get(id); 715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (id == -1 || !obj) 735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu cache_.erase(id); 765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete obj; 775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuAXAuraObjCache::AXAuraObjCache() : current_id_(1) { 805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuAXAuraObjCache::~AXAuraObjCache() { 835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu STLDeleteContainerPairSecondPointers(cache_.begin(), cache_.end()); 845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu cache_.clear(); 855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutemplate <typename AuraViewWrapper, typename AuraView> 885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuAXAuraObjWrapper* AXAuraObjCache::CreateInternal( 895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AuraView* aura_view, std::map<AuraView*, int32>& aura_view_to_id_map) { 905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!aura_view) 915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return NULL; 925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typename std::map<AuraView*, int32>::iterator it = 945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura_view_to_id_map.find(aura_view); 955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 965c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (it != aura_view_to_id_map.end()) 975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return Get(it->second); 985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AXAuraObjWrapper* wrapper = new AuraViewWrapper(aura_view); 1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura_view_to_id_map[aura_view] = current_id_; 1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu cache_[current_id_] = wrapper; 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu current_id_++; 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return wrapper; 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutemplate<typename AuraView> int32 AXAuraObjCache::GetIDInternal( 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AuraView* aura_view, std::map<AuraView*, int32>& aura_view_to_id_map) { 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (!aura_view) 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return -1; 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu typename std::map<AuraView*, int32>::iterator it = 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura_view_to_id_map.find(aura_view); 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (it != aura_view_to_id_map.end()) 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return it->second; 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return -1; 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liutemplate<typename AuraView> 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuvoid AXAuraObjCache::RemoveInternal( 1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu AuraView* aura_view, std::map<AuraView*, int32>& aura_view_to_id_map) { 1235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu int32 id = GetID(aura_view); 1245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if (id == -1) 1255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return; 1265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu aura_view_to_id_map.erase(aura_view); 1275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu Remove(id); 1285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} 1295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu} // namespace views 131