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
|
// Copyright (c) 2010 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 CHROME_BROWSER_BROWSER_ACCESSIBILITY_MANAGER_WIN_H_
#define CHROME_BROWSER_BROWSER_ACCESSIBILITY_MANAGER_WIN_H_
#pragma once
#include <atlbase.h>
#include <atlcom.h>
#include <oleacc.h>
#include "base/hash_tables.h"
#include "base/scoped_comptr_win.h"
#include "base/scoped_ptr.h"
#include "webkit/glue/webaccessibility.h"
class BrowserAccessibility;
class BrowserAccessibilityFactory {
public:
virtual ~BrowserAccessibilityFactory() {}
// Create an instance of BrowserAccessibility and return a new
// reference to it.
virtual BrowserAccessibility* Create();
};
// Class that can perform actions on behalf of the BrowserAccessibilityManager.
class BrowserAccessibilityDelegate {
public:
virtual ~BrowserAccessibilityDelegate() {}
virtual void SetAccessibilityFocus(int acc_obj_id) = 0;
virtual void AccessibilityDoDefaultAction(int acc_obj_id) = 0;
};
// Manages a tree of BrowserAccessibility objects.
class BrowserAccessibilityManager {
public:
BrowserAccessibilityManager(
HWND parent_hwnd,
const webkit_glue::WebAccessibility& src,
BrowserAccessibilityDelegate* delegate,
BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory());
virtual ~BrowserAccessibilityManager();
// Return a pointer to the root of the tree, does not make a new reference.
BrowserAccessibility* GetRoot();
// Return a pointer to the object corresponding to the given child_id,
// does not make a new reference.
BrowserAccessibility* GetFromChildID(LONG child_id);
// Get a the default IAccessible for the parent window, does not make a
// new reference.
IAccessible* GetParentWindowIAccessible();
// Get the parent window.
HWND GetParentHWND();
// 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);
// Tell the renderer to set focus to this node.
void SetFocus(const BrowserAccessibility& node);
// Tell the renderer to do the default action for this node.
void DoDefaultAction(const BrowserAccessibility& node);
// Called when the renderer process has notified us of a focus or state
// change. Send a notification to MSAA clients of the change.
void OnAccessibilityFocusChange(int acc_obj_id);
void OnAccessibilityObjectStateChange(int acc_obj_id);
private:
// Recursively build a tree of BrowserAccessibility objects from
// the WebAccessibility tree received from the renderer process.
BrowserAccessibility* CreateAccessibilityTree(
BrowserAccessibility* parent,
const webkit_glue::WebAccessibility& src,
int index_in_parent);
// The parent window.
HWND parent_hwnd_;
// The object that can perform actions on our behalf.
BrowserAccessibilityDelegate* delegate_;
// Factory to create BrowserAccessibility objects (for dependency injection).
scoped_ptr<BrowserAccessibilityFactory> factory_;
// A default IAccessible instance for the parent window.
ScopedComPtr<IAccessible> window_iaccessible_;
// The root of the tree of IAccessible objects and the element that
// currently has focus, if any.
BrowserAccessibility* root_;
BrowserAccessibility* focus_;
// A mapping from the IDs of objects in the renderer, to the child IDs
// we use internally here.
base::hash_map<int, LONG> renderer_id_to_child_id_map_;
// A mapping from child IDs to BrowserAccessibility objects.
base::hash_map<LONG, BrowserAccessibility*> child_id_map_;
// The next child ID to use; static so that they're global to the process.
// Screen readers cache these IDs to see if they've seen the same object
// before so we should avoid reusing them within the same project.
static LONG next_child_id_;
DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManager);
};
#endif // CHROME_BROWSER_BROWSER_ACCESSIBILITY_MANAGER_WIN_H_
|