Home | History | Annotate | Download | only in accessibility
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
      6 #define CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
      7 #pragma once
      8 
      9 #include <vector>
     10 
     11 #include "base/hash_tables.h"
     12 #include "base/memory/scoped_ptr.h"
     13 #include "build/build_config.h"
     14 #include "ui/gfx/native_widget_types.h"
     15 #include "webkit/glue/webaccessibility.h"
     16 
     17 class BrowserAccessibility;
     18 #if defined(OS_WIN)
     19 class BrowserAccessibilityManagerWin;
     20 #endif
     21 
     22 struct ViewHostMsg_AccessibilityNotification_Params;
     23 
     24 using webkit_glue::WebAccessibility;
     25 
     26 // Class that can perform actions on behalf of the BrowserAccessibilityManager.
     27 class BrowserAccessibilityDelegate {
     28  public:
     29   virtual ~BrowserAccessibilityDelegate() {}
     30   virtual void SetAccessibilityFocus(int acc_obj_id) = 0;
     31   virtual void AccessibilityDoDefaultAction(int acc_obj_id) = 0;
     32   virtual bool HasFocus() = 0;
     33   virtual gfx::Rect GetViewBounds() const = 0;
     34 };
     35 
     36 class BrowserAccessibilityFactory {
     37  public:
     38   virtual ~BrowserAccessibilityFactory() {}
     39 
     40   // Create an instance of BrowserAccessibility and return a new
     41   // reference to it.
     42   virtual BrowserAccessibility* Create();
     43 };
     44 
     45 // Manages a tree of BrowserAccessibility objects.
     46 class BrowserAccessibilityManager {
     47  public:
     48   // Creates the platform specific BrowserAccessibilityManager. Ownership passes
     49   // to the caller.
     50   static BrowserAccessibilityManager* Create(
     51     gfx::NativeView parent_view,
     52     const WebAccessibility& src,
     53     BrowserAccessibilityDelegate* delegate,
     54     BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory());
     55 
     56   virtual ~BrowserAccessibilityManager();
     57 
     58   // Type is a ViewHostMsg_AccessibilityNotification_Params::NotificationType.
     59   // We pass it as int so that we don't include the render message declaration
     60   // header here.
     61   virtual void NotifyAccessibilityEvent(
     62       int type,
     63       BrowserAccessibility* node) { }
     64 
     65   // Returns the next unique child id.
     66   static int32 GetNextChildID();
     67 
     68   // Return a pointer to the root of the tree, does not make a new reference.
     69   BrowserAccessibility* GetRoot();
     70 
     71   // Removes the BrowserAccessibility child_id and renderer_id from the manager.
     72   void Remove(int32 child_id, int32 renderer_id);
     73 
     74   // Return a pointer to the object corresponding to the given child_id,
     75   // does not make a new reference.
     76   BrowserAccessibility* GetFromChildID(int32 child_id);
     77 
     78   // Called to notify the accessibility manager that its associated native
     79   // view got focused.
     80   void GotFocus();
     81 
     82   // Update the focused node to |node|, which may be null.
     83   // If |notify| is true, send a message to the renderer to set focus
     84   // to this node.
     85   void SetFocus(BrowserAccessibility* node, bool notify);
     86 
     87   // Tell the renderer to do the default action for this node.
     88   void DoDefaultAction(const BrowserAccessibility& node);
     89 
     90   // Retrieve the bounds of the parent View in screen coordinates.
     91   gfx::Rect GetViewBounds();
     92 
     93   // Called when the renderer process has notified us of about tree changes.
     94   // Send a notification to MSAA clients of the change.
     95   void OnAccessibilityNotifications(
     96       const std::vector<ViewHostMsg_AccessibilityNotification_Params>& params);
     97 
     98   gfx::NativeView GetParentView();
     99 
    100 #if defined(OS_WIN)
    101   BrowserAccessibilityManagerWin* toBrowserAccessibilityManagerWin();
    102 #endif
    103 
    104   // Return the object that has focus, if it's a descandant of the
    105   // given root (inclusive). Does not make a new reference.
    106   BrowserAccessibility* GetFocus(BrowserAccessibility* root);
    107 
    108  protected:
    109   BrowserAccessibilityManager(
    110       gfx::NativeView parent_view,
    111       const WebAccessibility& src,
    112       BrowserAccessibilityDelegate* delegate,
    113       BrowserAccessibilityFactory* factory);
    114 
    115  private:
    116   void OnAccessibilityObjectStateChange(
    117       const WebAccessibility& acc_obj);
    118   void OnAccessibilityObjectChildrenChange(
    119       const WebAccessibility& acc_obj);
    120   void OnAccessibilityObjectFocusChange(
    121       const WebAccessibility& acc_obj);
    122   void OnAccessibilityObjectLoadComplete(
    123       const WebAccessibility& acc_obj);
    124   void OnAccessibilityObjectValueChange(
    125       const WebAccessibility& acc_obj);
    126   void OnAccessibilityObjectTextChange(
    127       const WebAccessibility& acc_obj);
    128 
    129   // Update an accessibility node with an updated WebAccessibility node
    130   // received from the renderer process. When |include_children| is true
    131   // the node's children will also be updated, otherwise only the node
    132   // itself is updated. Returns the updated node or NULL if no node was
    133   // updated.
    134   BrowserAccessibility* UpdateNode(
    135       const WebAccessibility& src,
    136       bool include_children);
    137 
    138   // Recursively build a tree of BrowserAccessibility objects from
    139   // the WebAccessibility tree received from the renderer process.
    140   BrowserAccessibility* CreateAccessibilityTree(
    141       BrowserAccessibility* parent,
    142       const WebAccessibility& src,
    143       int index_in_parent);
    144 
    145  protected:
    146   // The next unique id for a BrowserAccessibility instance.
    147   static int32 next_child_id_;
    148 
    149   // The parent view.
    150   gfx::NativeView parent_view_;
    151 
    152   // The object that can perform actions on our behalf.
    153   BrowserAccessibilityDelegate* delegate_;
    154 
    155   // Factory to create BrowserAccessibility objects (for dependency injection).
    156   scoped_ptr<BrowserAccessibilityFactory> factory_;
    157 
    158   // The root of the tree of IAccessible objects and the element that
    159   // currently has focus, if any.
    160   BrowserAccessibility* root_;
    161   BrowserAccessibility* focus_;
    162 
    163   // A mapping from the IDs of objects in the renderer, to the child IDs
    164   // we use internally here.
    165   base::hash_map<int32, int32> renderer_id_to_child_id_map_;
    166 
    167   // A mapping from child IDs to BrowserAccessibility objects.
    168   base::hash_map<int32, BrowserAccessibility*> child_id_map_;
    169 
    170   DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityManager);
    171 };
    172 
    173 #endif  // CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
    174