// Copyright (c) 2012 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 CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_WIN_H_
#define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_WIN_H_
#include <atlbase.h>
#include <atlcom.h>
#include <oleacc.h>
#include <UIAutomationCore.h>
#include <vector>
#include "base/compiler_specific.h"
#include "content/browser/accessibility/browser_accessibility.h"
#include "content/common/content_export.h"
#include "third_party/iaccessible2/ia2_api_all.h"
#include "third_party/isimpledom/ISimpleDOMDocument.h"
#include "third_party/isimpledom/ISimpleDOMNode.h"
#include "third_party/isimpledom/ISimpleDOMText.h"
namespace ui {
enum TextBoundaryDirection;
enum TextBoundaryType;
}
namespace content {
class BrowserAccessibilityRelation;
////////////////////////////////////////////////////////////////////////////////
//
// BrowserAccessibilityWin
//
// Class implementing the windows accessible interface for the Browser-Renderer
// communication of accessibility information, providing accessibility
// to be used by screen readers and other assistive technology (AT).
//
////////////////////////////////////////////////////////////////////////////////
class __declspec(uuid("562072fe-3390-43b1-9e2c-dd4118f5ac79"))
BrowserAccessibilityWin
: public BrowserAccessibility,
public CComObjectRootEx<CComMultiThreadModel>,
public IDispatchImpl<IAccessible2, &IID_IAccessible2,
&LIBID_IAccessible2Lib>,
public IAccessibleApplication,
public IAccessibleHyperlink,
public IAccessibleHypertext,
public IAccessibleImage,
public IAccessibleTable,
public IAccessibleTable2,
public IAccessibleTableCell,
public IAccessibleValue,
public IServiceProvider,
public ISimpleDOMDocument,
public ISimpleDOMNode,
public ISimpleDOMText,
public IAccessibleEx,
public IRawElementProviderSimple {
public:
BEGIN_COM_MAP(BrowserAccessibilityWin)
COM_INTERFACE_ENTRY2(IDispatch, IAccessible2)
COM_INTERFACE_ENTRY(IAccessible)
COM_INTERFACE_ENTRY(IAccessible2)
COM_INTERFACE_ENTRY(IAccessibleApplication)
COM_INTERFACE_ENTRY(IAccessibleEx)
COM_INTERFACE_ENTRY(IAccessibleHyperlink)
COM_INTERFACE_ENTRY(IAccessibleHypertext)
COM_INTERFACE_ENTRY(IAccessibleImage)
COM_INTERFACE_ENTRY(IAccessibleTable)
COM_INTERFACE_ENTRY(IAccessibleTable2)
COM_INTERFACE_ENTRY(IAccessibleTableCell)
COM_INTERFACE_ENTRY(IAccessibleText)
COM_INTERFACE_ENTRY(IAccessibleValue)
COM_INTERFACE_ENTRY(IRawElementProviderSimple)
COM_INTERFACE_ENTRY(IServiceProvider)
COM_INTERFACE_ENTRY(ISimpleDOMDocument)
COM_INTERFACE_ENTRY(ISimpleDOMNode)
COM_INTERFACE_ENTRY(ISimpleDOMText)
END_COM_MAP()
// Represents a non-static text node in IAccessibleHypertext. This character
// is embedded in the response to IAccessibleText::get_text, indicating the
// position where a non-static text child object appears.
CONTENT_EXPORT static const base::char16 kEmbeddedCharacter[];
// Mappings from roles and states to human readable strings. Initialize
// with |InitializeStringMaps|.
static std::map<int32, base::string16> role_string_map;
static std::map<int32, base::string16> state_string_map;
CONTENT_EXPORT BrowserAccessibilityWin();
CONTENT_EXPORT virtual ~BrowserAccessibilityWin();
// The Windows-specific unique ID, used as the child ID for MSAA methods
// like NotifyWinEvent, and as the unique ID for IAccessible2 and ISimpleDOM.
LONG unique_id_win() const { return unique_id_win_; }
//
// BrowserAccessibility methods.
//
CONTENT_EXPORT virtual void OnDataChanged() OVERRIDE;
CONTENT_EXPORT virtual void OnUpdateFinished() OVERRIDE;
CONTENT_EXPORT virtual void NativeAddReference() OVERRIDE;
CONTENT_EXPORT virtual void NativeReleaseReference() OVERRIDE;
CONTENT_EXPORT virtual bool IsNative() const OVERRIDE;
CONTENT_EXPORT virtual void OnLocationChanged() const OVERRIDE;
//
// IAccessible methods.
//
// Performs the default action on a given object.
CONTENT_EXPORT STDMETHODIMP accDoDefaultAction(VARIANT var_id);
// Retrieves the child element or child object at a given point on the screen.
CONTENT_EXPORT STDMETHODIMP accHitTest(LONG x_left, LONG y_top,
VARIANT* child);
// Retrieves the specified object's current screen location.
CONTENT_EXPORT STDMETHODIMP accLocation(LONG* x_left,
LONG* y_top,
LONG* width,
LONG* height,
VARIANT var_id);
// Traverses to another UI element and retrieves the object.
CONTENT_EXPORT STDMETHODIMP accNavigate(LONG nav_dir, VARIANT start,
VARIANT* end);
// Retrieves an IDispatch interface pointer for the specified child.
CONTENT_EXPORT STDMETHODIMP get_accChild(VARIANT var_child,
IDispatch** disp_child);
// Retrieves the number of accessible children.
CONTENT_EXPORT STDMETHODIMP get_accChildCount(LONG* child_count);
// Retrieves a string that describes the object's default action.
CONTENT_EXPORT STDMETHODIMP get_accDefaultAction(VARIANT var_id,
BSTR* default_action);
// Retrieves the object's description.
CONTENT_EXPORT STDMETHODIMP get_accDescription(VARIANT var_id, BSTR* desc);
// Retrieves the object that has the keyboard focus.
CONTENT_EXPORT STDMETHODIMP get_accFocus(VARIANT* focus_child);
// Retrieves the help information associated with the object.
CONTENT_EXPORT STDMETHODIMP get_accHelp(VARIANT var_id, BSTR* heflp);
// Retrieves the specified object's shortcut.
CONTENT_EXPORT STDMETHODIMP get_accKeyboardShortcut(VARIANT var_id,
BSTR* access_key);
// Retrieves the name of the specified object.
CONTENT_EXPORT STDMETHODIMP get_accName(VARIANT var_id, BSTR* name);
// Retrieves the IDispatch interface of the object's parent.
CONTENT_EXPORT STDMETHODIMP get_accParent(IDispatch** disp_parent);
// Retrieves information describing the role of the specified object.
CONTENT_EXPORT STDMETHODIMP get_accRole(VARIANT var_id, VARIANT* role);
// Retrieves the current state of the specified object.
CONTENT_EXPORT STDMETHODIMP get_accState(VARIANT var_id, VARIANT* state);
// Returns the value associated with the object.
CONTENT_EXPORT STDMETHODIMP get_accValue(VARIANT var_id, BSTR* value);
// Make an object take focus or extend the selection.
CONTENT_EXPORT STDMETHODIMP accSelect(LONG flags_sel, VARIANT var_id);
CONTENT_EXPORT STDMETHODIMP get_accHelpTopic(BSTR* help_file,
VARIANT var_id,
LONG* topic_id);
CONTENT_EXPORT STDMETHODIMP get_accSelection(VARIANT* selected);
// Deprecated methods, not implemented.
CONTENT_EXPORT STDMETHODIMP put_accName(VARIANT var_id, BSTR put_name) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP put_accValue(VARIANT var_id, BSTR put_val) {
return E_NOTIMPL;
}
//
// IAccessible2 methods.
//
// Returns role from a longer list of possible roles.
CONTENT_EXPORT STDMETHODIMP role(LONG* role);
// Returns the state bitmask from a larger set of possible states.
CONTENT_EXPORT STDMETHODIMP get_states(AccessibleStates* states);
// Returns the attributes specific to this IAccessible2 object,
// such as a cell's formula.
CONTENT_EXPORT STDMETHODIMP get_attributes(BSTR* attributes);
// Get the unique ID of this object so that the client knows if it's
// been encountered previously.
CONTENT_EXPORT STDMETHODIMP get_uniqueID(LONG* unique_id);
// Get the window handle of the enclosing window.
CONTENT_EXPORT STDMETHODIMP get_windowHandle(HWND* window_handle);
// Get this object's index in its parent object.
CONTENT_EXPORT STDMETHODIMP get_indexInParent(LONG* index_in_parent);
CONTENT_EXPORT STDMETHODIMP get_nRelations(LONG* n_relations);
CONTENT_EXPORT STDMETHODIMP get_relation(LONG relation_index,
IAccessibleRelation** relation);
CONTENT_EXPORT STDMETHODIMP get_relations(LONG max_relations,
IAccessibleRelation** relations,
LONG* n_relations);
CONTENT_EXPORT STDMETHODIMP scrollTo(enum IA2ScrollType scroll_type);
CONTENT_EXPORT STDMETHODIMP scrollToPoint(
enum IA2CoordinateType coordinate_type,
LONG x,
LONG y);
CONTENT_EXPORT STDMETHODIMP get_groupPosition(LONG* group_level,
LONG* similar_items_in_group,
LONG* position_in_group);
//
// IAccessibleEx methods not implemented.
//
CONTENT_EXPORT STDMETHODIMP get_extendedRole(BSTR* extended_role) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_localizedExtendedRole(
BSTR* localized_extended_role) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_nExtendedStates(LONG* n_extended_states) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_extendedStates(LONG max_extended_states,
BSTR** extended_states,
LONG* n_extended_states) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_localizedExtendedStates(
LONG max_localized_extended_states,
BSTR** localized_extended_states,
LONG* n_localized_extended_states) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_locale(IA2Locale* locale) {
return E_NOTIMPL;
}
//
// IAccessibleApplication methods.
//
CONTENT_EXPORT STDMETHODIMP get_appName(BSTR* app_name);
CONTENT_EXPORT STDMETHODIMP get_appVersion(BSTR* app_version);
CONTENT_EXPORT STDMETHODIMP get_toolkitName(BSTR* toolkit_name);
CONTENT_EXPORT STDMETHODIMP get_toolkitVersion(BSTR* toolkit_version);
//
// IAccessibleImage methods.
//
CONTENT_EXPORT STDMETHODIMP get_description(BSTR* description);
CONTENT_EXPORT STDMETHODIMP get_imagePosition(
enum IA2CoordinateType coordinate_type,
LONG* x,
LONG* y);
CONTENT_EXPORT STDMETHODIMP get_imageSize(LONG* height, LONG* width);
//
// IAccessibleTable methods.
//
// get_description - also used by IAccessibleImage
CONTENT_EXPORT STDMETHODIMP get_accessibleAt(long row,
long column,
IUnknown** accessible);
CONTENT_EXPORT STDMETHODIMP get_caption(IUnknown** accessible);
CONTENT_EXPORT STDMETHODIMP get_childIndex(long row_index,
long column_index,
long* cell_index);
CONTENT_EXPORT STDMETHODIMP get_columnDescription(long column,
BSTR* description);
CONTENT_EXPORT STDMETHODIMP get_columnExtentAt(long row,
long column,
long* n_columns_spanned);
CONTENT_EXPORT STDMETHODIMP get_columnHeader(
IAccessibleTable** accessible_table,
long* starting_row_index);
CONTENT_EXPORT STDMETHODIMP get_columnIndex(long cell_index,
long* column_index);
CONTENT_EXPORT STDMETHODIMP get_nColumns(long* column_count);
CONTENT_EXPORT STDMETHODIMP get_nRows(long* row_count);
CONTENT_EXPORT STDMETHODIMP get_nSelectedChildren(long* cell_count);
CONTENT_EXPORT STDMETHODIMP get_nSelectedColumns(long* column_count);
CONTENT_EXPORT STDMETHODIMP get_nSelectedRows(long *row_count);
CONTENT_EXPORT STDMETHODIMP get_rowDescription(long row,
BSTR* description);
CONTENT_EXPORT STDMETHODIMP get_rowExtentAt(long row,
long column,
long* n_rows_spanned);
CONTENT_EXPORT STDMETHODIMP get_rowHeader(IAccessibleTable** accessible_table,
long* starting_column_index);
CONTENT_EXPORT STDMETHODIMP get_rowIndex(long cell_index,
long* row_index);
CONTENT_EXPORT STDMETHODIMP get_selectedChildren(long max_children,
long** children,
long* n_children);
CONTENT_EXPORT STDMETHODIMP get_selectedColumns(long max_columns,
long** columns,
long* n_columns);
CONTENT_EXPORT STDMETHODIMP get_selectedRows(long max_rows,
long** rows,
long* n_rows);
CONTENT_EXPORT STDMETHODIMP get_summary(IUnknown** accessible);
CONTENT_EXPORT STDMETHODIMP get_isColumnSelected(long column,
boolean* is_selected);
CONTENT_EXPORT STDMETHODIMP get_isRowSelected(long row,
boolean* is_selected);
CONTENT_EXPORT STDMETHODIMP get_isSelected(long row,
long column,
boolean* is_selected);
CONTENT_EXPORT STDMETHODIMP get_rowColumnExtentsAtIndex(long index,
long* row,
long* column,
long* row_extents,
long* column_extents,
boolean* is_selected);
CONTENT_EXPORT STDMETHODIMP selectRow(long row) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP selectColumn(long column) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP unselectRow(long row) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP unselectColumn(long column) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_modelChange(
IA2TableModelChange* model_change) {
return E_NOTIMPL;
}
//
// IAccessibleTable2 methods.
//
// (Most of these are duplicates of IAccessibleTable methods, only the
// unique ones are included here.)
//
CONTENT_EXPORT STDMETHODIMP get_cellAt(long row,
long column,
IUnknown** cell);
CONTENT_EXPORT STDMETHODIMP get_nSelectedCells(long* cell_count);
CONTENT_EXPORT STDMETHODIMP get_selectedCells(IUnknown*** cells,
long* n_selected_cells);
CONTENT_EXPORT STDMETHODIMP get_selectedColumns(long** columns,
long* n_columns);
CONTENT_EXPORT STDMETHODIMP get_selectedRows(long** rows,
long* n_rows);
//
// IAccessibleTableCell methods.
//
CONTENT_EXPORT STDMETHODIMP get_columnExtent(long* n_columns_spanned);
CONTENT_EXPORT STDMETHODIMP get_columnHeaderCells(
IUnknown*** cell_accessibles,
long* n_column_header_cells);
CONTENT_EXPORT STDMETHODIMP get_columnIndex(long* column_index);
CONTENT_EXPORT STDMETHODIMP get_rowExtent(long* n_rows_spanned);
CONTENT_EXPORT STDMETHODIMP get_rowHeaderCells(IUnknown*** cell_accessibles,
long* n_row_header_cells);
CONTENT_EXPORT STDMETHODIMP get_rowIndex(long* row_index);
CONTENT_EXPORT STDMETHODIMP get_isSelected(boolean* is_selected);
CONTENT_EXPORT STDMETHODIMP get_rowColumnExtents(long* row,
long* column,
long* row_extents,
long* column_extents,
boolean* is_selected);
CONTENT_EXPORT STDMETHODIMP get_table(IUnknown** table);
//
// IAccessibleText methods.
//
CONTENT_EXPORT STDMETHODIMP get_nCharacters(LONG* n_characters);
CONTENT_EXPORT STDMETHODIMP get_caretOffset(LONG* offset);
CONTENT_EXPORT STDMETHODIMP get_characterExtents(
LONG offset,
enum IA2CoordinateType coord_type,
LONG* out_x,
LONG* out_y,
LONG* out_width,
LONG* out_height);
CONTENT_EXPORT STDMETHODIMP get_nSelections(LONG* n_selections);
CONTENT_EXPORT STDMETHODIMP get_selection(LONG selection_index,
LONG* start_offset,
LONG* end_offset);
CONTENT_EXPORT STDMETHODIMP get_text(LONG start_offset,
LONG end_offset,
BSTR* text);
CONTENT_EXPORT STDMETHODIMP get_textAtOffset(
LONG offset,
enum IA2TextBoundaryType boundary_type,
LONG* start_offset,
LONG* end_offset,
BSTR* text);
CONTENT_EXPORT STDMETHODIMP get_textBeforeOffset(
LONG offset,
enum IA2TextBoundaryType boundary_type,
LONG* start_offset,
LONG* end_offset,
BSTR* text);
CONTENT_EXPORT STDMETHODIMP get_textAfterOffset(
LONG offset,
enum IA2TextBoundaryType boundary_type,
LONG* start_offset,
LONG* end_offset,
BSTR* text);
CONTENT_EXPORT STDMETHODIMP get_newText(IA2TextSegment* new_text);
CONTENT_EXPORT STDMETHODIMP get_oldText(IA2TextSegment* old_text);
CONTENT_EXPORT STDMETHODIMP get_offsetAtPoint(
LONG x,
LONG y,
enum IA2CoordinateType coord_type,
LONG* offset);
CONTENT_EXPORT STDMETHODIMP scrollSubstringTo(
LONG start_index,
LONG end_index,
enum IA2ScrollType scroll_type);
CONTENT_EXPORT STDMETHODIMP scrollSubstringToPoint(
LONG start_index,
LONG end_index,
enum IA2CoordinateType coordinate_type,
LONG x, LONG y);
CONTENT_EXPORT STDMETHODIMP addSelection(LONG start_offset, LONG end_offset);
CONTENT_EXPORT STDMETHODIMP removeSelection(LONG selection_index);
CONTENT_EXPORT STDMETHODIMP setCaretOffset(LONG offset);
CONTENT_EXPORT STDMETHODIMP setSelection(LONG selection_index,
LONG start_offset,
LONG end_offset);
// IAccessibleText methods not implemented.
CONTENT_EXPORT STDMETHODIMP get_attributes(LONG offset, LONG* start_offset,
LONG* end_offset,
BSTR* text_attributes) {
return E_NOTIMPL;
}
//
// IAccessibleHypertext methods.
//
CONTENT_EXPORT STDMETHODIMP get_nHyperlinks(long* hyperlink_count);
CONTENT_EXPORT STDMETHODIMP get_hyperlink(long index,
IAccessibleHyperlink** hyperlink);
CONTENT_EXPORT STDMETHODIMP get_hyperlinkIndex(long char_index,
long* hyperlink_index);
// IAccessibleHyperlink not implemented.
CONTENT_EXPORT STDMETHODIMP get_anchor(long index, VARIANT* anchor) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_anchorTarget(long index,
VARIANT* anchor_target) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_startIndex( long* index) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_endIndex( long* index) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_valid(boolean* valid) {
return E_NOTIMPL;
}
// IAccessibleAction not implemented.
CONTENT_EXPORT STDMETHODIMP nActions(long* n_actions) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP doAction(long action_index) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_description(long action_index,
BSTR* description) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_keyBinding(long action_index,
long n_max_bindings,
BSTR** key_bindings,
long* n_bindings) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_name(long action_index, BSTR* name) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_localizedName(long action_index,
BSTR* localized_name) {
return E_NOTIMPL;
}
//
// IAccessibleValue methods.
//
CONTENT_EXPORT STDMETHODIMP get_currentValue(VARIANT* value);
CONTENT_EXPORT STDMETHODIMP get_minimumValue(VARIANT* value);
CONTENT_EXPORT STDMETHODIMP get_maximumValue(VARIANT* value);
CONTENT_EXPORT STDMETHODIMP setCurrentValue(VARIANT new_value);
//
// ISimpleDOMDocument methods.
//
CONTENT_EXPORT STDMETHODIMP get_URL(BSTR* url);
CONTENT_EXPORT STDMETHODIMP get_title(BSTR* title);
CONTENT_EXPORT STDMETHODIMP get_mimeType(BSTR* mime_type);
CONTENT_EXPORT STDMETHODIMP get_docType(BSTR* doc_type);
CONTENT_EXPORT STDMETHODIMP get_nameSpaceURIForID(short name_space_id,
BSTR* name_space_uri) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP put_alternateViewMediaTypes(
BSTR* comma_separated_media_types) {
return E_NOTIMPL;
}
//
// ISimpleDOMNode methods.
//
CONTENT_EXPORT STDMETHODIMP get_nodeInfo(BSTR* node_name,
short* name_space_id,
BSTR* node_value,
unsigned int* num_children,
unsigned int* unique_id,
unsigned short* node_type);
CONTENT_EXPORT STDMETHODIMP get_attributes(unsigned short max_attribs,
BSTR* attrib_names,
short* name_space_id,
BSTR* attrib_values,
unsigned short* num_attribs);
CONTENT_EXPORT STDMETHODIMP get_attributesForNames(
unsigned short num_attribs,
BSTR* attrib_names,
short* name_space_id,
BSTR* attrib_values);
CONTENT_EXPORT STDMETHODIMP get_computedStyle(
unsigned short max_style_properties,
boolean use_alternate_view,
BSTR *style_properties,
BSTR *style_values,
unsigned short *num_style_properties);
CONTENT_EXPORT STDMETHODIMP get_computedStyleForProperties(
unsigned short num_style_properties,
boolean use_alternate_view,
BSTR* style_properties,
BSTR* style_values);
CONTENT_EXPORT STDMETHODIMP scrollTo(boolean placeTopLeft);
CONTENT_EXPORT STDMETHODIMP get_parentNode(ISimpleDOMNode** node);
CONTENT_EXPORT STDMETHODIMP get_firstChild(ISimpleDOMNode** node);
CONTENT_EXPORT STDMETHODIMP get_lastChild(ISimpleDOMNode** node);
CONTENT_EXPORT STDMETHODIMP get_previousSibling(ISimpleDOMNode** node);
CONTENT_EXPORT STDMETHODIMP get_nextSibling(ISimpleDOMNode** node);
CONTENT_EXPORT STDMETHODIMP get_childAt(unsigned int child_index,
ISimpleDOMNode** node);
CONTENT_EXPORT STDMETHODIMP get_innerHTML(BSTR* innerHTML) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_localInterface(void** local_interface) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_language(BSTR* language) {
return E_NOTIMPL;
}
//
// ISimpleDOMText methods.
//
CONTENT_EXPORT STDMETHODIMP get_domText(BSTR* dom_text);
CONTENT_EXPORT STDMETHODIMP get_clippedSubstringBounds(
unsigned int start_index,
unsigned int end_index,
int* out_x,
int* out_y,
int* out_width,
int* out_height);
CONTENT_EXPORT STDMETHODIMP get_unclippedSubstringBounds(
unsigned int start_index,
unsigned int end_index,
int* out_x,
int* out_y,
int* out_width,
int* out_height);
CONTENT_EXPORT STDMETHODIMP scrollToSubstring(unsigned int start_index,
unsigned int end_index);
CONTENT_EXPORT STDMETHODIMP get_fontFamily(BSTR *font_family) {
return E_NOTIMPL;
}
//
// IServiceProvider methods.
//
CONTENT_EXPORT STDMETHODIMP QueryService(REFGUID guidService,
REFIID riid,
void** object);
// IAccessibleEx methods not implemented.
CONTENT_EXPORT STDMETHODIMP GetObjectForChild(long child_id,
IAccessibleEx** ret) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP GetIAccessiblePair(IAccessible** acc,
long* child_id) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP GetRuntimeId(SAFEARRAY** runtime_id) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP ConvertReturnedElement(
IRawElementProviderSimple* element,
IAccessibleEx** acc) {
return E_NOTIMPL;
}
//
// IRawElementProviderSimple methods.
//
// The GetPatternProvider/GetPropertyValue methods need to be implemented for
// the on-screen keyboard to show up in Windows 8 metro.
CONTENT_EXPORT STDMETHODIMP GetPatternProvider(PATTERNID id,
IUnknown** provider);
CONTENT_EXPORT STDMETHODIMP GetPropertyValue(PROPERTYID id, VARIANT* ret);
//
// IRawElementProviderSimple methods not implemented
//
CONTENT_EXPORT STDMETHODIMP get_ProviderOptions(enum ProviderOptions* ret) {
return E_NOTIMPL;
}
CONTENT_EXPORT STDMETHODIMP get_HostRawElementProvider(
IRawElementProviderSimple** provider) {
return E_NOTIMPL;
}
//
// CComObjectRootEx methods.
//
CONTENT_EXPORT HRESULT WINAPI InternalQueryInterface(
void* this_ptr,
const _ATL_INTMAP_ENTRY* entries,
REFIID iid,
void** object);
// Accessors.
int32 ia_role() const { return ia_role_; }
int32 ia_state() const { return ia_state_; }
const base::string16& role_name() const { return role_name_; }
int32 ia2_role() const { return ia2_role_; }
int32 ia2_state() const { return ia2_state_; }
const std::vector<base::string16>& ia2_attributes() const {
return ia2_attributes_;
}
private:
// Add one to the reference count and return the same object. Always
// use this method when returning a BrowserAccessibilityWin object as
// an output parameter to a COM interface, never use it otherwise.
BrowserAccessibilityWin* NewReference();
// 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.
BrowserAccessibilityWin* GetTargetFromChildID(const VARIANT& var_id);
// Initialize the role and state metadata from the role enum and state
// bitmasks defined in ui::AXNodeData.
void InitRoleAndState();
// Retrieve the value of an attribute from the string attribute map and
// if found and nonempty, allocate a new BSTR (with SysAllocString)
// and return S_OK. If not found or empty, return S_FALSE.
HRESULT GetStringAttributeAsBstr(
ui::AXStringAttribute attribute,
BSTR* value_bstr);
// If the string attribute |attribute| is present, add its value as an
// IAccessible2 attribute with the name |ia2_attr|.
void StringAttributeToIA2(ui::AXStringAttribute attribute,
const char* ia2_attr);
// If the bool attribute |attribute| is present, add its value as an
// IAccessible2 attribute with the name |ia2_attr|.
void BoolAttributeToIA2(ui::AXBoolAttribute attribute,
const char* ia2_attr);
// If the int attribute |attribute| is present, add its value as an
// IAccessible2 attribute with the name |ia2_attr|.
void IntAttributeToIA2(ui::AXIntAttribute attribute,
const char* ia2_attr);
// Get the value text, which might come from the floating-point
// value for some roles.
base::string16 GetValueText();
// Get the text of this node for the purposes of IAccessibleText - it may
// be the name, it may be the value, etc. depending on the role.
base::string16 TextForIAccessibleText();
// If offset is a member of IA2TextSpecialOffsets this function updates the
// value of offset and returns, otherwise offset remains unchanged.
void HandleSpecialTextOffset(const base::string16& text, LONG* offset);
// Convert from a IA2TextBoundaryType to a ui::TextBoundaryType.
ui::TextBoundaryType IA2TextBoundaryToTextBoundary(IA2TextBoundaryType type);
// Search forwards (direction == 1) or backwards (direction == -1)
// from the given offset until the given boundary is found, and
// return the offset of that boundary.
LONG FindBoundary(const base::string16& text,
IA2TextBoundaryType ia2_boundary,
LONG start_offset,
ui::TextBoundaryDirection direction);
// Return a pointer to the object corresponding to the given id,
// does not make a new reference.
BrowserAccessibilityWin* GetFromID(int32 id);
// Windows-specific unique ID (unique within the browser process),
// used for get_accChild, NotifyWinEvent, and as the unique ID for
// IAccessible2 and ISimpleDOM.
LONG unique_id_win_;
// IAccessible role and state.
int32 ia_role_;
int32 ia_state_;
base::string16 role_name_;
// IAccessible2 role and state.
int32 ia2_role_;
int32 ia2_state_;
// IAccessible2 attributes.
std::vector<base::string16> ia2_attributes_;
// True in Initialize when the object is first created, and false
// subsequent times.
bool first_time_;
// The previous text, before the last update to this object.
base::string16 previous_text_;
// The old text to return in IAccessibleText::get_oldText - this is like
// previous_text_ except that it's NOT updated when the object
// is initialized again but the text doesn't change.
base::string16 old_text_;
// The previous state, used to see if there was a state change.
int32 old_ia_state_;
// Relationships between this node and other nodes.
std::vector<BrowserAccessibilityRelation*> relations_;
// The text of this node including embedded hyperlink characters.
base::string16 hypertext_;
// Maps the |hypertext_| embedded character offset to an index in
// |hyperlinks_|.
std::map<int32, int32> hyperlink_offset_to_index_;
// Collection of non-static text child indicies, each of which corresponds to
// a hyperlink.
std::vector<int32> hyperlinks_;
// The previous scroll position, so we can tell if this object scrolled.
int previous_scroll_x_;
int previous_scroll_y_;
// The next unique id to use.
static LONG next_unique_id_win_;
// Give BrowserAccessibility::Create access to our constructor.
friend class BrowserAccessibility;
friend class BrowserAccessibilityRelation;
DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityWin);
};
} // namespace content
#endif // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_WIN_H_