| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2010 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 CHROME_BROWSER_BROWSER_ACCESSIBILITY_H_ | |
| 6 #define CHROME_BROWSER_BROWSER_ACCESSIBILITY_H_ | |
| 7 | |
| 8 #include <atlbase.h> | |
| 9 #include <atlcom.h> | |
| 10 #include <oleacc.h> | |
| 11 | |
| 12 #include <vector> | |
| 13 | |
| 14 #include "base/scoped_comptr_win.h" | |
| 15 #include "chrome/browser/browser_accessibility_manager.h" | |
| 16 #include "ia2_api_all.h" // Generated | |
| 17 #include "webkit/glue/webaccessibility.h" | |
| 18 | |
| 19 using webkit_glue::WebAccessibility; | |
| 20 | |
| 21 //////////////////////////////////////////////////////////////////////////////// | |
| 22 // | |
| 23 // BrowserAccessibility | |
| 24 // | |
| 25 // Class implementing the MSAA IAccessible COM interface for the | |
| 26 // Browser-Renderer communication of MSAA information, providing accessibility | |
| 27 // to be used by screen readers and other assistive technology (AT). | |
| 28 // | |
| 29 //////////////////////////////////////////////////////////////////////////////// | |
| 30 class ATL_NO_VTABLE BrowserAccessibility | |
| 31 : public CComObjectRootEx<CComMultiThreadModel>, | |
| 32 public IDispatchImpl<IAccessible2, &IID_IAccessible2, | |
| 33 &LIBID_IAccessible2Lib>, | |
| 34 public IAccessibleImage, | |
| 35 public IAccessibleText, | |
| 36 public IServiceProvider { | |
| 37 public: | |
| 38 BEGIN_COM_MAP(BrowserAccessibility) | |
| 39 COM_INTERFACE_ENTRY2(IDispatch, IAccessible2) | |
| 40 COM_INTERFACE_ENTRY2(IAccessible, IAccessible2) | |
| 41 COM_INTERFACE_ENTRY(IAccessible2) | |
| 42 COM_INTERFACE_ENTRY(IAccessibleImage) | |
| 43 COM_INTERFACE_ENTRY(IAccessibleText) | |
| 44 COM_INTERFACE_ENTRY(IServiceProvider) | |
| 45 END_COM_MAP() | |
| 46 | |
| 47 BrowserAccessibility(); | |
| 48 | |
| 49 virtual ~BrowserAccessibility(); | |
| 50 | |
| 51 // Initialize this object and mark it as active. | |
| 52 void Initialize(BrowserAccessibilityManager* manager, | |
| 53 BrowserAccessibility* parent, | |
| 54 LONG child_id, | |
| 55 LONG index_in_parent, | |
| 56 const webkit_glue::WebAccessibility& src); | |
| 57 | |
| 58 // Add a child of this object. | |
| 59 void AddChild(BrowserAccessibility* child); | |
| 60 | |
| 61 // Mark this object as inactive, and remove references to all children. | |
| 62 // When no other clients hold any references to this object it will be | |
| 63 // deleted, and in the meantime, calls to any methods will return E_FAIL. | |
| 64 void InactivateTree(); | |
| 65 | |
| 66 // Return true if this object is equal to or a descendant of |ancestor|. | |
| 67 bool IsDescendantOf(BrowserAccessibility* ancestor); | |
| 68 | |
| 69 // Return the previous sibling of this object, or NULL if it's the first | |
| 70 // child of its parent. | |
| 71 BrowserAccessibility* GetPreviousSibling(); | |
| 72 | |
| 73 // Return the next sibling of this object, or NULL if it's the last child | |
| 74 // of its parent. | |
| 75 BrowserAccessibility* GetNextSibling(); | |
| 76 | |
| 77 // Accessors | |
| 78 LONG child_id() const { return child_id_; } | |
| 79 int32 renderer_id() const { return renderer_id_; } | |
| 80 | |
| 81 // Add one to the reference count and return the same object. Always | |
| 82 // use this method when returning a BrowserAccessibility object as | |
| 83 // an output parameter to a COM interface, never use it otherwise. | |
| 84 BrowserAccessibility* NewReference(); | |
| 85 | |
| 86 // | |
| 87 // IAccessible methods. | |
| 88 // | |
| 89 | |
| 90 // Performs the default action on a given object. | |
| 91 STDMETHODIMP accDoDefaultAction(VARIANT var_id); | |
| 92 | |
| 93 // Retrieves the child element or child object at a given point on the screen. | |
| 94 STDMETHODIMP accHitTest(LONG x_left, LONG y_top, VARIANT* child); | |
| 95 | |
| 96 // Retrieves the specified object's current screen location. | |
| 97 STDMETHODIMP accLocation(LONG* x_left, | |
| 98 LONG* y_top, | |
| 99 LONG* width, | |
| 100 LONG* height, | |
| 101 VARIANT var_id); | |
| 102 | |
| 103 // Traverses to another UI element and retrieves the object. | |
| 104 STDMETHODIMP accNavigate(LONG nav_dir, VARIANT start, VARIANT* end); | |
| 105 | |
| 106 // Retrieves an IDispatch interface pointer for the specified child. | |
| 107 STDMETHODIMP get_accChild(VARIANT var_child, IDispatch** disp_child); | |
| 108 | |
| 109 // Retrieves the number of accessible children. | |
| 110 STDMETHODIMP get_accChildCount(LONG* child_count); | |
| 111 | |
| 112 // Retrieves a string that describes the object's default action. | |
| 113 STDMETHODIMP get_accDefaultAction(VARIANT var_id, BSTR* default_action); | |
| 114 | |
| 115 // Retrieves the object's description. | |
| 116 STDMETHODIMP get_accDescription(VARIANT var_id, BSTR* desc); | |
| 117 | |
| 118 // Retrieves the object that has the keyboard focus. | |
| 119 STDMETHODIMP get_accFocus(VARIANT* focus_child); | |
| 120 | |
| 121 // Retrieves the help information associated with the object. | |
| 122 STDMETHODIMP get_accHelp(VARIANT var_id, BSTR* help); | |
| 123 | |
| 124 // Retrieves the specified object's shortcut. | |
| 125 STDMETHODIMP get_accKeyboardShortcut(VARIANT var_id, BSTR* access_key); | |
| 126 | |
| 127 // Retrieves the name of the specified object. | |
| 128 STDMETHODIMP get_accName(VARIANT var_id, BSTR* name); | |
| 129 | |
| 130 // Retrieves the IDispatch interface of the object's parent. | |
| 131 STDMETHODIMP get_accParent(IDispatch** disp_parent); | |
| 132 | |
| 133 // Retrieves information describing the role of the specified object. | |
| 134 STDMETHODIMP get_accRole(VARIANT var_id, VARIANT* role); | |
| 135 | |
| 136 // Retrieves the current state of the specified object. | |
| 137 STDMETHODIMP get_accState(VARIANT var_id, VARIANT* state); | |
| 138 | |
| 139 // Returns the value associated with the object. | |
| 140 STDMETHODIMP get_accValue(VARIANT var_id, BSTR* value); | |
| 141 | |
| 142 // Make an object take focus or extend the selection. | |
| 143 STDMETHODIMP accSelect(LONG flags_sel, VARIANT var_id); | |
| 144 | |
| 145 STDMETHODIMP get_accHelpTopic(BSTR* help_file, | |
| 146 VARIANT var_id, | |
| 147 LONG* topic_id); | |
| 148 | |
| 149 STDMETHODIMP get_accSelection(VARIANT* selected); | |
| 150 | |
| 151 // Deprecated methods, not implemented. | |
| 152 STDMETHODIMP put_accName(VARIANT var_id, BSTR put_name) { | |
| 153 return E_NOTIMPL; | |
| 154 } | |
| 155 STDMETHODIMP put_accValue(VARIANT var_id, BSTR put_val) { | |
| 156 return E_NOTIMPL; | |
| 157 } | |
| 158 | |
| 159 // | |
| 160 // IAccessible2 methods. | |
| 161 // | |
| 162 | |
| 163 // Returns role from a longer list of possible roles. | |
| 164 STDMETHODIMP role(LONG* role); | |
| 165 | |
| 166 // Returns the state bitmask from a larger set of possible states. | |
| 167 STDMETHODIMP get_states(AccessibleStates* states); | |
| 168 | |
| 169 // Returns the attributes specific to this IAccessible2 object, | |
| 170 // such as a cell's formula. | |
| 171 STDMETHODIMP get_attributes(BSTR* attributes); | |
| 172 | |
| 173 // Get the unique ID of this object so that the client knows if it's | |
| 174 // been encountered previously. | |
| 175 STDMETHODIMP get_uniqueID(LONG* unique_id); | |
| 176 | |
| 177 // Get the window handle of the enclosing window. | |
| 178 STDMETHODIMP get_windowHandle(HWND* window_handle); | |
| 179 | |
| 180 // Get this object's index in its parent object. | |
| 181 STDMETHODIMP get_indexInParent(LONG* index_in_parent); | |
| 182 | |
| 183 // IAccessible2 methods not implemented. | |
| 184 STDMETHODIMP get_extendedRole(BSTR* extended_role) { | |
| 185 return E_NOTIMPL; | |
| 186 } | |
| 187 STDMETHODIMP get_nRelations(LONG* n_relations) { | |
| 188 return E_NOTIMPL; | |
| 189 } | |
| 190 STDMETHODIMP get_relation(LONG relation_index, | |
| 191 IAccessibleRelation** relation) { | |
| 192 return E_NOTIMPL; | |
| 193 } | |
| 194 STDMETHODIMP get_relations(LONG max_relations, | |
| 195 IAccessibleRelation** relations, | |
| 196 LONG* n_relations) { | |
| 197 return E_NOTIMPL; | |
| 198 } | |
| 199 STDMETHODIMP scrollTo(enum IA2ScrollType scroll_type) { | |
| 200 return E_NOTIMPL; | |
| 201 } | |
| 202 STDMETHODIMP scrollToPoint(enum IA2CoordinateType coordinate_type, | |
| 203 LONG x, | |
| 204 LONG y) { | |
| 205 return E_NOTIMPL; | |
| 206 } | |
| 207 STDMETHODIMP get_groupPosition(LONG* group_level, | |
| 208 LONG* similar_items_in_group, | |
| 209 LONG* position_in_group) { | |
| 210 return E_NOTIMPL; | |
| 211 } | |
| 212 STDMETHODIMP get_localizedExtendedRole(BSTR* localized_extended_role) { | |
| 213 return E_NOTIMPL; | |
| 214 } | |
| 215 STDMETHODIMP get_nExtendedStates(LONG* n_extended_states) { | |
| 216 return E_NOTIMPL; | |
| 217 } | |
| 218 STDMETHODIMP get_extendedStates(LONG max_extended_states, | |
| 219 BSTR** extended_states, | |
| 220 LONG* n_extended_states) { | |
| 221 return E_NOTIMPL; | |
| 222 } | |
| 223 STDMETHODIMP get_localizedExtendedStates(LONG max_localized_extended_states, | |
| 224 BSTR** localized_extended_states, | |
| 225 LONG* n_localized_extended_states) { | |
| 226 return E_NOTIMPL; | |
| 227 } | |
| 228 STDMETHODIMP get_locale(IA2Locale* locale) { | |
| 229 return E_NOTIMPL; | |
| 230 } | |
| 231 | |
| 232 // | |
| 233 // IAccessibleImage methods. | |
| 234 // | |
| 235 | |
| 236 STDMETHODIMP get_description(BSTR* description); | |
| 237 | |
| 238 STDMETHODIMP get_imagePosition(enum IA2CoordinateType coordinate_type, | |
| 239 long* x, long* y); | |
| 240 | |
| 241 STDMETHODIMP get_imageSize(long* height, long* width); | |
| 242 | |
| 243 // | |
| 244 // IAccessibleText methods. | |
| 245 // | |
| 246 | |
| 247 STDMETHODIMP get_nCharacters(long* n_characters); | |
| 248 | |
| 249 STDMETHODIMP get_text(long start_offset, long end_offset, BSTR* text); | |
| 250 | |
| 251 STDMETHODIMP get_caretOffset(long* offset); | |
| 252 | |
| 253 // IAccessibleText methods not implemented. | |
| 254 STDMETHODIMP addSelection(long start_offset, long end_offset) { | |
| 255 return E_NOTIMPL; | |
| 256 } | |
| 257 STDMETHODIMP get_attributes(long offset, long* start_offset, long* end_offset, | |
| 258 BSTR* text_attributes) { | |
| 259 return E_NOTIMPL; | |
| 260 } | |
| 261 STDMETHODIMP get_characterExtents(long offset, | |
| 262 enum IA2CoordinateType coord_type, | |
| 263 long* x, long* y, | |
| 264 long* width, long* height) { | |
| 265 return E_NOTIMPL; | |
| 266 } | |
| 267 STDMETHODIMP get_nSelections(long* n_selections) { | |
| 268 return E_NOTIMPL; | |
| 269 } | |
| 270 STDMETHODIMP get_offsetAtPoint(long x, long y, | |
| 271 enum IA2CoordinateType coord_type, | |
| 272 long* offset) { | |
| 273 return E_NOTIMPL; | |
| 274 } | |
| 275 STDMETHODIMP get_selection(long selection_index, | |
| 276 long* start_offset, | |
| 277 long* end_offset) { | |
| 278 return E_NOTIMPL; | |
| 279 } | |
| 280 STDMETHODIMP get_textBeforeOffset(long offset, | |
| 281 enum IA2TextBoundaryType boundary_type, | |
| 282 long* start_offset, long* end_offset, | |
| 283 BSTR* text) { | |
| 284 return E_NOTIMPL; | |
| 285 } | |
| 286 STDMETHODIMP get_textAfterOffset(long offset, | |
| 287 enum IA2TextBoundaryType boundary_type, | |
| 288 long* start_offset, long* end_offset, | |
| 289 BSTR* text) { | |
| 290 return E_NOTIMPL; | |
| 291 } | |
| 292 STDMETHODIMP get_textAtOffset(long offset, | |
| 293 enum IA2TextBoundaryType boundary_type, | |
| 294 long* start_offset, long* end_offset, | |
| 295 BSTR* text) { | |
| 296 return E_NOTIMPL; | |
| 297 } | |
| 298 STDMETHODIMP removeSelection(long selection_index) { | |
| 299 return E_NOTIMPL; | |
| 300 } | |
| 301 STDMETHODIMP setCaretOffset(long offset) { | |
| 302 return E_NOTIMPL; | |
| 303 } | |
| 304 STDMETHODIMP setSelection(long selection_index, | |
| 305 long start_offset, | |
| 306 long end_offset) { | |
| 307 return E_NOTIMPL; | |
| 308 } | |
| 309 STDMETHODIMP scrollSubstringTo(long start_index, | |
| 310 long end_index, | |
| 311 enum IA2ScrollType scroll_type) { | |
| 312 return E_NOTIMPL; | |
| 313 } | |
| 314 STDMETHODIMP scrollSubstringToPoint(long start_index, long end_index, | |
| 315 enum IA2CoordinateType coordinate_type, | |
| 316 long x, long y) { | |
| 317 return E_NOTIMPL; | |
| 318 } | |
| 319 STDMETHODIMP get_newText(IA2TextSegment* new_text) { | |
| 320 return E_NOTIMPL; | |
| 321 } | |
| 322 STDMETHODIMP get_oldText(IA2TextSegment* old_text) { | |
| 323 return E_NOTIMPL; | |
| 324 } | |
| 325 | |
| 326 // | |
| 327 // IServiceProvider methods. | |
| 328 // | |
| 329 | |
| 330 STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void** object); | |
| 331 | |
| 332 // | |
| 333 // CComObjectRootEx methods. | |
| 334 // | |
| 335 | |
| 336 HRESULT WINAPI InternalQueryInterface(void* this_ptr, | |
| 337 const _ATL_INTMAP_ENTRY* entries, | |
| 338 REFIID iid, | |
| 339 void** object); | |
| 340 | |
| 341 private: | |
| 342 // Many MSAA methods take a var_id parameter indicating that the operation | |
| 343 // should be performed on a particular child ID, rather than this object. | |
| 344 // This method tries to figure out the target object from |var_id| and | |
| 345 // returns a pointer to the target object if it exists, otherwise NULL. | |
| 346 // Does not return a new reference. | |
| 347 BrowserAccessibility* GetTargetFromChildID(const VARIANT& var_id); | |
| 348 | |
| 349 // Initialize the role and state metadata from the role enum and state | |
| 350 // bitmasks defined in webkit/glue/webaccessibility.h. | |
| 351 void InitRoleAndState(LONG web_accessibility_role, | |
| 352 LONG web_accessibility_state); | |
| 353 | |
| 354 // Return true if this attribute is in the attributes map. | |
| 355 bool HasAttribute(WebAccessibility::Attribute attribute); | |
| 356 | |
| 357 // Retrieve the string value of an attribute from the attribute map and | |
| 358 // returns true if found. | |
| 359 bool GetAttribute(WebAccessibility::Attribute attribute, string16* value); | |
| 360 | |
| 361 // The manager of this tree of accessibility objects; needed for | |
| 362 // global operations like focus tracking. | |
| 363 BrowserAccessibilityManager* manager_; | |
| 364 // The parent of this object, may be NULL if we're the root object. | |
| 365 BrowserAccessibility* parent_; | |
| 366 // The ID of this object; globally unique within the browser process. | |
| 367 LONG child_id_; | |
| 368 // The index of this within its parent object. | |
| 369 LONG index_in_parent_; | |
| 370 // The ID of this object in the renderer process. | |
| 371 int32 renderer_id_; | |
| 372 | |
| 373 // The children of this object. | |
| 374 std::vector<BrowserAccessibility*> children_; | |
| 375 | |
| 376 // Accessibility metadata from the renderer, used to respond to MSAA | |
| 377 // events. | |
| 378 string16 name_; | |
| 379 string16 value_; | |
| 380 std::map<int32, string16> attributes_; | |
| 381 | |
| 382 LONG role_; | |
| 383 LONG state_; | |
| 384 string16 role_name_; | |
| 385 LONG ia2_role_; | |
| 386 LONG ia2_state_; | |
| 387 WebKit::WebRect location_; | |
| 388 | |
| 389 // COM objects are reference-counted. When we're done with this object | |
| 390 // and it's removed from our accessibility tree, a client may still be | |
| 391 // holding onto a pointer to this object, so we mark it as inactive | |
| 392 // so that calls to any of this object's methods immediately return | |
| 393 // failure. | |
| 394 bool instance_active_; | |
| 395 | |
| 396 DISALLOW_COPY_AND_ASSIGN(BrowserAccessibility); | |
| 397 }; | |
| 398 | |
| 399 #endif // CHROME_BROWSER_BROWSER_ACCESSIBILITY_H_ | |
| OLD | NEW |