1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
#define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
#include <vector>
#include "base/containers/hash_tables.h"
#include "base/memory/scoped_ptr.h"
#include "build/build_config.h"
#include "content/common/accessibility_node_data.h"
#include "content/common/content_export.h"
#include "ui/gfx/native_widget_types.h"
struct AccessibilityHostMsg_NotificationParams;
namespace content {
class BrowserAccessibility;
#if defined(OS_WIN)
class BrowserAccessibilityManagerWin;
#endif
// Class that can perform actions on behalf of the BrowserAccessibilityManager.
class CONTENT_EXPORT BrowserAccessibilityDelegate {
public:
virtual ~BrowserAccessibilityDelegate() {}
virtual void SetAccessibilityFocus(int acc_obj_id) = 0;
virtual void AccessibilityDoDefaultAction(int acc_obj_id) = 0;
virtual void AccessibilityScrollToMakeVisible(
int acc_obj_id, gfx::Rect subfocus) = 0;
virtual void AccessibilityScrollToPoint(
int acc_obj_id, gfx::Point point) = 0;
virtual void AccessibilitySetTextSelection(
int acc_obj_id, int start_offset, int end_offset) = 0;
virtual bool HasFocus() const = 0;
virtual gfx::Rect GetViewBounds() const = 0;
virtual gfx::Point GetLastTouchEventLocation() const = 0;
virtual void FatalAccessibilityTreeError() = 0;
};
class CONTENT_EXPORT BrowserAccessibilityFactory {
public:
virtual ~BrowserAccessibilityFactory() {}
// Create an instance of BrowserAccessibility and return a new
// reference to it.
virtual BrowserAccessibility* Create();
};
// Manages a tree of BrowserAccessibility objects.
class CONTENT_EXPORT BrowserAccessibilityManager {
public:
// Creates the platform-specific BrowserAccessibilityManager, but
// with no parent window pointer. Only useful for unit tests.
static BrowserAccessibilityManager* Create(
const AccessibilityNodeData& src,
BrowserAccessibilityDelegate* delegate,
BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory());
virtual ~BrowserAccessibilityManager();
// Type is enum AccessibilityNotification.
// We pass it as int so that we don't include the message declaration
// header here.
virtual void NotifyAccessibilityEvent(
int type,
BrowserAccessibility* node) { }
// Return a pointer to the root of the tree, does not make a new reference.
BrowserAccessibility* GetRoot();
// Removes a node from the manager.
virtual void RemoveNode(BrowserAccessibility* node);
// Return a pointer to the object corresponding to the given renderer_id,
// does not make a new reference.
BrowserAccessibility* GetFromRendererID(int32 renderer_id);
// Called to notify the accessibility manager that its associated native
// view got focused. This implies that it is shown (opposite of WasHidden,
// below).
// The touch_event_context parameter indicates that we were called in the
// context of a touch event.
void GotFocus(bool touch_event_context);
// Called to notify the accessibility manager that its associated native
// view was hidden. When it's no longer hidden, GotFocus will be called.
void WasHidden();
// Called to notify the accessibility manager that a mouse down event
// occurred in the tab.
void GotMouseDown();
// Update the focused node to |node|, which may be null.
// If |notify| is true, send a message to the renderer to set focus
// to this node.
void SetFocus(BrowserAccessibility* node, bool notify);
// Tell the renderer to do the default action for this node.
void DoDefaultAction(const BrowserAccessibility& node);
// Tell the renderer to scroll to make |node| visible.
// In addition, if it's not possible to make the entire object visible,
// scroll so that the |subfocus| rect is visible at least. The subfocus
// rect is in local coordinates of the object itself.
void ScrollToMakeVisible(
const BrowserAccessibility& node, gfx::Rect subfocus);
// Tell the renderer to scroll such that |node| is at |point|,
// where |point| is in global coordinates of the WebContents.
void ScrollToPoint(
const BrowserAccessibility& node, gfx::Point point);
// Tell the renderer to set the text selection on a node.
void SetTextSelection(
const BrowserAccessibility& node, int start_offset, int end_offset);
// Retrieve the bounds of the parent View in screen coordinates.
gfx::Rect GetViewBounds();
// Called when the renderer process has notified us of about tree changes.
// Send a notification to MSAA clients of the change.
void OnAccessibilityNotifications(
const std::vector<AccessibilityHostMsg_NotificationParams>& params);
#if defined(OS_WIN)
BrowserAccessibilityManagerWin* ToBrowserAccessibilityManagerWin();
#endif
// Return the object that has focus, if it's a descandant of the
// given root (inclusive). Does not make a new reference.
BrowserAccessibility* GetFocus(BrowserAccessibility* root);
// Is the on-screen keyboard allowed to be shown, in response to a
// focus event on a text box?
bool IsOSKAllowed(const gfx::Rect& bounds);
// For testing only: update the given nodes as if they were
// received from the renderer process in OnAccessibilityNotifications.
// Takes up to 7 nodes at once so tests don't need to create a vector
// each time.
void UpdateNodesForTesting(
const AccessibilityNodeData& node,
const AccessibilityNodeData& node2 = AccessibilityNodeData(),
const AccessibilityNodeData& node3 = AccessibilityNodeData(),
const AccessibilityNodeData& node4 = AccessibilityNodeData(),
const AccessibilityNodeData& node5 = AccessibilityNodeData(),
const AccessibilityNodeData& node6 = AccessibilityNodeData(),
const AccessibilityNodeData& node7 = AccessibilityNodeData());
protected:
BrowserAccessibilityManager(
const AccessibilityNodeData& src,
BrowserAccessibilityDelegate* delegate,
BrowserAccessibilityFactory* factory);
virtual void AddNodeToMap(BrowserAccessibility* node);
private:
// The following states keep track of whether or not the
// on-screen keyboard is allowed to be shown.
enum OnScreenKeyboardState {
// Never show the on-screen keyboard because this tab is hidden.
OSK_DISALLOWED_BECAUSE_TAB_HIDDEN,
// This tab was just shown, so don't pop-up the on-screen keyboard if a
// text field gets focus that wasn't the result of an explicit touch.
OSK_DISALLOWED_BECAUSE_TAB_JUST_APPEARED,
// A touch event has occurred within the window, but focus has not
// explicitly changed. Allow the on-screen keyboard to be shown if the
// touch event was within the bounds of the currently focused object.
// Otherwise we'll just wait to see if focus changes.
OSK_ALLOWED_WITHIN_FOCUSED_OBJECT,
// Focus has changed within a tab that's already visible. Allow the
// on-screen keyboard to show anytime that a touch event leads to an
// editable text control getting focus.
OSK_ALLOWED
};
// Update a set of nodes using data received from the renderer
// process.
bool UpdateNodes(const std::vector<AccessibilityNodeData>& nodes);
// Update one node from the tree using data received from the renderer
// process. Returns true on success, false on fatal error.
bool UpdateNode(const AccessibilityNodeData& src);
BrowserAccessibility* CreateNode(
BrowserAccessibility* parent,
int32 renderer_id,
int32 index_in_parent);
protected:
// The object that can perform actions on our behalf.
BrowserAccessibilityDelegate* delegate_;
// Factory to create BrowserAccessibility objects (for dependency injection).
scoped_ptr<BrowserAccessibilityFactory> factory_;
// The root of the tree of accessible objects and the element that
// currently has focus, if any.
BrowserAccessibility* root_;
BrowserAccessibility* focus_;
// The on-screen keyboard state.
OnScreenKeyboardState osk_state_;
// A mapping from renderer IDs to BrowserAccessibility objects.
base::hash_map<int32, BrowserAccessibility*> renderer_id_map_;
DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManager);
};
} // namespace content
#endif // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
|