Index: chrome/browser/browser_accessibility_manager.h |
=================================================================== |
--- chrome/browser/browser_accessibility_manager.h (revision 46908) |
+++ chrome/browser/browser_accessibility_manager.h (working copy) |
@@ -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: |
- // 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(); |
+ virtual ~BrowserAccessibilityFactory() {} |
- // 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); |
+ // Create an instance of BrowserAccessibility and return a new |
+ // reference to it. |
+ virtual BrowserAccessibility* Create(); |
+}; |
- // Composes and sends a message for requesting needed accessibility |
- // information. |
- bool RequestAccessibilityInfo(WebAccessibility::InParams* in, |
- int routing_id, |
- int process_id); |
+// Manages a tree of BrowserAccessibility objects. |
+class BrowserAccessibilityManager { |
+ public: |
+ BrowserAccessibilityManager( |
+ HWND parent_hwnd, |
+ const webkit_glue::WebAccessibility& src, |
+ BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory()); |
- // Notifies assistive technology that renderer focus changed, through the |
- // platform-specific channels. |
- bool ChangeAccessibilityFocus(int acc_obj_id, int process_id, int routing_id); |
+ virtual ~BrowserAccessibilityManager(); |
- // 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); |
+ // Return a pointer to the root of the tree, does not make a new reference. |
+ BrowserAccessibility* GetRoot(); |
- // Wrapper function, for cleaner code. |
- const WebAccessibility::OutParams& response(); |
+ // Return a pointer to the object corresponding to the given child_id, |
+ // does not make a new reference. |
+ BrowserAccessibility* GetFromChildID(LONG child_id); |
- // NotificationObserver implementation. |
- virtual void Observe(NotificationType type, |
- const NotificationSource& source, |
- const NotificationDetails& details); |
+ // Get a the default IAccessible for the parent window, does not make a |
+ // new reference. |
+ IAccessible* GetParentWindowIAccessible(); |
- protected: |
- // This class is a singleton. Do not instantiate directly. |
- BrowserAccessibilityManager(); |
- friend struct DefaultSingletonTraits<BrowserAccessibilityManager>; |
+ // Get the parent window. |
+ HWND GetParentHWND(); |
- ~BrowserAccessibilityManager(); |
+ // 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_ |