• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
6 #define CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
7 #pragma once
8 
9 #include <vector>
10 
11 #include "base/hash_tables.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "build/build_config.h"
14 #include "ui/gfx/native_widget_types.h"
15 #include "webkit/glue/webaccessibility.h"
16 
17 class BrowserAccessibility;
18 #if defined(OS_WIN)
19 class BrowserAccessibilityManagerWin;
20 #endif
21 
22 struct ViewHostMsg_AccessibilityNotification_Params;
23 
24 using webkit_glue::WebAccessibility;
25 
26 // Class that can perform actions on behalf of the BrowserAccessibilityManager.
27 class BrowserAccessibilityDelegate {
28  public:
~BrowserAccessibilityDelegate()29   virtual ~BrowserAccessibilityDelegate() {}
30   virtual void SetAccessibilityFocus(int acc_obj_id) = 0;
31   virtual void AccessibilityDoDefaultAction(int acc_obj_id) = 0;
32   virtual bool HasFocus() = 0;
33   virtual gfx::Rect GetViewBounds() const = 0;
34 };
35 
36 class BrowserAccessibilityFactory {
37  public:
~BrowserAccessibilityFactory()38   virtual ~BrowserAccessibilityFactory() {}
39 
40   // Create an instance of BrowserAccessibility and return a new
41   // reference to it.
42   virtual BrowserAccessibility* Create();
43 };
44 
45 // Manages a tree of BrowserAccessibility objects.
46 class BrowserAccessibilityManager {
47  public:
48   // Creates the platform specific BrowserAccessibilityManager. Ownership passes
49   // to the caller.
50   static BrowserAccessibilityManager* Create(
51     gfx::NativeView parent_view,
52     const WebAccessibility& src,
53     BrowserAccessibilityDelegate* delegate,
54     BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory());
55 
56   virtual ~BrowserAccessibilityManager();
57 
58   // Type is a ViewHostMsg_AccessibilityNotification_Params::NotificationType.
59   // We pass it as int so that we don't include the render message declaration
60   // header here.
NotifyAccessibilityEvent(int type,BrowserAccessibility * node)61   virtual void NotifyAccessibilityEvent(
62       int type,
63       BrowserAccessibility* node) { }
64 
65   // Returns the next unique child id.
66   static int32 GetNextChildID();
67 
68   // Return a pointer to the root of the tree, does not make a new reference.
69   BrowserAccessibility* GetRoot();
70 
71   // Removes the BrowserAccessibility child_id and renderer_id from the manager.
72   void Remove(int32 child_id, int32 renderer_id);
73 
74   // Return a pointer to the object corresponding to the given child_id,
75   // does not make a new reference.
76   BrowserAccessibility* GetFromChildID(int32 child_id);
77 
78   // Called to notify the accessibility manager that its associated native
79   // view got focused.
80   void GotFocus();
81 
82   // Update the focused node to |node|, which may be null.
83   // If |notify| is true, send a message to the renderer to set focus
84   // to this node.
85   void SetFocus(BrowserAccessibility* node, bool notify);
86 
87   // Tell the renderer to do the default action for this node.
88   void DoDefaultAction(const BrowserAccessibility& node);
89 
90   // Retrieve the bounds of the parent View in screen coordinates.
91   gfx::Rect GetViewBounds();
92 
93   // Called when the renderer process has notified us of about tree changes.
94   // Send a notification to MSAA clients of the change.
95   void OnAccessibilityNotifications(
96       const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params);
97 
98   gfx::NativeView GetParentView();
99 
100 #if defined(OS_WIN)
101   BrowserAccessibilityManagerWin* toBrowserAccessibilityManagerWin();
102 #endif
103 
104   // Return the object that has focus, if it's a descandant of the
105   // given root (inclusive). Does not make a new reference.
106   BrowserAccessibility* GetFocus(BrowserAccessibility* root);
107 
108  protected:
109   BrowserAccessibilityManager(
110       gfx::NativeView parent_view,
111       const WebAccessibility& src,
112       BrowserAccessibilityDelegate* delegate,
113       BrowserAccessibilityFactory* factory);
114 
115  private:
116   void OnAccessibilityObjectStateChange(
117       const WebAccessibility& acc_obj);
118   void OnAccessibilityObjectChildrenChange(
119       const WebAccessibility& acc_obj);
120   void OnAccessibilityObjectFocusChange(
121       const WebAccessibility& acc_obj);
122   void OnAccessibilityObjectLoadComplete(
123       const WebAccessibility& acc_obj);
124   void OnAccessibilityObjectValueChange(
125       const WebAccessibility& acc_obj);
126   void OnAccessibilityObjectTextChange(
127       const WebAccessibility& acc_obj);
128 
129   // Update an accessibility node with an updated WebAccessibility node
130   // received from the renderer process. When |include_children| is true
131   // the node's children will also be updated, otherwise only the node
132   // itself is updated. Returns the updated node or NULL if no node was
133   // updated.
134   BrowserAccessibility* UpdateNode(
135       const WebAccessibility& src,
136       bool include_children);
137 
138   // Recursively build a tree of BrowserAccessibility objects from
139   // the WebAccessibility tree received from the renderer process.
140   BrowserAccessibility* CreateAccessibilityTree(
141       BrowserAccessibility* parent,
142       const WebAccessibility& src,
143       int index_in_parent);
144 
145  protected:
146   // The next unique id for a BrowserAccessibility instance.
147   static int32 next_child_id_;
148 
149   // The parent view.
150   gfx::NativeView parent_view_;
151 
152   // The object that can perform actions on our behalf.
153   BrowserAccessibilityDelegate* delegate_;
154 
155   // Factory to create BrowserAccessibility objects (for dependency injection).
156   scoped_ptr<BrowserAccessibilityFactory> factory_;
157 
158   // The root of the tree of IAccessible objects and the element that
159   // currently has focus, if any.
160   BrowserAccessibility* root_;
161   BrowserAccessibility* focus_;
162 
163   // A mapping from the IDs of objects in the renderer, to the child IDs
164   // we use internally here.
165   base::hash_map<int32, int32> renderer_id_to_child_id_map_;
166 
167   // A mapping from child IDs to BrowserAccessibility objects.
168   base::hash_map<int32, BrowserAccessibility*> child_id_map_;
169 
170   DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManager);
171 };
172 
173 #endif  // CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
174