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