summaryrefslogtreecommitdiffstats
path: root/chrome/browser/browser_accessibility_manager.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/browser_accessibility_manager.h')
-rw-r--r--chrome/browser/browser_accessibility_manager.h156
1 files changed, 77 insertions, 79 deletions
diff --git a/chrome/browser/browser_accessibility_manager.h b/chrome/browser/browser_accessibility_manager.h
index 4850242..1db8100 100644
--- a/chrome/browser/browser_accessibility_manager.h
+++ b/chrome/browser/browser_accessibility_manager.h
@@ -1,104 +1,102 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// 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_H_
#define CHROME_BROWSER_BROWSER_ACCESSIBILITY_MANAGER_H_
+#include <atlbase.h>
+#include <atlcom.h>
+#include <oleacc.h>
+
#include <map>
-#include "base/singleton.h"
-#include "chrome/common/notification_registrar.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 RenderProcessHost;
class RenderWidgetHost;
-using webkit_glue::WebAccessibility;
-
-////////////////////////////////////////////////////////////////////////////////
-//
-// BrowserAccessibilityManager
-//
-// Used to manage instance creation and memory handling for browser side
-// accessibility. A singleton class. It implements NotificationObserver to
-// ensure that a termination of a renderer process gets propagated to the
-// active BrowserAccessibility instances calling into it. Each such instance
-// will upon such an event be set to an inactive state, failing calls from the
-// assistive technology gracefully.
-////////////////////////////////////////////////////////////////////////////////
-class BrowserAccessibilityManager : public NotificationObserver {
+class 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 BrowserAccessibilityManager {
public:
- // Gets the singleton BrowserAccessibilityManager object. The first time this
- // method is called, a CacheManagerHost object is constructed and returned.
- // Subsequent calls will return the same object.
- static BrowserAccessibilityManager* GetInstance();
-
- // Creates an instance of BrowserAccessibility, initializes it and sets the
- // |acc_obj_id|, which is used for IPC communication, and |instance_id|,
- // which is used to identify the mapping between accessibility instance and
- // RenderProcess.
- STDMETHODIMP CreateAccessibilityInstance(REFIID iid,
- int acc_obj_id,
- int routing_id,
- int process_id,
- HWND parent_hwnd,
- void** interface_ptr);
-
- // Composes and sends a message for requesting needed accessibility
- // information.
- bool RequestAccessibilityInfo(WebAccessibility::InParams* in,
- int routing_id,
- int process_id);
-
- // Notifies assistive technology that renderer focus changed, through the
- // platform-specific channels.
- bool ChangeAccessibilityFocus(int acc_obj_id, int process_id, int routing_id);
-
- // Notifies assistive technology that an object's state changed, through the
- // platform-specific channels.
- bool OnAccessibilityObjectStateChange(int acc_obj_id,
- int process_id,
- int routing_id);
-
- // Wrapper function, for cleaner code.
- const WebAccessibility::OutParams& response();
-
- // NotificationObserver implementation.
- virtual void Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details);
-
- protected:
- // This class is a singleton. Do not instantiate directly.
- BrowserAccessibilityManager();
- friend struct DefaultSingletonTraits<BrowserAccessibilityManager>;
-
- ~BrowserAccessibilityManager();
+ BrowserAccessibilityManager(
+ HWND parent_hwnd,
+ const webkit_glue::WebAccessibility& src,
+ 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);
+
+ // 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:
- // Retrieves the BrowserAccessibility instance connected to the
- // RenderProcessHost identified by the process/routing id pair.
- BrowserAccessibility* GetBrowserAccessibility(int process_id, int routing_id);
+ // 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);
- // Multi-map from process id (key) to active BrowserAccessibility instances
- // for that RenderProcessHost.
- typedef std::multimap<int, BrowserAccessibility*> RenderProcessHostMap;
- typedef std::pair<int, BrowserAccessibility*> MapEntry;
+ // The parent window.
+ HWND parent_hwnd_;
- NotificationRegistrar registrar_;
+ // Factory to create BrowserAccessibility objects (for dependency injection).
+ scoped_ptr<BrowserAccessibilityFactory> factory_;
- // Mapping to track which RenderProcessHosts ids are active. If a
- // RenderProcessHost is found to be terminated, its id (key) should be removed
- // from this mapping, and the connected BrowserAccessibility ids/instances
- // invalidated.
- RenderProcessHostMap render_process_host_map_;
+ // A default IAccessible instance for the parent window.
+ ScopedComPtr<IAccessible> window_iaccessible_;
- // Structure passed by reference to hold response parameters from the
- // renderer.
- WebAccessibility::OutParams out_params_;
+ // 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_H_