1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/accessibility/browser_accessibility_win.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/string_number_conversions.h" 83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/string_util.h" 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 10731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "chrome/browser/accessibility/browser_accessibility_manager_win.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/escape.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing webkit_glue::WebAccessibility; 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// The GUID for the ISimpleDOM service is not defined in the IDL files. 1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// This is taken directly from the Mozilla sources 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// (accessible/src/msaa/nsAccessNodeWrap.cpp) and it's also documented at: 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// http://developer.mozilla.org/en/Accessibility/AT-APIs/ImplementationFeatures/MSAA 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenconst GUID GUID_ISimpleDOM = { 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0x0c539790, 0x12e4, 0x11cf, 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8}; 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 24731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// static 25731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserAccessibility* BrowserAccessibility::Create() { 26731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick CComObject<BrowserAccessibilityWin>* instance; 27731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance); 28731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(SUCCEEDED(hr)); 29731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return instance->NewReference(); 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserAccessibilityWin* BrowserAccessibility::toBrowserAccessibilityWin() { 33731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return static_cast<BrowserAccessibilityWin*>(this); 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserAccessibilityWin::BrowserAccessibilityWin() 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen : ia_role_(0), 384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ia_state_(0), 394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ia2_role_(0), 404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ia2_state_(0) { 413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 43731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserAccessibilityWin::~BrowserAccessibilityWin() { 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// IAccessible methods. 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Conventions: 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Always test for instance_active_ first and return E_FAIL if it's false. 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Always check for invalid arguments first, even if they're unused. 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// * Return S_FALSE if the only output is a string argument and it's empty. 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickHRESULT BrowserAccessibilityWin::accDoDefaultAction(VARIANT var_id) { 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch manager_->DoDefaultAction(*target); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenSTDMETHODIMP BrowserAccessibilityWin::accHitTest(LONG x_left, 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen LONG y_top, 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VARIANT* child) { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!child) 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 76513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch gfx::Point point(x_left, y_top); 77513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (!GetBoundsRect().Contains(point)) { 78513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Return S_FALSE and VT_EMPTY when the outside the object's boundaries. 79513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch child->vt = VT_EMPTY; 80513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return S_FALSE; 81513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 82513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 83513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch BrowserAccessibility* result = BrowserAccessibilityForPoint(point); 84513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (result == this) { 85513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Point is within this object. 86513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch child->vt = VT_I4; 87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch child->lVal = CHILDID_SELF; 88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } else { 89513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch child->vt = VT_DISPATCH; 90513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch child->pdispVal = result->toBrowserAccessibilityWin()->NewReference(); 91513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch } 92513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch return S_OK; 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 95731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, LONG* y_top, 96731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG* width, LONG* height, 97731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VARIANT var_id) { 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!x_left || !y_top || !width || !height) 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch gfx::Rect bounds = target->GetBoundsRect(); 109513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *x_left = bounds.x(); 110513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *y_top = bounds.y(); 111513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *width = bounds.width(); 112513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch *height = bounds.height(); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::accNavigate( 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LONG nav_dir, VARIANT start, VARIANT* end) { 119731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(start); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) && 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch start.lVal != CHILDID_SELF) { 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // MSAA states that navigating to first/last child can only be from self. 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch BrowserAccessibility* result = NULL; 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch switch (nav_dir) { 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NAVDIR_DOWN: 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NAVDIR_UP: 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NAVDIR_LEFT: 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NAVDIR_RIGHT: 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // These directions are not implemented, matching Mozilla and IE. 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_NOTIMPL; 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NAVDIR_FIRSTCHILD: 138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!target->children_.empty()) 139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen result = target->children_.front(); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NAVDIR_LASTCHILD: 142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (!target->children_.empty()) 143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen result = target->children_.back(); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NAVDIR_NEXT: 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result = target->GetNextSibling(); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case NAVDIR_PREVIOUS: 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch result = target->GetPreviousSibling(); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!result) { 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch end->vt = VT_EMPTY; 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_FALSE; 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch end->vt = VT_DISPATCH; 159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick end->pdispVal = result->toBrowserAccessibilityWin()->NewReference(); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 163731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child, 164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen IDispatch** disp_child) { 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!disp_child) 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *disp_child = NULL; 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 173731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_child); 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (*disp_child) = target->NewReference(); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 181731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accChildCount(LONG* child_count) { 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!child_count) 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *child_count = children_.size(); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 192731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accDefaultAction(VARIANT var_id, 193dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BSTR* def_action) { 194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!def_action) 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return target->GetAttributeAsBstr( 2053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WebAccessibility::ATTR_SHORTCUT, def_action); 206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 208731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accDescription(VARIANT var_id, 209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BSTR* desc) { 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!desc) 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 216731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return target->GetAttributeAsBstr(WebAccessibility::ATTR_DESCRIPTION, desc); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 223731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accFocus(VARIANT* focus_child) { 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!focus_child) 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* focus = static_cast<BrowserAccessibilityWin*>( 231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick manager_->GetFocus(this)); 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (focus == this) { 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_child->vt = VT_I4; 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_child->lVal = CHILDID_SELF; 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (focus == NULL) { 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_child->vt = VT_EMPTY; 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_child->vt = VT_DISPATCH; 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch focus_child->pdispVal = focus->NewReference(); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 245731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accHelp(VARIANT var_id, BSTR* help) { 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!help) 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return target->GetAttributeAsBstr(WebAccessibility::ATTR_HELP, help); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 259731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accKeyboardShortcut(VARIANT var_id, 260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen BSTR* acc_key) { 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!acc_key) 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return target->GetAttributeAsBstr(WebAccessibility::ATTR_SHORTCUT, acc_key); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 274731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) { 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!name) 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (target->name_.empty()) 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_FALSE; 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *name = SysAllocString(target->name_.c_str()); 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(*name); 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 294731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) { 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!disp_parent) 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IAccessible* parent = parent_->toBrowserAccessibilityWin(); 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (parent == NULL) { 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // This happens if we're the root of the tree; 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // return the IAccessible for the window. 305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick parent = manager_->toBrowserAccessibilityManagerWin()-> 306dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen GetParentWindowIAccessible(); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch parent->AddRef(); 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *disp_parent = parent; 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 314731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accRole( 315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VARIANT var_id, VARIANT* role) { 316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!role) 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 322731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target->role_name_.empty()) { 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch role->vt = VT_BSTR; 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch role->bstrVal = SysAllocString(target->role_name_.c_str()); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch role->vt = VT_I4; 331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick role->lVal = target->ia_role_; 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 336731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accState(VARIANT var_id, 337dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen VARIANT* state) { 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!state) 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch state->vt = VT_I4; 349731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick state->lVal = target->ia_state_; 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (manager_->GetFocus(NULL) == this) 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch state->lVal |= STATE_SYSTEM_FOCUSED; 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 356731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accValue( 357731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick VARIANT var_id, BSTR* value) { 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!value) 362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 364731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!target) 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *value = SysAllocString(target->value_.c_str()); 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(*value); 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 374731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accHelpTopic( 375731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BSTR* help_file, VARIANT var_id, LONG* topic_id) { 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_NOTIMPL; 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 379731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) { 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_NOTIMPL; 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 386731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::accSelect( 387731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG flags_sel, VARIANT var_id) { 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (flags_sel & SELFLAG_TAKEFOCUS) { 392ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen manager_->SetFocus(this, true); 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_FALSE; 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// IAccessible2 methods. 401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 403731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::role(LONG* role) { 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!role) 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *role = ia2_role_; 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 415731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_attributes(BSTR* attributes) { 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!attributes) 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Follow Firefox's convention, which is to return a set of key-value pairs 4233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // separated by semicolons, with a colon between the key and the value. 4243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 str; 4253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (unsigned int i = 0; i < html_attributes_.size(); i++) { 4263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (i != 0) 4273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick str += L';'; 4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick str += Escape(html_attributes_[i].first); 4293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick str += L':'; 4303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick str += Escape(html_attributes_[i].second); 4313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (str.empty()) 4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 4353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 4363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *attributes = SysAllocString(str.c_str()); 4373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(*attributes); 4383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 441731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_states(AccessibleStates* states) { 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!states) 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *states = ia2_state_; 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 453731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_uniqueID(LONG* unique_id) { 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!unique_id) 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *unique_id = child_id_; 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 464731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) { 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!window_handle) 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 471731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *window_handle = manager_->GetParentView(); 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 475731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) { 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!index_in_parent) 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *index_in_parent = index_in_parent_; 483c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// IAccessibleImage methods. 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 490731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_description(BSTR* desc) { 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!desc) 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 4973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return GetAttributeAsBstr(WebAccessibility::ATTR_DESCRIPTION, desc); 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 500731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_imagePosition( 501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick enum IA2CoordinateType coordinate_type, LONG* x, LONG* y) { 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!x || !y) 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 509731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick HWND parent_hwnd = manager_->GetParentView(); 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch POINT top_left = {0, 0}; 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ::ClientToScreen(parent_hwnd, &top_left); 512ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *x = location_.x() + top_left.x; 513ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *y = location_.y() + top_left.y; 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 515ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *x = location_.x(); 516ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *y = location_.y(); 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (parent_) { 518ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *x -= parent_->location().x(); 519ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *y -= parent_->location().y(); 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 528731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_imageSize(LONG* height, LONG* width) { 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!height || !width) 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 535ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *height = location_.height(); 536ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen *width = location_.width(); 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// IAccessibleText methods. 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 544731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!n_characters) 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 551731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 552731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *n_characters = value_.length(); 553731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 554731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *n_characters = name_.length(); 555731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 556731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 557731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return S_OK; 558731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 559731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 560731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) { 561731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!instance_active_) 562731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_FAIL; 563731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!offset) 565731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_INVALIDARG; 566731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 567731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 568731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int sel_start = 0; 569731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start)) { 570731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *offset = sel_start; 571731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 572731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *offset = 0; 573731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 574731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 575731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *offset = 0; 576731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 577731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 578731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return S_OK; 579731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 580731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 581731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) { 582731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!instance_active_) 583731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_FAIL; 584731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 585731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!n_selections) 586731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_INVALIDARG; 587731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 588731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 589731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int sel_start = 0; 590731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int sel_end = 0; 591731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) && 592731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_END, &sel_end) && 593731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick sel_start != sel_end) { 594731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *n_selections = 1; 595731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 596731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *n_selections = 0; 597731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 598731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 599731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *n_selections = 0; 600731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 601731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 605731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index, 606731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG* start_offset, 607731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG* end_offset) { 608731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!instance_active_) 609731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_FAIL; 610731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 611731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!start_offset || !end_offset || selection_index != 0) 612731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_INVALIDARG; 613731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 614731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 615731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int sel_start = 0; 616731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick int sel_end = 0; 617731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) && 618731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_END, &sel_end)) { 619731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *start_offset = sel_start; 620731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *end_offset = sel_end; 621731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 622731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *start_offset = 0; 623731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *end_offset = 0; 624731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 625731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 626731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *start_offset = 0; 627731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *end_offset = 0; 628731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 629731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 630731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return S_OK; 631731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 632731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 633731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_text( 634731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG start_offset, LONG end_offset, BSTR* text) { 635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!text) 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_INVALIDARG; 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 641731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const string16& text_str = TextForIAccessibleText(); 642731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 643731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The spec allows the arguments to be reversed. 644731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (start_offset > end_offset) { 645731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG tmp = start_offset; 646731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick start_offset = end_offset; 647731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick end_offset = tmp; 648731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 649731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 650731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The spec does not allow the start or end offsets to be out or range; 651731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // we must return an error if so. 652731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG len = text_str.length(); 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (start_offset < 0) 654731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_INVALIDARG; 655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (end_offset > len) 656731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_INVALIDARG; 657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 658731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick string16 substr = text_str.substr(start_offset, end_offset - start_offset); 6593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (substr.empty()) 6603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 6613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 6623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *text = SysAllocString(substr.c_str()); 6633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(*text); 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return S_OK; 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 667731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_textAtOffset( 668731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG offset, 669731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick enum IA2TextBoundaryType boundary_type, 670731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG* start_offset, LONG* end_offset, 671731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BSTR* text) { 6723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 6733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 6743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 675731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!start_offset || !end_offset || !text) 6763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 6773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 678731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The IAccessible2 spec says we don't have to implement the "sentence" 679731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // boundary type, we can just let the screenreader handle it. 680731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 681731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *start_offset = 0; 682731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *end_offset = 0; 683731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *text = NULL; 684731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return S_FALSE; 685731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 686731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 687731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const string16& text_str = TextForIAccessibleText(); 688731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 689731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *start_offset = FindBoundary(text_str, boundary_type, offset, -1); 690731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *end_offset = FindBoundary(text_str, boundary_type, offset, 1); 691731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return get_text(*start_offset, *end_offset, text); 692731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 693731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 694731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset( 695731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG offset, 696731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick enum IA2TextBoundaryType boundary_type, 697731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG* start_offset, LONG* end_offset, 698731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BSTR* text) { 699731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!instance_active_) 700731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_FAIL; 701731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 702731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!start_offset || !end_offset || !text) 703731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_INVALIDARG; 704731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 705731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The IAccessible2 spec says we don't have to implement the "sentence" 706731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // boundary type, we can just let the screenreader handle it. 707731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 708731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *start_offset = 0; 709731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *end_offset = 0; 710731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *text = NULL; 711731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return S_FALSE; 712731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 713731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 714731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const string16& text_str = TextForIAccessibleText(); 715731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 716731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *start_offset = FindBoundary(text_str, boundary_type, offset, -1); 717731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *end_offset = offset; 718731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return get_text(*start_offset, *end_offset, text); 719731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 720731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 721731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset( 722731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG offset, 723731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick enum IA2TextBoundaryType boundary_type, 724731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG* start_offset, LONG* end_offset, 725731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick BSTR* text) { 726731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!instance_active_) 727731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_FAIL; 728731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 729731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (!start_offset || !end_offset || !text) 730731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return E_INVALIDARG; 731731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 732731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // The IAccessible2 spec says we don't have to implement the "sentence" 733731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // boundary type, we can just let the screenreader handle it. 734731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 735731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *start_offset = 0; 736731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *end_offset = 0; 737731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *text = NULL; 738731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return S_FALSE; 739731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 740731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 741731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const string16& text_str = TextForIAccessibleText(); 742731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 743731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *start_offset = offset; 744731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *end_offset = FindBoundary(text_str, boundary_type, offset, 1); 745731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return get_text(*start_offset, *end_offset, text); 746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 747c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 7493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// ISimpleDOMDocument methods. 7503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 7513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 752731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) { 7533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 7543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 7553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!url) 7573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 7583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return GetAttributeAsBstr(WebAccessibility::ATTR_DOC_URL, url); 7603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 7613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 762731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_title(BSTR* title) { 7633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 7643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 7653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!title) 7673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 7683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return GetAttributeAsBstr(WebAccessibility::ATTR_DOC_TITLE, title); 7703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 7713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 772731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_mimeType(BSTR* mime_type) { 7733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 7743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 7753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!mime_type) 7773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 7783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return GetAttributeAsBstr(WebAccessibility::ATTR_DOC_MIMETYPE, mime_type); 7803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 7813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 782731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_docType(BSTR* doc_type) { 7833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 7843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 7853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!doc_type) 7873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 7883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return GetAttributeAsBstr(WebAccessibility::ATTR_DOC_DOCTYPE, doc_type); 7903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 7913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 7923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 7933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// ISimpleDOMNode methods. 7943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 7953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 796731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_nodeInfo( 7973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR* node_name, 7983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick short* name_space_id, 7993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR* node_value, 8003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned int* num_children, 8013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned int* unique_id, 8023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned short* node_type) { 8033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 8043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 8053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!node_name || !name_space_id || !node_value || !num_children || 8073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !unique_id || !node_type) { 8083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 8093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 tag; 8123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (GetAttribute(WebAccessibility::ATTR_HTML_TAG, &tag)) 8133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node_name = SysAllocString(tag.c_str()); 8143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick else 8153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node_name = NULL; 8163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *name_space_id = 0; 8183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node_value = SysAllocString(value_.c_str()); 8193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *num_children = children_.size(); 8203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *unique_id = child_id_; 8213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 822731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (ia_role_ == ROLE_SYSTEM_DOCUMENT) { 8233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node_type = NODETYPE_DOCUMENT; 824731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else if (ia_role_ == ROLE_SYSTEM_TEXT && 8253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ((ia2_state_ & IA2_STATE_EDITABLE) == 0)) { 8263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node_type = NODETYPE_TEXT; 8273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 8283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node_type = NODETYPE_ELEMENT; 8293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 8323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 834731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_attributes( 8353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned short max_attribs, 8363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR* attrib_names, 8373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick short* name_space_id, 8383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR* attrib_values, 8393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned short* num_attribs) { 8403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 8413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 8423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!attrib_names || !name_space_id || !attrib_values || !num_attribs) 8443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 8453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *num_attribs = max_attribs; 8473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (*num_attribs > html_attributes_.size()) 8483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *num_attribs = html_attributes_.size(); 8493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (unsigned short i = 0; i < *num_attribs; ++i) { 8513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick attrib_names[i] = SysAllocString(html_attributes_[i].first.c_str()); 8523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick name_space_id[i] = 0; 8533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick attrib_values[i] = SysAllocString(html_attributes_[i].second.c_str()); 8543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 8563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 858731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_attributesForNames( 8593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned short num_attribs, 8603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR* attrib_names, 8613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick short* name_space_id, 8623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR* attrib_values) { 8633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 8643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 8653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!attrib_names || !name_space_id || !attrib_values) 8673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 8683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (unsigned short i = 0; i < num_attribs; ++i) { 8703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick name_space_id[i] = 0; 8713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick bool found = false; 8723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 name = (LPCWSTR)attrib_names[i]; 8733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (unsigned int j = 0; j < html_attributes_.size(); ++j) { 8743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (html_attributes_[j].first == name) { 8753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick attrib_values[i] = SysAllocString(html_attributes_[j].second.c_str()); 8763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick found = true; 8773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick break; 8783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!found) { 8813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick attrib_values[i] = NULL; 8823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 8843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 8853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 8863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 887731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_computedStyle( 8883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned short max_style_properties, 8893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick boolean use_alternate_view, 8903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR *style_properties, 8913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR *style_values, 8923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned short *num_style_properties) { 8933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 8943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 8953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!style_properties || !style_values) 8973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 8983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 8993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // We only cache a single style property for now: DISPLAY 9003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9013345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (max_style_properties == 0 || 9023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick !HasAttribute(WebAccessibility::ATTR_DISPLAY)) { 9033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *num_style_properties = 0; 9043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 9053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 9063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 display; 9083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GetAttribute(WebAccessibility::ATTR_DISPLAY, &display); 9093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *num_style_properties = 1; 9103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick style_properties[0] = SysAllocString(L"display"); 9113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick style_values[0] = SysAllocString(display.c_str()); 9123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 9143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 916731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_computedStyleForProperties( 9173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned short num_style_properties, 9183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick boolean use_alternate_view, 9193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR* style_properties, 9203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick BSTR* style_values) { 9213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 9223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 9233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!style_properties || !style_values) 9253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 9263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // We only cache a single style property for now: DISPLAY 9283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick for (unsigned short i = 0; i < num_style_properties; i++) { 9303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 name = (LPCWSTR)style_properties[i]; 9313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick StringToLowerASCII(&name); 9323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (name == L"display") { 9333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 display; 9343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick GetAttribute(WebAccessibility::ATTR_DISPLAY, &display); 9353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick style_values[i] = SysAllocString(display.c_str()); 9363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 9373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick style_values[i] = NULL; 9383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 9393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 9403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 9423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 944731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) { 9453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_NOTIMPL; 9463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 948731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { 9493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 9503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 9513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!node) 9533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 9543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 955731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *node = parent_->toBrowserAccessibilityWin()->NewReference(); 9563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 9573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 959731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) { 9603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 9613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 9623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!node) 9643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 9653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (children_.size()) { 967731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *node = children_[0]->toBrowserAccessibilityWin()->NewReference(); 9683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 9693345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 9703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node = NULL; 9713345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 9723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 9733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 975731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) { 9763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 9773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 9783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!node) 9803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 9813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (children_.size()) { 983731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *node = children_[children_.size() - 1]->toBrowserAccessibilityWin()-> 984731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NewReference(); 9853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 9863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 9873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node = NULL; 9883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 9893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 9903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 9913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 992731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_previousSibling( 9933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ISimpleDOMNode** node) { 9943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 9953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 9963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 9973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!node) 9983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 9993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (parent_ && index_in_parent_ > 0) { 1001731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *node = parent_->children()[index_in_parent_ - 1]-> 1002731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick toBrowserAccessibilityWin()->NewReference(); 10033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 10043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 10053345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node = NULL; 10063345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 10073345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 10083345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 10093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1010731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) { 10113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 10123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 10133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!node) 10153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 10163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (parent_ && 10183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick index_in_parent_ >= 0 && 1019731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick index_in_parent_ < static_cast<int>(parent_->children().size()) - 1) { 1020731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *node = parent_->children()[index_in_parent_ + 1]-> 1021731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick toBrowserAccessibilityWin()->NewReference(); 10223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 10233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 10243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node = NULL; 10253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 10263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 10273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 10283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1029731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_childAt( 10303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick unsigned int child_index, 10313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ISimpleDOMNode** node) { 10323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 10333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 10343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!node) 10363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 10373345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (child_index < children_.size()) { 1039731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick *node = children_[child_index]->toBrowserAccessibilityWin()->NewReference(); 10403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 10413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else { 10423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *node = NULL; 10433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 10443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 10453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 10463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 10483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// ISimpleDOMText methods. 10493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 10503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1051731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) { 10523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!instance_active_) 10533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_FAIL; 10543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!dom_text) 10563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_INVALIDARG; 10573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (name_.empty()) 10593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 10603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *dom_text = SysAllocString(name_.c_str()); 10623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(*dom_text); 10633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 10643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 10653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10663345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// 1067c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// IServiceProvider methods. 1068c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 1069c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1070731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickSTDMETHODIMP BrowserAccessibilityWin::QueryService( 1071c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch REFGUID guidService, REFIID riid, void** object) { 1072c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!instance_active_) 1073c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 1074c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 10753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (guidService == IID_IAccessible || 10763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick guidService == IID_IAccessible2 || 10773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick guidService == IID_IAccessibleImage || 10783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick guidService == IID_IAccessibleText || 10793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick guidService == IID_ISimpleDOMDocument || 10803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick guidService == IID_ISimpleDOMNode || 108172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen guidService == IID_ISimpleDOMText || 108272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen guidService == GUID_ISimpleDOM) { 1083c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return QueryInterface(riid, object); 10843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1085c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1086c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *object = NULL; 1087c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_FAIL; 1088c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1089c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1090c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 1091c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// CComObjectRootEx methods. 1092c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 1093c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1094731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickHRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface( 1095c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void* this_ptr, 1096c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const _ATL_INTMAP_ENTRY* entries, 1097c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch REFIID iid, 1098c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void** object) { 1099c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (iid == IID_IAccessibleText) { 1100731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (ia_role_ != ROLE_SYSTEM_LINK && ia_role_ != ROLE_SYSTEM_TEXT) { 1101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *object = NULL; 1102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_NOINTERFACE; 1103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else if (iid == IID_IAccessibleImage) { 1105731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (ia_role_ != ROLE_SYSTEM_GRAPHIC) { 1106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch *object = NULL; 1107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return E_NOINTERFACE; 1108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 11093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } else if (iid == IID_ISimpleDOMDocument) { 1110731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (ia_role_ != ROLE_SYSTEM_DOCUMENT) { 11113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *object = NULL; 11123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return E_NOINTERFACE; 11133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 1114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return CComObjectRootBase::InternalQueryInterface( 1117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch this_ptr, entries, iid, object); 1118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 1121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Private methods. 1122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 1123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1124731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Initialize this object and mark it as active. 1125731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid BrowserAccessibilityWin::Initialize() { 1126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen BrowserAccessibility::Initialize(); 1127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 1128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick InitRoleAndState(); 1129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Expose headings levels to NVDA with the "level" object attribute. 1131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (role_ == WebAccessibility::ROLE_HEADING && role_name_.size() == 2 && 1132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IsAsciiDigit(role_name_[1])) { 1133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick html_attributes_.push_back(std::make_pair(L"level", role_name_.substr(1))); 1134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1135731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1136513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch // Expose the "display" object attribute. 1137513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch string16 display; 1138513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch if (GetAttribute(WebAccessibility::ATTR_DISPLAY, &display)) 1139513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch html_attributes_.push_back(std::make_pair(L"display", display)); 1140513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch 114172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // If this is static text, put the text in the name rather than the value. 114272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (role_ == WebAccessibility::ROLE_STATIC_TEXT && name_.empty()) 114372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen name_.swap(value_); 114472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1145731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // If this object doesn't have a name but it does have a description, 1146731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // use the description as its name - because some screen readers only 1147731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // announce the name. 114872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (name_.empty() && HasAttribute(WebAccessibility::ATTR_DESCRIPTION)) 1149731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick GetAttribute(WebAccessibility::ATTR_DESCRIPTION, &name_); 1150731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1151731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1152ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BrowserAccessibilityWin::NativeAddReference() { 1153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddRef(); 1154731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1155731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1156ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenvoid BrowserAccessibilityWin::NativeReleaseReference() { 1157731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick Release(); 1158731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1159731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1160731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() { 1161731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AddRef(); 1162731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return this; 1163731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1164731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1165731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickBrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID( 1166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const VARIANT& var_id) { 1167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (var_id.vt != VT_I4) 1168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return NULL; 1169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch LONG child_id = var_id.lVal; 1171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (child_id == CHILDID_SELF) 1172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return this; 1173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (child_id >= 1 && child_id <= static_cast<LONG>(children_.size())) 1175731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return children_[child_id - 1]->toBrowserAccessibilityWin(); 1176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1177731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return manager_->GetFromChildID(child_id)->toBrowserAccessibilityWin(); 1178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1180731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickHRESULT BrowserAccessibilityWin::GetAttributeAsBstr( 11813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick WebAccessibility::Attribute attribute, BSTR* value_bstr) { 11823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick string16 str; 11833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (!GetAttribute(attribute, &str)) 11853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 11863345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick if (str.empty()) 11883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_FALSE; 11893345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11903345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick *value_bstr = SysAllocString(str.c_str()); 11913345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick DCHECK(*value_bstr); 11923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 11933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return S_OK; 11943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 11953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenstring16 BrowserAccessibilityWin::Escape(const string16& str) { 1197731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return EscapeQueryParamValueUTF8(str, false); 1198731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1199731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1200731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickconst string16& BrowserAccessibilityWin::TextForIAccessibleText() { 1201731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (role_ == WebAccessibility::ROLE_TEXT_FIELD) { 1202731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return value_; 1203731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 1204731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return name_; 1205731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1206731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 1207731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1208731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickLONG BrowserAccessibilityWin::FindBoundary( 1209731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick const string16& text, 1210731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick IA2TextBoundaryType boundary, 1211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG start_offset, 1212731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG direction) { 1213731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG text_size = static_cast<LONG>(text.size()); 1214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DCHECK((start_offset >= 0 && start_offset <= text_size) || 1215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen start_offset == IA2_TEXT_OFFSET_LENGTH || 1216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen start_offset == IA2_TEXT_OFFSET_CARET); 1217731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(direction == 1 || direction == -1); 1218731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen if (start_offset == IA2_TEXT_OFFSET_LENGTH) { 1220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen start_offset = text_size; 1221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } else if (start_offset == IA2_TEXT_OFFSET_CARET) { 1222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen get_caretOffset(&start_offset); 1223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 1224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 1225731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (boundary == IA2_TEXT_BOUNDARY_CHAR) { 1226731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (direction == 1 && start_offset < text_size) 1227731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return start_offset + 1; 1228731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick else 1229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return start_offset; 1230731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1231731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG result = start_offset; 1233731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick for (;;) { 1234731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick LONG pos; 1235731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (direction == 1) { 1236731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (result >= text_size) 1237731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return text_size; 1238731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick pos = result; 1239731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 1240731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (result <= 0) 1241731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return 0; 1242731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick pos = result - 1; 1243731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1244731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1245731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (boundary) { 1246731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IA2_TEXT_BOUNDARY_WORD: 1247731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (IsWhitespace(text[pos])) 1248731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return result; 1249731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 1250731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IA2_TEXT_BOUNDARY_LINE: 1251731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IA2_TEXT_BOUNDARY_PARAGRAPH: 1252731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (text[pos] == '\n') 1253731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return result; 1254731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IA2_TEXT_BOUNDARY_SENTENCE: 1255731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Note that we don't actually have to implement sentence support; 1256731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // currently IAccessibleText functions return S_FALSE so that 1257731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // screenreaders will handle it on their own. 1258731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((text[pos] == '.' || text[pos] == '!' || text[pos] == '?') && 1259731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick (pos == text_size - 1 || IsWhitespace(text[pos + 1]))) { 1260731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return result; 1261731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1262731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick case IA2_TEXT_BOUNDARY_ALL: 1263731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick default: 1264731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick break; 1265731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1266731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 1267731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (direction > 0) { 1268731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick result++; 1269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else if (direction < 0) { 1270731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick result--; 1271731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } else { 1272731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick NOTREACHED(); 1273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return result; 1274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 1275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 12763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 12773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 1278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid BrowserAccessibilityWin::InitRoleAndState() { 1279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_ = 0; 1280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_state_ = IA2_STATE_OPAQUE; 1281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_CHECKED) & 1) 1283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_ |= STATE_SYSTEM_CHECKED; 1284731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_COLLAPSED) & 1) 1285731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_COLLAPSED; 1286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_EXPANDED) & 1) 1287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_EXPANDED; 1288731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_FOCUSABLE) & 1) 1289731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_FOCUSABLE; 1290731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_HASPOPUP) & 1) 1291731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_HASPOPUP; 1292731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_HOTTRACKED) & 1) 1293731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_HOTTRACKED; 1294731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_INDETERMINATE) & 1) 1295731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_INDETERMINATE; 1296731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_INVISIBLE) & 1) 1297731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_INVISIBLE; 1298731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_LINKED) & 1) 1299731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_LINKED; 1300731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_MULTISELECTABLE) & 1) 1301731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_MULTISELECTABLE; 13023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect. 1303731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_OFFSCREEN) & 1) 1304731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_OFFSCREEN; 1305731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_PRESSED) & 1) 1306731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_PRESSED; 1307731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_PROTECTED) & 1) 1308731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_PROTECTED; 1309731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_SELECTABLE) & 1) 1310731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_SELECTABLE; 1311731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_SELECTED) & 1) 1312731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_SELECTED; 1313731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_READONLY) & 1) 1314731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_READONLY; 1315731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_TRAVERSED) & 1) 1316731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_TRAVERSED; 1317731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_BUSY) & 1) 1318731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_BUSY; 1319731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if ((state_ >> WebAccessibility::STATE_UNAVAILABLE) & 1) 1320731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_UNAVAILABLE; 1321731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 132272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen string16 html_tag; 132372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GetAttribute(WebAccessibility::ATTR_HTML_TAG, &html_tag); 1324731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = 0; 1325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = 0; 1326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick switch (role_) { 1327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_ALERT: 1328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_ALERT_DIALOG: 1329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_ALERT; 1330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_APPLICATION: 1332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_APPLICATION; 1333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_ARTICLE: 1335731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_GROUPING; 1336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_SECTION; 1337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 133872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebAccessibility::ROLE_BUSY_INDICATOR: 133972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ia_role_ = ROLE_SYSTEM_ANIMATION; 134072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 1341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_BUTTON: 1342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 1343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_CELL: 1345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_CELL; 1346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_CHECKBOX: 1348731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_CHECKBUTTON; 1349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_COLOR_WELL: 1351731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_CLIENT; 1352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_COLOR_CHOOSER; 1353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_COLUMN: 1355731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_COLUMN; 1356c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_COLUMN_HEADER: 1358731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_COLUMNHEADER; 1359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_COMBO_BOX: 1361731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_COMBOBOX; 1362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION: 136472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen role_name_ = html_tag; 1365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_PARAGRAPH; 1366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_DEFINITION_LIST_TERM: 1368731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_LISTITEM; 1369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_DIALOG: 1371731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_DIALOG; 1372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 137372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebAccessibility::ROLE_DISCLOSURE_TRIANGLE: 137472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ia_role_ = ROLE_SYSTEM_OUTLINEBUTTON; 137572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 1376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_DOCUMENT: 1377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_WEB_AREA: 1378731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_DOCUMENT; 1379731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_READONLY; 1380731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_FOCUSABLE; 1381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_EDITABLE_TEXT: 1383731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_TEXT; 1384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_state_ |= IA2_STATE_SINGLE_LINE; 1385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_state_ |= IA2_STATE_EDITABLE; 1386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_GRID: 1388731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_TABLE; 1389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_GROUP: 139172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (html_tag == L"li") { 139272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ia_role_ = ROLE_SYSTEM_LISTITEM; 139372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } else { 139472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (html_tag.empty()) 139572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen role_name_ = L"div"; 139672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen else 139772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen role_name_ = html_tag; 139872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ia2_role_ = IA2_ROLE_SECTION; 139972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 140072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 140172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebAccessibility::ROLE_GROW_AREA: 140272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ia_role_ = ROLE_SYSTEM_GRIP; 1403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_HEADING: 140572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen role_name_ = html_tag; 1406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_HEADING; 1407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_IMAGE: 1409731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_GRAPHIC; 1410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_IMAGE_MAP: 141272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen role_name_ = html_tag; 1413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_IMAGE_MAP; 1414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_IMAGE_MAP_LINK: 1416731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_LINK; 1417731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_LINKED; 1418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LANDMARK_APPLICATION: 1420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LANDMARK_BANNER: 1421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY: 1422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LANDMARK_CONTENTINFO: 1423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LANDMARK_MAIN: 1424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LANDMARK_NAVIGATION: 1425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LANDMARK_SEARCH: 1426731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_GROUPING; 1427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_SECTION; 1428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LINK: 1430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_WEBCORE_LINK: 1431731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_LINK; 1432731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_state_|= STATE_SYSTEM_LINKED; 1433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LIST: 1435731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_LIST; 1436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LISTBOX: 1438731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_LIST; 1439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LISTBOX_OPTION: 1441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LIST_ITEM: 1442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LIST_MARKER: 1443731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_LISTITEM; 1444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 144572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebAccessibility::ROLE_MATH: 144672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ia_role_ = ROLE_SYSTEM_EQUATION; 144772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 1448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_MENU: 1449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_MENU_BUTTON: 1450731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_MENUPOPUP; 1451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_MENU_BAR: 1453731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_MENUBAR; 1454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_MENU_ITEM: 1456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_MENU_LIST_OPTION: 1457731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_MENUITEM; 1458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_MENU_LIST_POPUP: 1460731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_MENUPOPUP; 1461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_NOTE: 1463731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_GROUPING; 1464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_NOTE; 1465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_OUTLINE: 1467731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_OUTLINE; 1468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_POPUP_BUTTON: 1470731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_COMBOBOX; 1471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_PROGRESS_INDICATOR: 1473731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_PROGRESSBAR; 1474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_RADIO_BUTTON: 1476731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_RADIOBUTTON; 1477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_RADIO_GROUP: 1479731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_GROUPING; 1480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_SECTION; 1481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_REGION: 1483731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_GROUPING; 1484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_SECTION; 1485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_ROW: 1487731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_ROW; 1488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_ROW_HEADER: 1490731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_ROWHEADER; 1491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_RULER: 1493731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_CLIENT; 1494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_RULER; 1495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_SCROLLAREA: 1497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_CLIENT; 1498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_SCROLL_PANE; 1499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_SCROLLBAR: 1501731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_SCROLLBAR; 1502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_SLIDER: 1504731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_SLIDER; 1505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_SPLIT_GROUP: 1507731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_CLIENT; 1508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_SPLIT_PANE; 1509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_ANNOTATION: 1511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_STATIC_TEXT: 1512731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_TEXT; 1513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_STATUS: 1515731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_STATUSBAR; 1516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 151772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebAccessibility::ROLE_SPLITTER: 151872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ia_role_ = ROLE_SYSTEM_SEPARATOR; 151972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 1520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TAB: 1521731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_PAGETAB; 1522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TABLE: 1524731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_TABLE; 1525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TABLE_HEADER_CONTAINER: 1527731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_GROUPING; 1528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_role_ = IA2_ROLE_SECTION; 1529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TAB_GROUP: 1531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TAB_LIST: 1532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TAB_PANEL: 1533731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_PAGETABLIST; 1534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TEXTAREA: 1536731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_TEXT; 1537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_state_ |= IA2_STATE_MULTI_LINE; 1538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_state_ |= IA2_STATE_EDITABLE; 1539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TEXT_FIELD: 1541731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_TEXT; 1542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_state_ |= IA2_STATE_SINGLE_LINE; 1543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ia2_state_ |= IA2_STATE_EDITABLE; 1544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 154572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case WebAccessibility::ROLE_TIMER: 154672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ia_role_ = ROLE_SYSTEM_CLOCK; 154772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 1548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TOOLBAR: 1549731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_TOOLBAR; 1550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TOOLTIP: 1552731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_TOOLTIP; 1553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TREE: 1555731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_OUTLINE; 1556c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TREE_GRID: 1558731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_OUTLINE; 1559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1560c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_TREE_ITEM: 1561731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_OUTLINEITEM; 1562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_WINDOW: 1564731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_WINDOW; 1565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // TODO(dmazzoni): figure out the proper MSAA role for all of these. 1568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_BROWSER: 1569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_DIRECTORY: 1570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_DRAWER: 1571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_HELP_TAG: 1572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_IGNORED: 1573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_INCREMENTOR: 1574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_LOG: 1575c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_MARQUEE: 1576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_MATTE: 1577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_RULER_MARKER: 1578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_SHEET: 1579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_SLIDER_THUMB: 1580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_SYSTEM_WIDE: 1581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch case WebAccessibility::ROLE_VALUE_INDICATOR: 1582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch default: 1583731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia_role_ = ROLE_SYSTEM_CLIENT; 1584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch break; 1585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 1586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The role should always be set. 1588731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(!role_name_.empty() || ia_role_); 1589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1590c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // If we didn't explicitly set the IAccessible2 role, make it the same 1591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // as the MSAA role. 1592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (!ia2_role_) 1593731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick ia2_role_ = ia_role_; 1594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 1595