diff options
author | ctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-07 05:20:23 +0000 |
---|---|---|
committer | ctguil@chromium.org <ctguil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-10-07 05:20:23 +0000 |
commit | f27e81c63be89c62d84105a9329c0744c27e1641 (patch) | |
tree | 011fa1f7421d32e5629a7628766ac7e0009e8dc4 /chrome/browser/accessibility/browser_accessibility_manager.h | |
parent | 68e677bf27869d144da2131cf5d60df785d5b920 (diff) | |
download | chromium_src-f27e81c63be89c62d84105a9329c0744c27e1641.zip chromium_src-f27e81c63be89c62d84105a9329c0744c27e1641.tar.gz chromium_src-f27e81c63be89c62d84105a9329c0744c27e1641.tar.bz2 |
Make BrowserAccessibilityManager cross platform. Step 2.
1. Move common logic and fields from BrowserAccessibilityMangerWin to BrowserAccessibilityManager.
2. Move common logic and fields from BrowserAccessibilityWin to BrowserAccessibility.
BUG=55264
TEST=interactive_ui_tests:AccessibilityWinBrowserTest.*
TEST=unit_tests:BrowserAccessibilityTest.*
Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=61740
Review URL: http://codereview.chromium.org/3551015
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@61765 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/accessibility/browser_accessibility_manager.h')
-rw-r--r-- | chrome/browser/accessibility/browser_accessibility_manager.h | 153 |
1 files changed, 123 insertions, 30 deletions
diff --git a/chrome/browser/accessibility/browser_accessibility_manager.h b/chrome/browser/accessibility/browser_accessibility_manager.h index 4fe5f85..ff96e56 100644 --- a/chrome/browser/accessibility/browser_accessibility_manager.h +++ b/chrome/browser/accessibility/browser_accessibility_manager.h @@ -6,18 +6,20 @@ #define CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_ #pragma once -#include "build/build_config.h" - -#if defined(OS_WIN) -#include <oleacc.h> -#endif - #include <vector> +#include "base/hash_tables.h" +#include "base/scoped_ptr.h" +#include "build/build_config.h" +#include "chrome/common/render_messages_params.h" #include "gfx/native_widget_types.h" #include "webkit/glue/webaccessibility.h" -struct ViewHostMsg_AccessibilityNotification_Params; + +class BrowserAccessibility; +#if defined(OS_WIN) +class BrowserAccessibilityManagerWin; +#endif using webkit_glue::WebAccessibility; @@ -30,52 +32,143 @@ class BrowserAccessibilityDelegate { virtual bool HasFocus() = 0; }; +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: // Creates the platform specific BrowserAccessibilityManager. Ownership passes // to the caller. static BrowserAccessibilityManager* Create( - gfx::NativeWindow parent_window, - const webkit_glue::WebAccessibility& src, - BrowserAccessibilityDelegate* delegate); + gfx::NativeView parent_view, + const WebAccessibility& src, + BrowserAccessibilityDelegate* delegate, + BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory()); virtual ~BrowserAccessibilityManager(); + virtual void NotifyAccessibilityEvent( + ViewHostMsg_AccessibilityNotification_Params::NotificationType n, + BrowserAccessibility* node) = 0; + + // Returns the next unique child id. + static int32 GetNextChildID(); + + // Return a pointer to the root of the tree, does not make a new reference. + BrowserAccessibility* GetRoot(); + + // Removes the BrowserAccessibility child_id from the manager. + void Remove(int32 child_id); + + // Return a pointer to the object corresponding to the given child_id, + // does not make a new reference. + BrowserAccessibility* GetFromChildID(int32 child_id); + // Called to notify the accessibility manager that its associated native - // window got focused. - virtual void GotFocus() = 0; + // view got focused. + void GotFocus(); + + // 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 about tree changes. // Send a notification to MSAA clients of the change. void OnAccessibilityNotifications( const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params); - gfx::NativeWindow GetParentWindow(); + gfx::NativeView GetParentView(); #if defined(OS_WIN) - virtual IAccessible* GetRootAccessible() = 0; + 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); + protected: - explicit BrowserAccessibilityManager(gfx::NativeWindow parent_window); - - virtual void OnAccessibilityObjectStateChange( - const webkit_glue::WebAccessibility& acc_obj) = 0; - virtual void OnAccessibilityObjectChildrenChange( - const webkit_glue::WebAccessibility& acc_obj) = 0; - virtual void OnAccessibilityObjectFocusChange( - const webkit_glue::WebAccessibility& acc_obj) = 0; - virtual void OnAccessibilityObjectLoadComplete( - const webkit_glue::WebAccessibility& acc_obj) = 0; - virtual void OnAccessibilityObjectValueChange( - const webkit_glue::WebAccessibility& acc_obj) = 0; - virtual void OnAccessibilityObjectTextChange( - const webkit_glue::WebAccessibility& acc_obj) = 0; + BrowserAccessibilityManager( + gfx::NativeView parent_view, + const WebAccessibility& src, + BrowserAccessibilityDelegate* delegate, + BrowserAccessibilityFactory* factory); private: - // The parent window. - gfx::NativeWindow parent_window_; + void OnAccessibilityObjectStateChange( + const WebAccessibility& acc_obj); + void OnAccessibilityObjectChildrenChange( + const WebAccessibility& acc_obj); + void OnAccessibilityObjectFocusChange( + const WebAccessibility& acc_obj); + void OnAccessibilityObjectLoadComplete( + const WebAccessibility& acc_obj); + void OnAccessibilityObjectValueChange( + const WebAccessibility& acc_obj); + void OnAccessibilityObjectTextChange( + const WebAccessibility& acc_obj); + + // Recursively compare the IDs of our subtree to a new subtree received + // from the renderer and return true if their IDs match exactly. + bool CanModifyTreeInPlace( + BrowserAccessibility* current_root, + const WebAccessibility& new_root); + + // Recursively modify a subtree (by reinitializing) to match a new + // subtree received from the renderer process. Should only be called + // if CanModifyTreeInPlace returned true. + void ModifyTreeInPlace( + BrowserAccessibility* current_root, + const WebAccessibility& new_root); + + // Update the accessibility tree with an updated WebAccessibility tree or + // subtree received from the renderer process. First attempts to modify + // the tree in place, and if that fails, replaces the entire subtree. + // Returns the updated node or NULL if no node was updated. + BrowserAccessibility* UpdateTree( + const WebAccessibility& acc_obj); + + // Recursively build a tree of BrowserAccessibility objects from + // the WebAccessibility tree received from the renderer process. + BrowserAccessibility* CreateAccessibilityTree( + BrowserAccessibility* parent, + int child_id, + const WebAccessibility& src, + int index_in_parent); + + protected: + // The next unique id for a BrowserAccessibility instance. + static int32 next_child_id_; + + // The parent view. + gfx::NativeView parent_view_; + + // 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 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, int32> renderer_id_to_child_id_map_; + + // A mapping from child IDs to BrowserAccessibility objects. + base::hash_map<int32, BrowserAccessibility*> child_id_map_; DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManager); }; |