summaryrefslogtreecommitdiffstats
path: root/chrome/browser/browser_accessibility_win.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/browser_accessibility_win.h')
-rw-r--r--chrome/browser/browser_accessibility_win.h399
1 files changed, 399 insertions, 0 deletions
diff --git a/chrome/browser/browser_accessibility_win.h b/chrome/browser/browser_accessibility_win.h
new file mode 100644
index 0000000..08edb2b
--- /dev/null
+++ b/chrome/browser/browser_accessibility_win.h
@@ -0,0 +1,399 @@
+// 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_WIN_H_
+#define CHROME_BROWSER_BROWSER_ACCESSIBILITY_WIN_H_
+
+#include <atlbase.h>
+#include <atlcom.h>
+#include <oleacc.h>
+
+#include <vector>
+
+#include "base/scoped_comptr_win.h"
+#include "chrome/browser/browser_accessibility_manager_win.h"
+#include "ia2_api_all.h" // Generated
+#include "webkit/glue/webaccessibility.h"
+
+using webkit_glue::WebAccessibility;
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// BrowserAccessibility
+//
+// Class implementing the MSAA IAccessible COM interface for the
+// Browser-Renderer communication of MSAA information, providing accessibility
+// to be used by screen readers and other assistive technology (AT).
+//
+////////////////////////////////////////////////////////////////////////////////
+class ATL_NO_VTABLE BrowserAccessibility
+ : public CComObjectRootEx<CComMultiThreadModel>,
+ public IDispatchImpl<IAccessible2, &IID_IAccessible2,
+ &LIBID_IAccessible2Lib>,
+ public IAccessibleImage,
+ public IAccessibleText,
+ public IServiceProvider {
+ public:
+ BEGIN_COM_MAP(BrowserAccessibility)
+ COM_INTERFACE_ENTRY2(IDispatch, IAccessible2)
+ COM_INTERFACE_ENTRY2(IAccessible, IAccessible2)
+ COM_INTERFACE_ENTRY(IAccessible2)
+ COM_INTERFACE_ENTRY(IAccessibleImage)
+ COM_INTERFACE_ENTRY(IAccessibleText)
+ COM_INTERFACE_ENTRY(IServiceProvider)
+ END_COM_MAP()
+
+ BrowserAccessibility();
+
+ virtual ~BrowserAccessibility();
+
+ // Initialize this object and mark it as active.
+ void Initialize(BrowserAccessibilityManager* manager,
+ BrowserAccessibility* parent,
+ LONG child_id,
+ LONG index_in_parent,
+ const webkit_glue::WebAccessibility& src);
+
+ // Add a child of this object.
+ void AddChild(BrowserAccessibility* child);
+
+ // Mark this object as inactive, and remove references to all children.
+ // When no other clients hold any references to this object it will be
+ // deleted, and in the meantime, calls to any methods will return E_FAIL.
+ void InactivateTree();
+
+ // Return true if this object is equal to or a descendant of |ancestor|.
+ bool IsDescendantOf(BrowserAccessibility* ancestor);
+
+ // Return the previous sibling of this object, or NULL if it's the first
+ // child of its parent.
+ BrowserAccessibility* GetPreviousSibling();
+
+ // Return the next sibling of this object, or NULL if it's the last child
+ // of its parent.
+ BrowserAccessibility* GetNextSibling();
+
+ // Accessors
+ LONG child_id() const { return child_id_; }
+ int32 renderer_id() const { return renderer_id_; }
+
+ // Add one to the reference count and return the same object. Always
+ // use this method when returning a BrowserAccessibility object as
+ // an output parameter to a COM interface, never use it otherwise.
+ BrowserAccessibility* NewReference();
+
+ //
+ // IAccessible methods.
+ //
+
+ // Performs the default action on a given object.
+ STDMETHODIMP accDoDefaultAction(VARIANT var_id);
+
+ // Retrieves the child element or child object at a given point on the screen.
+ STDMETHODIMP accHitTest(LONG x_left, LONG y_top, VARIANT* child);
+
+ // Retrieves the specified object's current screen location.
+ STDMETHODIMP accLocation(LONG* x_left,
+ LONG* y_top,
+ LONG* width,
+ LONG* height,
+ VARIANT var_id);
+
+ // Traverses to another UI element and retrieves the object.
+ STDMETHODIMP accNavigate(LONG nav_dir, VARIANT start, VARIANT* end);
+
+ // Retrieves an IDispatch interface pointer for the specified child.
+ STDMETHODIMP get_accChild(VARIANT var_child, IDispatch** disp_child);
+
+ // Retrieves the number of accessible children.
+ STDMETHODIMP get_accChildCount(LONG* child_count);
+
+ // Retrieves a string that describes the object's default action.
+ STDMETHODIMP get_accDefaultAction(VARIANT var_id, BSTR* default_action);
+
+ // Retrieves the object's description.
+ STDMETHODIMP get_accDescription(VARIANT var_id, BSTR* desc);
+
+ // Retrieves the object that has the keyboard focus.
+ STDMETHODIMP get_accFocus(VARIANT* focus_child);
+
+ // Retrieves the help information associated with the object.
+ STDMETHODIMP get_accHelp(VARIANT var_id, BSTR* help);
+
+ // Retrieves the specified object's shortcut.
+ STDMETHODIMP get_accKeyboardShortcut(VARIANT var_id, BSTR* access_key);
+
+ // Retrieves the name of the specified object.
+ STDMETHODIMP get_accName(VARIANT var_id, BSTR* name);
+
+ // Retrieves the IDispatch interface of the object's parent.
+ STDMETHODIMP get_accParent(IDispatch** disp_parent);
+
+ // Retrieves information describing the role of the specified object.
+ STDMETHODIMP get_accRole(VARIANT var_id, VARIANT* role);
+
+ // Retrieves the current state of the specified object.
+ STDMETHODIMP get_accState(VARIANT var_id, VARIANT* state);
+
+ // Returns the value associated with the object.
+ STDMETHODIMP get_accValue(VARIANT var_id, BSTR* value);
+
+ // Make an object take focus or extend the selection.
+ STDMETHODIMP accSelect(LONG flags_sel, VARIANT var_id);
+
+ STDMETHODIMP get_accHelpTopic(BSTR* help_file,
+ VARIANT var_id,
+ LONG* topic_id);
+
+ STDMETHODIMP get_accSelection(VARIANT* selected);
+
+ // Deprecated methods, not implemented.
+ STDMETHODIMP put_accName(VARIANT var_id, BSTR put_name) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP put_accValue(VARIANT var_id, BSTR put_val) {
+ return E_NOTIMPL;
+ }
+
+ //
+ // IAccessible2 methods.
+ //
+
+ // Returns role from a longer list of possible roles.
+ STDMETHODIMP role(LONG* role);
+
+ // Returns the state bitmask from a larger set of possible states.
+ STDMETHODIMP get_states(AccessibleStates* states);
+
+ // Returns the attributes specific to this IAccessible2 object,
+ // such as a cell's formula.
+ STDMETHODIMP get_attributes(BSTR* attributes);
+
+ // Get the unique ID of this object so that the client knows if it's
+ // been encountered previously.
+ STDMETHODIMP get_uniqueID(LONG* unique_id);
+
+ // Get the window handle of the enclosing window.
+ STDMETHODIMP get_windowHandle(HWND* window_handle);
+
+ // Get this object's index in its parent object.
+ STDMETHODIMP get_indexInParent(LONG* index_in_parent);
+
+ // IAccessible2 methods not implemented.
+ STDMETHODIMP get_extendedRole(BSTR* extended_role) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_nRelations(LONG* n_relations) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_relation(LONG relation_index,
+ IAccessibleRelation** relation) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_relations(LONG max_relations,
+ IAccessibleRelation** relations,
+ LONG* n_relations) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP scrollTo(enum IA2ScrollType scroll_type) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP scrollToPoint(enum IA2CoordinateType coordinate_type,
+ LONG x,
+ LONG y) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_groupPosition(LONG* group_level,
+ LONG* similar_items_in_group,
+ LONG* position_in_group) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_localizedExtendedRole(BSTR* localized_extended_role) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_nExtendedStates(LONG* n_extended_states) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_extendedStates(LONG max_extended_states,
+ BSTR** extended_states,
+ LONG* n_extended_states) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_localizedExtendedStates(LONG max_localized_extended_states,
+ BSTR** localized_extended_states,
+ LONG* n_localized_extended_states) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_locale(IA2Locale* locale) {
+ return E_NOTIMPL;
+ }
+
+ //
+ // IAccessibleImage methods.
+ //
+
+ STDMETHODIMP get_description(BSTR* description);
+
+ STDMETHODIMP get_imagePosition(enum IA2CoordinateType coordinate_type,
+ long* x, long* y);
+
+ STDMETHODIMP get_imageSize(long* height, long* width);
+
+ //
+ // IAccessibleText methods.
+ //
+
+ STDMETHODIMP get_nCharacters(long* n_characters);
+
+ STDMETHODIMP get_text(long start_offset, long end_offset, BSTR* text);
+
+ STDMETHODIMP get_caretOffset(long* offset);
+
+ // IAccessibleText methods not implemented.
+ STDMETHODIMP addSelection(long start_offset, long end_offset) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_attributes(long offset, long* start_offset, long* end_offset,
+ BSTR* text_attributes) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_characterExtents(long offset,
+ enum IA2CoordinateType coord_type,
+ long* x, long* y,
+ long* width, long* height) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_nSelections(long* n_selections) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_offsetAtPoint(long x, long y,
+ enum IA2CoordinateType coord_type,
+ long* offset) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_selection(long selection_index,
+ long* start_offset,
+ long* end_offset) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_textBeforeOffset(long offset,
+ enum IA2TextBoundaryType boundary_type,
+ long* start_offset, long* end_offset,
+ BSTR* text) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_textAfterOffset(long offset,
+ enum IA2TextBoundaryType boundary_type,
+ long* start_offset, long* end_offset,
+ BSTR* text) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_textAtOffset(long offset,
+ enum IA2TextBoundaryType boundary_type,
+ long* start_offset, long* end_offset,
+ BSTR* text) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP removeSelection(long selection_index) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP setCaretOffset(long offset) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP setSelection(long selection_index,
+ long start_offset,
+ long end_offset) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP scrollSubstringTo(long start_index,
+ long end_index,
+ enum IA2ScrollType scroll_type) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP scrollSubstringToPoint(long start_index, long end_index,
+ enum IA2CoordinateType coordinate_type,
+ long x, long y) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_newText(IA2TextSegment* new_text) {
+ return E_NOTIMPL;
+ }
+ STDMETHODIMP get_oldText(IA2TextSegment* old_text) {
+ return E_NOTIMPL;
+ }
+
+ //
+ // IServiceProvider methods.
+ //
+
+ STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void** object);
+
+ //
+ // CComObjectRootEx methods.
+ //
+
+ HRESULT WINAPI InternalQueryInterface(void* this_ptr,
+ const _ATL_INTMAP_ENTRY* entries,
+ REFIID iid,
+ void** object);
+
+ private:
+ // Many MSAA methods take a var_id parameter indicating that the operation
+ // should be performed on a particular child ID, rather than this object.
+ // This method tries to figure out the target object from |var_id| and
+ // returns a pointer to the target object if it exists, otherwise NULL.
+ // Does not return a new reference.
+ BrowserAccessibility* GetTargetFromChildID(const VARIANT& var_id);
+
+ // Initialize the role and state metadata from the role enum and state
+ // bitmasks defined in webkit/glue/webaccessibility.h.
+ void InitRoleAndState(LONG web_accessibility_role,
+ LONG web_accessibility_state);
+
+ // Return true if this attribute is in the attributes map.
+ bool HasAttribute(WebAccessibility::Attribute attribute);
+
+ // Retrieve the string value of an attribute from the attribute map and
+ // returns true if found.
+ bool GetAttribute(WebAccessibility::Attribute attribute, string16* value);
+
+ // The manager of this tree of accessibility objects; needed for
+ // global operations like focus tracking.
+ BrowserAccessibilityManager* manager_;
+ // The parent of this object, may be NULL if we're the root object.
+ BrowserAccessibility* parent_;
+ // The ID of this object; globally unique within the browser process.
+ LONG child_id_;
+ // The index of this within its parent object.
+ LONG index_in_parent_;
+ // The ID of this object in the renderer process.
+ int32 renderer_id_;
+
+ // The children of this object.
+ std::vector<BrowserAccessibility*> children_;
+
+ // Accessibility metadata from the renderer, used to respond to MSAA
+ // events.
+ string16 name_;
+ string16 value_;
+ std::map<int32, string16> attributes_;
+
+ LONG role_;
+ LONG state_;
+ string16 role_name_;
+ LONG ia2_role_;
+ LONG ia2_state_;
+ WebKit::WebRect location_;
+
+ // COM objects are reference-counted. When we're done with this object
+ // and it's removed from our accessibility tree, a client may still be
+ // holding onto a pointer to this object, so we mark it as inactive
+ // so that calls to any of this object's methods immediately return
+ // failure.
+ bool instance_active_;
+
+ DISALLOW_COPY_AND_ASSIGN(BrowserAccessibility);
+};
+
+#endif // CHROME_BROWSER_BROWSER_ACCESSIBILITY_WIN_H_