1 // Copyright (c) 2012 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 CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_WIN_H_ 6 #define CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_WIN_H_ 7 8 #include <atlbase.h> 9 #include <atlcom.h> 10 #include <oleacc.h> 11 #include <UIAutomationCore.h> 12 13 #include <vector> 14 15 #include "base/compiler_specific.h" 16 #include "content/browser/accessibility/browser_accessibility.h" 17 #include "content/common/content_export.h" 18 #include "third_party/iaccessible2/ia2_api_all.h" 19 #include "third_party/isimpledom/ISimpleDOMDocument.h" 20 #include "third_party/isimpledom/ISimpleDOMNode.h" 21 #include "third_party/isimpledom/ISimpleDOMText.h" 22 23 namespace ui { 24 enum TextBoundaryDirection; 25 enum TextBoundaryType; 26 } 27 28 namespace content { 29 class BrowserAccessibilityRelation; 30 31 //////////////////////////////////////////////////////////////////////////////// 32 // 33 // BrowserAccessibilityWin 34 // 35 // Class implementing the windows accessible interface for the Browser-Renderer 36 // communication of accessibility information, providing accessibility 37 // to be used by screen readers and other assistive technology (AT). 38 // 39 //////////////////////////////////////////////////////////////////////////////// 40 class __declspec(uuid("562072fe-3390-43b1-9e2c-dd4118f5ac79")) 41 BrowserAccessibilityWin 42 : public BrowserAccessibility, 43 public CComObjectRootEx<CComMultiThreadModel>, 44 public IDispatchImpl<IAccessible2, &IID_IAccessible2, 45 &LIBID_IAccessible2Lib>, 46 public IAccessibleApplication, 47 public IAccessibleHyperlink, 48 public IAccessibleHypertext, 49 public IAccessibleImage, 50 public IAccessibleTable, 51 public IAccessibleTable2, 52 public IAccessibleTableCell, 53 public IAccessibleValue, 54 public IServiceProvider, 55 public ISimpleDOMDocument, 56 public ISimpleDOMNode, 57 public ISimpleDOMText, 58 public IAccessibleEx, 59 public IRawElementProviderSimple { 60 public: 61 BEGIN_COM_MAP(BrowserAccessibilityWin) 62 COM_INTERFACE_ENTRY2(IDispatch, IAccessible2) 63 COM_INTERFACE_ENTRY(IAccessible) 64 COM_INTERFACE_ENTRY(IAccessible2) 65 COM_INTERFACE_ENTRY(IAccessibleApplication) 66 COM_INTERFACE_ENTRY(IAccessibleEx) 67 COM_INTERFACE_ENTRY(IAccessibleHyperlink) 68 COM_INTERFACE_ENTRY(IAccessibleHypertext) 69 COM_INTERFACE_ENTRY(IAccessibleImage) 70 COM_INTERFACE_ENTRY(IAccessibleTable) 71 COM_INTERFACE_ENTRY(IAccessibleTable2) 72 COM_INTERFACE_ENTRY(IAccessibleTableCell) 73 COM_INTERFACE_ENTRY(IAccessibleText) 74 COM_INTERFACE_ENTRY(IAccessibleValue) 75 COM_INTERFACE_ENTRY(IRawElementProviderSimple) 76 COM_INTERFACE_ENTRY(IServiceProvider) 77 COM_INTERFACE_ENTRY(ISimpleDOMDocument) 78 COM_INTERFACE_ENTRY(ISimpleDOMNode) 79 COM_INTERFACE_ENTRY(ISimpleDOMText) 80 END_COM_MAP() 81 82 // Represents a non-static text node in IAccessibleHypertext. This character 83 // is embedded in the response to IAccessibleText::get_text, indicating the 84 // position where a non-static text child object appears. 85 CONTENT_EXPORT static const base::char16 kEmbeddedCharacter[]; 86 87 // Mappings from roles and states to human readable strings. Initialize 88 // with |InitializeStringMaps|. 89 static std::map<int32, base::string16> role_string_map; 90 static std::map<int32, base::string16> state_string_map; 91 92 CONTENT_EXPORT BrowserAccessibilityWin(); 93 94 CONTENT_EXPORT virtual ~BrowserAccessibilityWin(); 95 96 // The Windows-specific unique ID, used as the child ID for MSAA methods 97 // like NotifyWinEvent, and as the unique ID for IAccessible2 and ISimpleDOM. unique_id_win()98 LONG unique_id_win() const { return unique_id_win_; } 99 100 // 101 // BrowserAccessibility methods. 102 // 103 CONTENT_EXPORT virtual void OnDataChanged() OVERRIDE; 104 CONTENT_EXPORT virtual void OnUpdateFinished() OVERRIDE; 105 CONTENT_EXPORT virtual void NativeAddReference() OVERRIDE; 106 CONTENT_EXPORT virtual void NativeReleaseReference() OVERRIDE; 107 CONTENT_EXPORT virtual bool IsNative() const OVERRIDE; 108 CONTENT_EXPORT virtual void OnLocationChanged() OVERRIDE; 109 110 // 111 // IAccessible methods. 112 // 113 114 // Performs the default action on a given object. 115 CONTENT_EXPORT STDMETHODIMP accDoDefaultAction(VARIANT var_id); 116 117 // Retrieves the child element or child object at a given point on the screen. 118 CONTENT_EXPORT STDMETHODIMP accHitTest(LONG x_left, LONG y_top, 119 VARIANT* child); 120 121 // Retrieves the specified object's current screen location. 122 CONTENT_EXPORT STDMETHODIMP accLocation(LONG* x_left, 123 LONG* y_top, 124 LONG* width, 125 LONG* height, 126 VARIANT var_id); 127 128 // Traverses to another UI element and retrieves the object. 129 CONTENT_EXPORT STDMETHODIMP accNavigate(LONG nav_dir, VARIANT start, 130 VARIANT* end); 131 132 // Retrieves an IDispatch interface pointer for the specified child. 133 CONTENT_EXPORT STDMETHODIMP get_accChild(VARIANT var_child, 134 IDispatch** disp_child); 135 136 // Retrieves the number of accessible children. 137 CONTENT_EXPORT STDMETHODIMP get_accChildCount(LONG* child_count); 138 139 // Retrieves a string that describes the object's default action. 140 CONTENT_EXPORT STDMETHODIMP get_accDefaultAction(VARIANT var_id, 141 BSTR* default_action); 142 143 // Retrieves the object's description. 144 CONTENT_EXPORT STDMETHODIMP get_accDescription(VARIANT var_id, BSTR* desc); 145 146 // Retrieves the object that has the keyboard focus. 147 CONTENT_EXPORT STDMETHODIMP get_accFocus(VARIANT* focus_child); 148 149 // Retrieves the help information associated with the object. 150 CONTENT_EXPORT STDMETHODIMP get_accHelp(VARIANT var_id, BSTR* heflp); 151 152 // Retrieves the specified object's shortcut. 153 CONTENT_EXPORT STDMETHODIMP get_accKeyboardShortcut(VARIANT var_id, 154 BSTR* access_key); 155 156 // Retrieves the name of the specified object. 157 CONTENT_EXPORT STDMETHODIMP get_accName(VARIANT var_id, BSTR* name); 158 159 // Retrieves the IDispatch interface of the object's parent. 160 CONTENT_EXPORT STDMETHODIMP get_accParent(IDispatch** disp_parent); 161 162 // Retrieves information describing the role of the specified object. 163 CONTENT_EXPORT STDMETHODIMP get_accRole(VARIANT var_id, VARIANT* role); 164 165 // Retrieves the current state of the specified object. 166 CONTENT_EXPORT STDMETHODIMP get_accState(VARIANT var_id, VARIANT* state); 167 168 // Returns the value associated with the object. 169 CONTENT_EXPORT STDMETHODIMP get_accValue(VARIANT var_id, BSTR* value); 170 171 // Make an object take focus or extend the selection. 172 CONTENT_EXPORT STDMETHODIMP accSelect(LONG flags_sel, VARIANT var_id); 173 174 CONTENT_EXPORT STDMETHODIMP get_accHelpTopic(BSTR* help_file, 175 VARIANT var_id, 176 LONG* topic_id); 177 178 CONTENT_EXPORT STDMETHODIMP get_accSelection(VARIANT* selected); 179 180 // Deprecated methods, not implemented. put_accName(VARIANT var_id,BSTR put_name)181 CONTENT_EXPORT STDMETHODIMP put_accName(VARIANT var_id, BSTR put_name) { 182 return E_NOTIMPL; 183 } put_accValue(VARIANT var_id,BSTR put_val)184 CONTENT_EXPORT STDMETHODIMP put_accValue(VARIANT var_id, BSTR put_val) { 185 return E_NOTIMPL; 186 } 187 188 // 189 // IAccessible2 methods. 190 // 191 192 // Returns role from a longer list of possible roles. 193 CONTENT_EXPORT STDMETHODIMP role(LONG* role); 194 195 // Returns the state bitmask from a larger set of possible states. 196 CONTENT_EXPORT STDMETHODIMP get_states(AccessibleStates* states); 197 198 // Returns the attributes specific to this IAccessible2 object, 199 // such as a cell's formula. 200 CONTENT_EXPORT STDMETHODIMP get_attributes(BSTR* attributes); 201 202 // Get the unique ID of this object so that the client knows if it's 203 // been encountered previously. 204 CONTENT_EXPORT STDMETHODIMP get_uniqueID(LONG* unique_id); 205 206 // Get the window handle of the enclosing window. 207 CONTENT_EXPORT STDMETHODIMP get_windowHandle(HWND* window_handle); 208 209 // Get this object's index in its parent object. 210 CONTENT_EXPORT STDMETHODIMP get_indexInParent(LONG* index_in_parent); 211 212 CONTENT_EXPORT STDMETHODIMP get_nRelations(LONG* n_relations); 213 214 CONTENT_EXPORT STDMETHODIMP get_relation(LONG relation_index, 215 IAccessibleRelation** relation); 216 217 CONTENT_EXPORT STDMETHODIMP get_relations(LONG max_relations, 218 IAccessibleRelation** relations, 219 LONG* n_relations); 220 221 CONTENT_EXPORT STDMETHODIMP scrollTo(enum IA2ScrollType scroll_type); 222 223 CONTENT_EXPORT STDMETHODIMP scrollToPoint( 224 enum IA2CoordinateType coordinate_type, 225 LONG x, 226 LONG y); 227 228 CONTENT_EXPORT STDMETHODIMP get_groupPosition(LONG* group_level, 229 LONG* similar_items_in_group, 230 LONG* position_in_group); 231 232 // 233 // IAccessibleEx methods not implemented. 234 // get_extendedRole(BSTR * extended_role)235 CONTENT_EXPORT STDMETHODIMP get_extendedRole(BSTR* extended_role) { 236 return E_NOTIMPL; 237 } get_localizedExtendedRole(BSTR * localized_extended_role)238 CONTENT_EXPORT STDMETHODIMP get_localizedExtendedRole( 239 BSTR* localized_extended_role) { 240 return E_NOTIMPL; 241 } get_nExtendedStates(LONG * n_extended_states)242 CONTENT_EXPORT STDMETHODIMP get_nExtendedStates(LONG* n_extended_states) { 243 return E_NOTIMPL; 244 } get_extendedStates(LONG max_extended_states,BSTR ** extended_states,LONG * n_extended_states)245 CONTENT_EXPORT STDMETHODIMP get_extendedStates(LONG max_extended_states, 246 BSTR** extended_states, 247 LONG* n_extended_states) { 248 return E_NOTIMPL; 249 } get_localizedExtendedStates(LONG max_localized_extended_states,BSTR ** localized_extended_states,LONG * n_localized_extended_states)250 CONTENT_EXPORT STDMETHODIMP get_localizedExtendedStates( 251 LONG max_localized_extended_states, 252 BSTR** localized_extended_states, 253 LONG* n_localized_extended_states) { 254 return E_NOTIMPL; 255 } get_locale(IA2Locale * locale)256 CONTENT_EXPORT STDMETHODIMP get_locale(IA2Locale* locale) { 257 return E_NOTIMPL; 258 } 259 260 // 261 // IAccessibleApplication methods. 262 // 263 CONTENT_EXPORT STDMETHODIMP get_appName(BSTR* app_name); 264 265 CONTENT_EXPORT STDMETHODIMP get_appVersion(BSTR* app_version); 266 267 CONTENT_EXPORT STDMETHODIMP get_toolkitName(BSTR* toolkit_name); 268 269 CONTENT_EXPORT STDMETHODIMP get_toolkitVersion(BSTR* toolkit_version); 270 271 // 272 // IAccessibleImage methods. 273 // 274 CONTENT_EXPORT STDMETHODIMP get_description(BSTR* description); 275 276 CONTENT_EXPORT STDMETHODIMP get_imagePosition( 277 enum IA2CoordinateType coordinate_type, 278 LONG* x, 279 LONG* y); 280 281 CONTENT_EXPORT STDMETHODIMP get_imageSize(LONG* height, LONG* width); 282 283 // 284 // IAccessibleTable methods. 285 // 286 287 // get_description - also used by IAccessibleImage 288 289 CONTENT_EXPORT STDMETHODIMP get_accessibleAt(long row, 290 long column, 291 IUnknown** accessible); 292 293 CONTENT_EXPORT STDMETHODIMP get_caption(IUnknown** accessible); 294 295 CONTENT_EXPORT STDMETHODIMP get_childIndex(long row_index, 296 long column_index, 297 long* cell_index); 298 299 CONTENT_EXPORT STDMETHODIMP get_columnDescription(long column, 300 BSTR* description); 301 302 CONTENT_EXPORT STDMETHODIMP get_columnExtentAt(long row, 303 long column, 304 long* n_columns_spanned); 305 306 CONTENT_EXPORT STDMETHODIMP get_columnHeader( 307 IAccessibleTable** accessible_table, 308 long* starting_row_index); 309 310 CONTENT_EXPORT STDMETHODIMP get_columnIndex(long cell_index, 311 long* column_index); 312 313 CONTENT_EXPORT STDMETHODIMP get_nColumns(long* column_count); 314 315 CONTENT_EXPORT STDMETHODIMP get_nRows(long* row_count); 316 317 CONTENT_EXPORT STDMETHODIMP get_nSelectedChildren(long* cell_count); 318 319 CONTENT_EXPORT STDMETHODIMP get_nSelectedColumns(long* column_count); 320 321 CONTENT_EXPORT STDMETHODIMP get_nSelectedRows(long *row_count); 322 323 CONTENT_EXPORT STDMETHODIMP get_rowDescription(long row, 324 BSTR* description); 325 326 CONTENT_EXPORT STDMETHODIMP get_rowExtentAt(long row, 327 long column, 328 long* n_rows_spanned); 329 330 CONTENT_EXPORT STDMETHODIMP get_rowHeader(IAccessibleTable** accessible_table, 331 long* starting_column_index); 332 333 CONTENT_EXPORT STDMETHODIMP get_rowIndex(long cell_index, 334 long* row_index); 335 336 CONTENT_EXPORT STDMETHODIMP get_selectedChildren(long max_children, 337 long** children, 338 long* n_children); 339 340 CONTENT_EXPORT STDMETHODIMP get_selectedColumns(long max_columns, 341 long** columns, 342 long* n_columns); 343 344 CONTENT_EXPORT STDMETHODIMP get_selectedRows(long max_rows, 345 long** rows, 346 long* n_rows); 347 348 CONTENT_EXPORT STDMETHODIMP get_summary(IUnknown** accessible); 349 350 CONTENT_EXPORT STDMETHODIMP get_isColumnSelected(long column, 351 boolean* is_selected); 352 353 CONTENT_EXPORT STDMETHODIMP get_isRowSelected(long row, 354 boolean* is_selected); 355 356 CONTENT_EXPORT STDMETHODIMP get_isSelected(long row, 357 long column, 358 boolean* is_selected); 359 360 CONTENT_EXPORT STDMETHODIMP get_rowColumnExtentsAtIndex(long index, 361 long* row, 362 long* column, 363 long* row_extents, 364 long* column_extents, 365 boolean* is_selected); 366 selectRow(long row)367 CONTENT_EXPORT STDMETHODIMP selectRow(long row) { 368 return E_NOTIMPL; 369 } 370 selectColumn(long column)371 CONTENT_EXPORT STDMETHODIMP selectColumn(long column) { 372 return E_NOTIMPL; 373 } 374 unselectRow(long row)375 CONTENT_EXPORT STDMETHODIMP unselectRow(long row) { 376 return E_NOTIMPL; 377 } 378 unselectColumn(long column)379 CONTENT_EXPORT STDMETHODIMP unselectColumn(long column) { 380 return E_NOTIMPL; 381 } 382 get_modelChange(IA2TableModelChange * model_change)383 CONTENT_EXPORT STDMETHODIMP get_modelChange( 384 IA2TableModelChange* model_change) { 385 return E_NOTIMPL; 386 } 387 388 // 389 // IAccessibleTable2 methods. 390 // 391 // (Most of these are duplicates of IAccessibleTable methods, only the 392 // unique ones are included here.) 393 // 394 395 CONTENT_EXPORT STDMETHODIMP get_cellAt(long row, 396 long column, 397 IUnknown** cell); 398 399 CONTENT_EXPORT STDMETHODIMP get_nSelectedCells(long* cell_count); 400 401 CONTENT_EXPORT STDMETHODIMP get_selectedCells(IUnknown*** cells, 402 long* n_selected_cells); 403 404 CONTENT_EXPORT STDMETHODIMP get_selectedColumns(long** columns, 405 long* n_columns); 406 407 CONTENT_EXPORT STDMETHODIMP get_selectedRows(long** rows, 408 long* n_rows); 409 410 // 411 // IAccessibleTableCell methods. 412 // 413 414 CONTENT_EXPORT STDMETHODIMP get_columnExtent(long* n_columns_spanned); 415 416 CONTENT_EXPORT STDMETHODIMP get_columnHeaderCells( 417 IUnknown*** cell_accessibles, 418 long* n_column_header_cells); 419 420 CONTENT_EXPORT STDMETHODIMP get_columnIndex(long* column_index); 421 422 CONTENT_EXPORT STDMETHODIMP get_rowExtent(long* n_rows_spanned); 423 424 CONTENT_EXPORT STDMETHODIMP get_rowHeaderCells(IUnknown*** cell_accessibles, 425 long* n_row_header_cells); 426 427 CONTENT_EXPORT STDMETHODIMP get_rowIndex(long* row_index); 428 429 CONTENT_EXPORT STDMETHODIMP get_isSelected(boolean* is_selected); 430 431 CONTENT_EXPORT STDMETHODIMP get_rowColumnExtents(long* row, 432 long* column, 433 long* row_extents, 434 long* column_extents, 435 boolean* is_selected); 436 437 CONTENT_EXPORT STDMETHODIMP get_table(IUnknown** table); 438 439 // 440 // IAccessibleText methods. 441 // 442 443 CONTENT_EXPORT STDMETHODIMP get_nCharacters(LONG* n_characters); 444 445 CONTENT_EXPORT STDMETHODIMP get_caretOffset(LONG* offset); 446 447 CONTENT_EXPORT STDMETHODIMP get_characterExtents( 448 LONG offset, 449 enum IA2CoordinateType coord_type, 450 LONG* out_x, 451 LONG* out_y, 452 LONG* out_width, 453 LONG* out_height); 454 455 CONTENT_EXPORT STDMETHODIMP get_nSelections(LONG* n_selections); 456 457 CONTENT_EXPORT STDMETHODIMP get_selection(LONG selection_index, 458 LONG* start_offset, 459 LONG* end_offset); 460 461 CONTENT_EXPORT STDMETHODIMP get_text(LONG start_offset, 462 LONG end_offset, 463 BSTR* text); 464 465 CONTENT_EXPORT STDMETHODIMP get_textAtOffset( 466 LONG offset, 467 enum IA2TextBoundaryType boundary_type, 468 LONG* start_offset, 469 LONG* end_offset, 470 BSTR* text); 471 472 CONTENT_EXPORT STDMETHODIMP get_textBeforeOffset( 473 LONG offset, 474 enum IA2TextBoundaryType boundary_type, 475 LONG* start_offset, 476 LONG* end_offset, 477 BSTR* text); 478 479 CONTENT_EXPORT STDMETHODIMP get_textAfterOffset( 480 LONG offset, 481 enum IA2TextBoundaryType boundary_type, 482 LONG* start_offset, 483 LONG* end_offset, 484 BSTR* text); 485 486 CONTENT_EXPORT STDMETHODIMP get_newText(IA2TextSegment* new_text); 487 488 CONTENT_EXPORT STDMETHODIMP get_oldText(IA2TextSegment* old_text); 489 490 CONTENT_EXPORT STDMETHODIMP get_offsetAtPoint( 491 LONG x, 492 LONG y, 493 enum IA2CoordinateType coord_type, 494 LONG* offset); 495 496 CONTENT_EXPORT STDMETHODIMP scrollSubstringTo( 497 LONG start_index, 498 LONG end_index, 499 enum IA2ScrollType scroll_type); 500 501 CONTENT_EXPORT STDMETHODIMP scrollSubstringToPoint( 502 LONG start_index, 503 LONG end_index, 504 enum IA2CoordinateType coordinate_type, 505 LONG x, LONG y); 506 507 CONTENT_EXPORT STDMETHODIMP addSelection(LONG start_offset, LONG end_offset); 508 509 CONTENT_EXPORT STDMETHODIMP removeSelection(LONG selection_index); 510 511 CONTENT_EXPORT STDMETHODIMP setCaretOffset(LONG offset); 512 513 CONTENT_EXPORT STDMETHODIMP setSelection(LONG selection_index, 514 LONG start_offset, 515 LONG end_offset); 516 517 // IAccessibleText methods not implemented. get_attributes(LONG offset,LONG * start_offset,LONG * end_offset,BSTR * text_attributes)518 CONTENT_EXPORT STDMETHODIMP get_attributes(LONG offset, LONG* start_offset, 519 LONG* end_offset, 520 BSTR* text_attributes) { 521 return E_NOTIMPL; 522 } 523 524 // 525 // IAccessibleHypertext methods. 526 // 527 528 CONTENT_EXPORT STDMETHODIMP get_nHyperlinks(long* hyperlink_count); 529 530 CONTENT_EXPORT STDMETHODIMP get_hyperlink(long index, 531 IAccessibleHyperlink** hyperlink); 532 533 CONTENT_EXPORT STDMETHODIMP get_hyperlinkIndex(long char_index, 534 long* hyperlink_index); 535 536 // IAccessibleHyperlink not implemented. get_anchor(long index,VARIANT * anchor)537 CONTENT_EXPORT STDMETHODIMP get_anchor(long index, VARIANT* anchor) { 538 return E_NOTIMPL; 539 } get_anchorTarget(long index,VARIANT * anchor_target)540 CONTENT_EXPORT STDMETHODIMP get_anchorTarget(long index, 541 VARIANT* anchor_target) { 542 return E_NOTIMPL; 543 } get_startIndex(long * index)544 CONTENT_EXPORT STDMETHODIMP get_startIndex( long* index) { 545 return E_NOTIMPL; 546 } get_endIndex(long * index)547 CONTENT_EXPORT STDMETHODIMP get_endIndex( long* index) { 548 return E_NOTIMPL; 549 } get_valid(boolean * valid)550 CONTENT_EXPORT STDMETHODIMP get_valid(boolean* valid) { 551 return E_NOTIMPL; 552 } 553 554 // IAccessibleAction not implemented. nActions(long * n_actions)555 CONTENT_EXPORT STDMETHODIMP nActions(long* n_actions) { 556 return E_NOTIMPL; 557 } doAction(long action_index)558 CONTENT_EXPORT STDMETHODIMP doAction(long action_index) { 559 return E_NOTIMPL; 560 } get_description(long action_index,BSTR * description)561 CONTENT_EXPORT STDMETHODIMP get_description(long action_index, 562 BSTR* description) { 563 return E_NOTIMPL; 564 } get_keyBinding(long action_index,long n_max_bindings,BSTR ** key_bindings,long * n_bindings)565 CONTENT_EXPORT STDMETHODIMP get_keyBinding(long action_index, 566 long n_max_bindings, 567 BSTR** key_bindings, 568 long* n_bindings) { 569 return E_NOTIMPL; 570 } get_name(long action_index,BSTR * name)571 CONTENT_EXPORT STDMETHODIMP get_name(long action_index, BSTR* name) { 572 return E_NOTIMPL; 573 } get_localizedName(long action_index,BSTR * localized_name)574 CONTENT_EXPORT STDMETHODIMP get_localizedName(long action_index, 575 BSTR* localized_name) { 576 return E_NOTIMPL; 577 } 578 579 // 580 // IAccessibleValue methods. 581 // 582 583 CONTENT_EXPORT STDMETHODIMP get_currentValue(VARIANT* value); 584 585 CONTENT_EXPORT STDMETHODIMP get_minimumValue(VARIANT* value); 586 587 CONTENT_EXPORT STDMETHODIMP get_maximumValue(VARIANT* value); 588 589 CONTENT_EXPORT STDMETHODIMP setCurrentValue(VARIANT new_value); 590 591 // 592 // ISimpleDOMDocument methods. 593 // 594 595 CONTENT_EXPORT STDMETHODIMP get_URL(BSTR* url); 596 597 CONTENT_EXPORT STDMETHODIMP get_title(BSTR* title); 598 599 CONTENT_EXPORT STDMETHODIMP get_mimeType(BSTR* mime_type); 600 601 CONTENT_EXPORT STDMETHODIMP get_docType(BSTR* doc_type); 602 get_nameSpaceURIForID(short name_space_id,BSTR * name_space_uri)603 CONTENT_EXPORT STDMETHODIMP get_nameSpaceURIForID(short name_space_id, 604 BSTR* name_space_uri) { 605 return E_NOTIMPL; 606 } put_alternateViewMediaTypes(BSTR * comma_separated_media_types)607 CONTENT_EXPORT STDMETHODIMP put_alternateViewMediaTypes( 608 BSTR* comma_separated_media_types) { 609 return E_NOTIMPL; 610 } 611 612 // 613 // ISimpleDOMNode methods. 614 // 615 616 CONTENT_EXPORT STDMETHODIMP get_nodeInfo(BSTR* node_name, 617 short* name_space_id, 618 BSTR* node_value, 619 unsigned int* num_children, 620 unsigned int* unique_id, 621 unsigned short* node_type); 622 623 CONTENT_EXPORT STDMETHODIMP get_attributes(unsigned short max_attribs, 624 BSTR* attrib_names, 625 short* name_space_id, 626 BSTR* attrib_values, 627 unsigned short* num_attribs); 628 629 CONTENT_EXPORT STDMETHODIMP get_attributesForNames( 630 unsigned short num_attribs, 631 BSTR* attrib_names, 632 short* name_space_id, 633 BSTR* attrib_values); 634 635 CONTENT_EXPORT STDMETHODIMP get_computedStyle( 636 unsigned short max_style_properties, 637 boolean use_alternate_view, 638 BSTR *style_properties, 639 BSTR *style_values, 640 unsigned short *num_style_properties); 641 642 CONTENT_EXPORT STDMETHODIMP get_computedStyleForProperties( 643 unsigned short num_style_properties, 644 boolean use_alternate_view, 645 BSTR* style_properties, 646 BSTR* style_values); 647 648 CONTENT_EXPORT STDMETHODIMP scrollTo(boolean placeTopLeft); 649 650 CONTENT_EXPORT STDMETHODIMP get_parentNode(ISimpleDOMNode** node); 651 652 CONTENT_EXPORT STDMETHODIMP get_firstChild(ISimpleDOMNode** node); 653 654 CONTENT_EXPORT STDMETHODIMP get_lastChild(ISimpleDOMNode** node); 655 656 CONTENT_EXPORT STDMETHODIMP get_previousSibling(ISimpleDOMNode** node); 657 658 CONTENT_EXPORT STDMETHODIMP get_nextSibling(ISimpleDOMNode** node); 659 660 CONTENT_EXPORT STDMETHODIMP get_childAt(unsigned int child_index, 661 ISimpleDOMNode** node); 662 get_innerHTML(BSTR * innerHTML)663 CONTENT_EXPORT STDMETHODIMP get_innerHTML(BSTR* innerHTML) { 664 return E_NOTIMPL; 665 } 666 get_localInterface(void ** local_interface)667 CONTENT_EXPORT STDMETHODIMP get_localInterface(void** local_interface) { 668 return E_NOTIMPL; 669 } 670 get_language(BSTR * language)671 CONTENT_EXPORT STDMETHODIMP get_language(BSTR* language) { 672 return E_NOTIMPL; 673 } 674 675 // 676 // ISimpleDOMText methods. 677 // 678 679 CONTENT_EXPORT STDMETHODIMP get_domText(BSTR* dom_text); 680 681 CONTENT_EXPORT STDMETHODIMP get_clippedSubstringBounds( 682 unsigned int start_index, 683 unsigned int end_index, 684 int* out_x, 685 int* out_y, 686 int* out_width, 687 int* out_height); 688 689 CONTENT_EXPORT STDMETHODIMP get_unclippedSubstringBounds( 690 unsigned int start_index, 691 unsigned int end_index, 692 int* out_x, 693 int* out_y, 694 int* out_width, 695 int* out_height); 696 697 CONTENT_EXPORT STDMETHODIMP scrollToSubstring(unsigned int start_index, 698 unsigned int end_index); 699 get_fontFamily(BSTR * font_family)700 CONTENT_EXPORT STDMETHODIMP get_fontFamily(BSTR *font_family) { 701 return E_NOTIMPL; 702 } 703 704 // 705 // IServiceProvider methods. 706 // 707 708 CONTENT_EXPORT STDMETHODIMP QueryService(REFGUID guidService, 709 REFIID riid, 710 void** object); 711 712 // IAccessibleEx methods not implemented. GetObjectForChild(long child_id,IAccessibleEx ** ret)713 CONTENT_EXPORT STDMETHODIMP GetObjectForChild(long child_id, 714 IAccessibleEx** ret) { 715 return E_NOTIMPL; 716 } 717 GetIAccessiblePair(IAccessible ** acc,long * child_id)718 CONTENT_EXPORT STDMETHODIMP GetIAccessiblePair(IAccessible** acc, 719 long* child_id) { 720 return E_NOTIMPL; 721 } 722 GetRuntimeId(SAFEARRAY ** runtime_id)723 CONTENT_EXPORT STDMETHODIMP GetRuntimeId(SAFEARRAY** runtime_id) { 724 return E_NOTIMPL; 725 } 726 ConvertReturnedElement(IRawElementProviderSimple * element,IAccessibleEx ** acc)727 CONTENT_EXPORT STDMETHODIMP ConvertReturnedElement( 728 IRawElementProviderSimple* element, 729 IAccessibleEx** acc) { 730 return E_NOTIMPL; 731 } 732 733 // 734 // IRawElementProviderSimple methods. 735 // 736 // The GetPatternProvider/GetPropertyValue methods need to be implemented for 737 // the on-screen keyboard to show up in Windows 8 metro. 738 CONTENT_EXPORT STDMETHODIMP GetPatternProvider(PATTERNID id, 739 IUnknown** provider); 740 CONTENT_EXPORT STDMETHODIMP GetPropertyValue(PROPERTYID id, VARIANT* ret); 741 742 // 743 // IRawElementProviderSimple methods not implemented 744 // get_ProviderOptions(enum ProviderOptions * ret)745 CONTENT_EXPORT STDMETHODIMP get_ProviderOptions(enum ProviderOptions* ret) { 746 return E_NOTIMPL; 747 } 748 get_HostRawElementProvider(IRawElementProviderSimple ** provider)749 CONTENT_EXPORT STDMETHODIMP get_HostRawElementProvider( 750 IRawElementProviderSimple** provider) { 751 return E_NOTIMPL; 752 } 753 754 // 755 // CComObjectRootEx methods. 756 // 757 758 CONTENT_EXPORT HRESULT WINAPI InternalQueryInterface( 759 void* this_ptr, 760 const _ATL_INTMAP_ENTRY* entries, 761 REFIID iid, 762 void** object); 763 764 // Accessors. ia_role()765 int32 ia_role() const { return ia_role_; } ia_state()766 int32 ia_state() const { return ia_state_; } role_name()767 const base::string16& role_name() const { return role_name_; } ia2_role()768 int32 ia2_role() const { return ia2_role_; } ia2_state()769 int32 ia2_state() const { return ia2_state_; } ia2_attributes()770 const std::vector<base::string16>& ia2_attributes() const { 771 return ia2_attributes_; 772 } 773 774 private: 775 // Add one to the reference count and return the same object. Always 776 // use this method when returning a BrowserAccessibilityWin object as 777 // an output parameter to a COM interface, never use it otherwise. 778 BrowserAccessibilityWin* NewReference(); 779 780 // Many MSAA methods take a var_id parameter indicating that the operation 781 // should be performed on a particular child ID, rather than this object. 782 // This method tries to figure out the target object from |var_id| and 783 // returns a pointer to the target object if it exists, otherwise NULL. 784 // Does not return a new reference. 785 BrowserAccessibilityWin* GetTargetFromChildID(const VARIANT& var_id); 786 787 // Initialize the role and state metadata from the role enum and state 788 // bitmasks defined in ui::AXNodeData. 789 void InitRoleAndState(); 790 791 // Retrieve the value of an attribute from the string attribute map and 792 // if found and nonempty, allocate a new BSTR (with SysAllocString) 793 // and return S_OK. If not found or empty, return S_FALSE. 794 HRESULT GetStringAttributeAsBstr( 795 ui::AXStringAttribute attribute, 796 BSTR* value_bstr); 797 798 // If the string attribute |attribute| is present, add its value as an 799 // IAccessible2 attribute with the name |ia2_attr|. 800 void StringAttributeToIA2(ui::AXStringAttribute attribute, 801 const char* ia2_attr); 802 803 // If the bool attribute |attribute| is present, add its value as an 804 // IAccessible2 attribute with the name |ia2_attr|. 805 void BoolAttributeToIA2(ui::AXBoolAttribute attribute, 806 const char* ia2_attr); 807 808 // If the int attribute |attribute| is present, add its value as an 809 // IAccessible2 attribute with the name |ia2_attr|. 810 void IntAttributeToIA2(ui::AXIntAttribute attribute, 811 const char* ia2_attr); 812 813 // Get the value text, which might come from the floating-point 814 // value for some roles. 815 base::string16 GetValueText(); 816 817 // Get the text of this node for the purposes of IAccessibleText - it may 818 // be the name, it may be the value, etc. depending on the role. 819 base::string16 TextForIAccessibleText(); 820 821 // If offset is a member of IA2TextSpecialOffsets this function updates the 822 // value of offset and returns, otherwise offset remains unchanged. 823 void HandleSpecialTextOffset(const base::string16& text, LONG* offset); 824 825 // Convert from a IA2TextBoundaryType to a ui::TextBoundaryType. 826 ui::TextBoundaryType IA2TextBoundaryToTextBoundary(IA2TextBoundaryType type); 827 828 // Search forwards (direction == 1) or backwards (direction == -1) 829 // from the given offset until the given boundary is found, and 830 // return the offset of that boundary. 831 LONG FindBoundary(const base::string16& text, 832 IA2TextBoundaryType ia2_boundary, 833 LONG start_offset, 834 ui::TextBoundaryDirection direction); 835 836 // Return a pointer to the object corresponding to the given id, 837 // does not make a new reference. 838 BrowserAccessibilityWin* GetFromID(int32 id); 839 840 // Windows-specific unique ID (unique within the browser process), 841 // used for get_accChild, NotifyWinEvent, and as the unique ID for 842 // IAccessible2 and ISimpleDOM. 843 LONG unique_id_win_; 844 845 // IAccessible role and state. 846 int32 ia_role_; 847 int32 ia_state_; 848 base::string16 role_name_; 849 850 // IAccessible2 role and state. 851 int32 ia2_role_; 852 int32 ia2_state_; 853 854 // IAccessible2 attributes. 855 std::vector<base::string16> ia2_attributes_; 856 857 // True in Initialize when the object is first created, and false 858 // subsequent times. 859 bool first_time_; 860 861 // The previous text, before the last update to this object. 862 base::string16 previous_text_; 863 864 // The old text to return in IAccessibleText::get_oldText - this is like 865 // previous_text_ except that it's NOT updated when the object 866 // is initialized again but the text doesn't change. 867 base::string16 old_text_; 868 869 // The previous state, used to see if there was a state change. 870 int32 old_ia_state_; 871 872 // Relationships between this node and other nodes. 873 std::vector<BrowserAccessibilityRelation*> relations_; 874 875 // The text of this node including embedded hyperlink characters. 876 base::string16 hypertext_; 877 878 // Maps the |hypertext_| embedded character offset to an index in 879 // |hyperlinks_|. 880 std::map<int32, int32> hyperlink_offset_to_index_; 881 882 // Collection of non-static text child indicies, each of which corresponds to 883 // a hyperlink. 884 std::vector<int32> hyperlinks_; 885 886 // The previous scroll position, so we can tell if this object scrolled. 887 int previous_scroll_x_; 888 int previous_scroll_y_; 889 890 // The next unique id to use. 891 static LONG next_unique_id_win_; 892 893 // Give BrowserAccessibility::Create access to our constructor. 894 friend class BrowserAccessibility; 895 friend class BrowserAccessibilityRelation; 896 897 DISALLOW_COPY_AND_ASSIGN(BrowserAccessibilityWin); 898 }; 899 900 } // namespace content 901 902 #endif // CONTENT_BROWSER_ACCESSIBILITY_BROWSER_ACCESSIBILITY_WIN_H_ 903