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