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
23namespace ui {
24enum TextBoundaryDirection;
25enum TextBoundaryType;
26}
27
28namespace content {
29class 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////////////////////////////////////////////////////////////////////////////////
40class __declspec(uuid("562072fe-3390-43b1-9e2c-dd4118f5ac79"))
41BrowserAccessibilityWin
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.
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.
181  CONTENT_EXPORT STDMETHODIMP put_accName(VARIANT var_id, BSTR put_name) {
182    return E_NOTIMPL;
183  }
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  //
235  CONTENT_EXPORT STDMETHODIMP get_extendedRole(BSTR* extended_role) {
236    return E_NOTIMPL;
237  }
238  CONTENT_EXPORT STDMETHODIMP get_localizedExtendedRole(
239      BSTR* localized_extended_role) {
240    return E_NOTIMPL;
241  }
242  CONTENT_EXPORT STDMETHODIMP get_nExtendedStates(LONG* n_extended_states) {
243    return E_NOTIMPL;
244  }
245  CONTENT_EXPORT STDMETHODIMP get_extendedStates(LONG max_extended_states,
246                                                 BSTR** extended_states,
247                                                 LONG* n_extended_states) {
248    return E_NOTIMPL;
249  }
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  }
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
367  CONTENT_EXPORT STDMETHODIMP selectRow(long row) {
368    return E_NOTIMPL;
369  }
370
371  CONTENT_EXPORT STDMETHODIMP selectColumn(long column) {
372    return E_NOTIMPL;
373  }
374
375  CONTENT_EXPORT STDMETHODIMP unselectRow(long row) {
376    return E_NOTIMPL;
377  }
378
379  CONTENT_EXPORT STDMETHODIMP unselectColumn(long column) {
380    return E_NOTIMPL;
381  }
382
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.
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.
537  CONTENT_EXPORT STDMETHODIMP get_anchor(long index, VARIANT* anchor) {
538    return E_NOTIMPL;
539  }
540  CONTENT_EXPORT STDMETHODIMP get_anchorTarget(long index,
541                                               VARIANT* anchor_target) {
542    return E_NOTIMPL;
543  }
544  CONTENT_EXPORT STDMETHODIMP get_startIndex( long* index) {
545    return E_NOTIMPL;
546  }
547  CONTENT_EXPORT STDMETHODIMP get_endIndex( long* index) {
548    return E_NOTIMPL;
549  }
550  CONTENT_EXPORT STDMETHODIMP get_valid(boolean* valid) {
551    return E_NOTIMPL;
552  }
553
554  // IAccessibleAction not implemented.
555  CONTENT_EXPORT STDMETHODIMP nActions(long* n_actions) {
556    return E_NOTIMPL;
557  }
558  CONTENT_EXPORT STDMETHODIMP doAction(long action_index) {
559    return E_NOTIMPL;
560  }
561  CONTENT_EXPORT STDMETHODIMP get_description(long action_index,
562                                              BSTR* description) {
563    return E_NOTIMPL;
564  }
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  }
571  CONTENT_EXPORT STDMETHODIMP get_name(long action_index, BSTR* name) {
572    return E_NOTIMPL;
573  }
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
603  CONTENT_EXPORT STDMETHODIMP get_nameSpaceURIForID(short name_space_id,
604                                                    BSTR* name_space_uri) {
605    return E_NOTIMPL;
606  }
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
663  CONTENT_EXPORT STDMETHODIMP get_innerHTML(BSTR* innerHTML) {
664    return E_NOTIMPL;
665  }
666
667  CONTENT_EXPORT STDMETHODIMP get_localInterface(void** local_interface) {
668    return E_NOTIMPL;
669  }
670
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
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.
713  CONTENT_EXPORT STDMETHODIMP GetObjectForChild(long child_id,
714                                                IAccessibleEx** ret) {
715    return E_NOTIMPL;
716  }
717
718  CONTENT_EXPORT STDMETHODIMP GetIAccessiblePair(IAccessible** acc,
719                                                 long* child_id) {
720    return E_NOTIMPL;
721  }
722
723  CONTENT_EXPORT STDMETHODIMP GetRuntimeId(SAFEARRAY** runtime_id) {
724    return E_NOTIMPL;
725  }
726
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  //
745  CONTENT_EXPORT STDMETHODIMP get_ProviderOptions(enum ProviderOptions* ret) {
746    return E_NOTIMPL;
747  }
748
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.
765  int32 ia_role() const { return ia_role_; }
766  int32 ia_state() const { return ia_state_; }
767  const base::string16& role_name() const { return role_name_; }
768  int32 ia2_role() const { return ia2_role_; }
769  int32 ia2_state() const { return ia2_state_; }
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