// Copyright (c) 2011 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_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
#define CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_
#pragma once
#include <vector>
#include "base/hash_tables.h"
#include "base/memory/scoped_ptr.h"
#include "build/build_config.h"
#include "ui/gfx/native_widget_types.h"
#include "webkit/glue/webaccessibility.h"
class BrowserAccessibility;
#if defined(OS_WIN)
class BrowserAccessibilityManagerWin;
#endif
struct ViewHostMsg_AccessibilityNotification_Params;
using webkit_glue::WebAccessibility;
// 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;
virtual bool HasFocus() = 0;
virtual gfx::Rect GetViewBounds() const = 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::NativeView parent_view,
const WebAccessibility& src,
BrowserAccessibilityDelegate* delegate,
BrowserAccessibilityFactory* factory = new BrowserAccessibilityFactory());
virtual ~BrowserAccessibilityManager();
// Type is a ViewHostMsg_AccessibilityNotification_Params::NotificationType.
// We pass it as int so that we don't include the render message declaration
// header here.
virtual void NotifyAccessibilityEvent(
int type,
BrowserAccessibility* node) { }
// 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 and renderer_id from the manager.
void Remove(int32 child_id, int32 renderer_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
// view got focused.
void GotFocus();
// Update the focused node to |node|, which may be null.
// If |notify| is true, send a message to the renderer to set focus
// to this node.
void SetFocus(BrowserAccessibility* node, bool notify);
// Tell the renderer to do the default action for this node.
void DoDefaultAction(const BrowserAccessibility& node);
// Retrieve the bounds of the parent View in screen coordinates.
gfx::Rect GetViewBounds();
// 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::NativeView GetParentView();
#if defined(OS_WIN)
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:
BrowserAccessibilityManager(
gfx::NativeView parent_view,
const WebAccessibility& src,
BrowserAccessibilityDelegate* delegate,
BrowserAccessibilityFactory* factory);
private:
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);
// Update an accessibility node with an updated WebAccessibility node
// received from the renderer process. When |include_children| is true
// the node's children will also be updated, otherwise only the node
// itself is updated. Returns the updated node or NULL if no node was
// updated.
BrowserAccessibility* UpdateNode(
const WebAccessibility& src,
bool include_children);
// Recursively build a tree of BrowserAccessibility objects from
// the WebAccessibility tree received from the renderer process.
BrowserAccessibility* CreateAccessibilityTree(
BrowserAccessibility* parent,
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<int32, 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);
};
#endif // CHROME_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_MANAGER_H_