browser_accessibility_win.cc revision 513209b27ff55e2841eac0e4120199c23acce758
159907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner// Copyright (c) 2010 The Chromium Authors. All rights reserved.
259907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner// Use of this source code is governed by a BSD-style license that can be
359907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner// found in the LICENSE file.
459907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner#include "chrome/browser/accessibility/browser_accessibility_win.h"
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner
759907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner#include "base/string_number_conversions.h"
859907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner#include "base/string_util.h"
959907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner#include "base/utf_string_conversions.h"
101eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump#include "chrome/browser/accessibility/browser_accessibility_manager_win.h"
1159907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner#include "net/base/escape.h"
1259907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner
1359907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattnerusing webkit_glue::WebAccessibility;
1459907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner
152d88708cbe4e4ec5e04e4acb6bd7f5be68557379John McCall// static
1659907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris LattnerBrowserAccessibility* BrowserAccessibility::Create() {
17199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck  CComObject<BrowserAccessibilityWin>* instance;
18384aff8b94bb0d1ad6c5667b90621e5699815bb2John McCall  HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance);
19c4a1dea2dc56bd1357ec91b829a0b9e68229a13eDaniel Dunbar  DCHECK(SUCCEEDED(hr));
2055fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth  return instance->NewReference();
21be0ee875d8a91c031a085cbbd73ad9e8dc1aa8ffDavid Blaikie}
222324512285caac0332bbbc6e4cab6245d2a370a1Ted Kremenek
237ff22b259d4d4729f701679e3a7f0e242365e07fTed KremenekBrowserAccessibilityWin* BrowserAccessibility::toBrowserAccessibilityWin() {
24f8c4921c73d73123e2b79221ad4f1775ce984cfdMike Stump  return static_cast<BrowserAccessibilityWin*>(this);
25f8c4921c73d73123e2b79221ad4f1775ce984cfdMike Stump}
2655fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth
273f6f51e28231f65de9c2dd150a2d757b2162cfa3Jordan RoseBrowserAccessibilityWin::BrowserAccessibilityWin()
2855fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth    : instance_active_(false) {
2955fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth}
3059907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner
3155fc873017f10f6f566b182b70f6fc22aefa3464Chandler CarruthBrowserAccessibilityWin::~BrowserAccessibilityWin() {
3255fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth  ReleaseTree();
3355fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth}
3455fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth
35f8c4921c73d73123e2b79221ad4f1775ce984cfdMike Stump//
36f8c4921c73d73123e2b79221ad4f1775ce984cfdMike Stump// IAccessible methods.
3755fc873017f10f6f566b182b70f6fc22aefa3464Chandler Carruth//
38cb5620c9b213f4bd323912159fdddda35e258a14Dmitri Gribenko// Conventions:
393bfc5f49e0e37e235bb0d33bcbcb36af9d1f84abTom Care// * Always test for instance_active_ first and return E_FAIL if it's false.
40a1f3dba77b7418575c1ff539ffa74ebaa068280cZhongxing Xu// * Always check for invalid arguments first, even if they're unused.
4159907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner// * Return S_FALSE if the only output is a string argument and it's empty.
42781472fe99a120098c631b0cbe33c89f8cef5e70John McCall//
4359907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner
4460800081361b0ffc114877b8abbc81cb57b4edf6Chris LattnerHRESULT BrowserAccessibilityWin::accDoDefaultAction(VARIANT var_id) {
4560800081361b0ffc114877b8abbc81cb57b4edf6Chris Lattner  if (!instance_active_)
4608f92e3a5dead1f1ee656678a7f06e43279d6e50Chris Lattner    return E_FAIL;
474e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie
4860800081361b0ffc114877b8abbc81cb57b4edf6Chris Lattner  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
4960800081361b0ffc114877b8abbc81cb57b4edf6Chris Lattner  if (!target)
508e10f3b9cc1db43645bbc2999eb163af8997d468John McCall    return E_INVALIDARG;
518e10f3b9cc1db43645bbc2999eb163af8997d468John McCall
528e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  manager_->DoDefaultAction(*target);
538e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  return S_OK;
548e10f3b9cc1db43645bbc2999eb163af8997d468John McCall}
558e10f3b9cc1db43645bbc2999eb163af8997d468John McCall
568e10f3b9cc1db43645bbc2999eb163af8997d468John McCallSTDMETHODIMP BrowserAccessibilityWin::accHitTest(
578e10f3b9cc1db43645bbc2999eb163af8997d468John McCall    LONG x_left, LONG y_top, VARIANT* child) {
588e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  if (!instance_active_)
598e10f3b9cc1db43645bbc2999eb163af8997d468John McCall    return E_FAIL;
608e10f3b9cc1db43645bbc2999eb163af8997d468John McCall
618e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  if (!child)
628e10f3b9cc1db43645bbc2999eb163af8997d468John McCall    return E_INVALIDARG;
638e10f3b9cc1db43645bbc2999eb163af8997d468John McCall
648e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  gfx::Point point(x_left, y_top);
658e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  if (!GetBoundsRect().Contains(point)) {
668e10f3b9cc1db43645bbc2999eb163af8997d468John McCall    // Return S_FALSE and VT_EMPTY when the outside the object's boundaries.
678e10f3b9cc1db43645bbc2999eb163af8997d468John McCall    child->vt = VT_EMPTY;
688e10f3b9cc1db43645bbc2999eb163af8997d468John McCall    return S_FALSE;
698e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  }
70e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge
71e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge  BrowserAccessibility* result = BrowserAccessibilityForPoint(point);
72e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge  if (result == this) {
73e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge    // Point is within this object.
74e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge    child->vt = VT_I4;
75e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge    child->lVal = CHILDID_SELF;
76e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge  } else {
77e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge    child->vt = VT_DISPATCH;
78e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge    child->pdispVal = result->toBrowserAccessibilityWin()->NewReference();
79e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge  }
80e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge  return S_OK;
81e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge}
82e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge
83e59392176c2369df2bdd11b7786cb38abac00198Julien LerougeSTDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, LONG* y_top,
84e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge                                                  LONG* width, LONG* height,
85e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge                                                  VARIANT var_id) {
86e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge  if (!instance_active_)
87e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge    return E_FAIL;
8877f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge
89e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge  if (!x_left || !y_top || !width || !height)
90e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge    return E_INVALIDARG;
9177f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge
9277f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
93e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge  if (!target)
94e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge    return E_INVALIDARG;
9577f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge
9677f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  gfx::Rect bounds = target->GetBoundsRect();
9777f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  *x_left = bounds.x();
985154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  *y_top  = bounds.y();
995154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  *width  = bounds.width();
1005154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  *height = bounds.height();
1015154dce6388e3aaa445467030df7a45ed1211abeRichard Smith
1025154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  return S_OK;
1035154dce6388e3aaa445467030df7a45ed1211abeRichard Smith}
1045154dce6388e3aaa445467030df7a45ed1211abeRichard Smith
1055154dce6388e3aaa445467030df7a45ed1211abeRichard SmithSTDMETHODIMP BrowserAccessibilityWin::accNavigate(
1065154dce6388e3aaa445467030df7a45ed1211abeRichard Smith    LONG nav_dir, VARIANT start, VARIANT* end) {
1075154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  BrowserAccessibilityWin* target = GetTargetFromChildID(start);
1085154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  if (!target)
1095154dce6388e3aaa445467030df7a45ed1211abeRichard Smith    return E_INVALIDARG;
1105154dce6388e3aaa445467030df7a45ed1211abeRichard Smith
1115154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) &&
1125154dce6388e3aaa445467030df7a45ed1211abeRichard Smith      start.lVal != CHILDID_SELF) {
1135154dce6388e3aaa445467030df7a45ed1211abeRichard Smith    // MSAA states that navigating to first/last child can only be from self.
11460d7b3a319d84d688752be3870615ac0f111fb16John McCall    return E_INVALIDARG;
115d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  }
11660d7b3a319d84d688752be3870615ac0f111fb16John McCall
1172def48394f6d48bde0dec2b514193c2b533265b5Douglas Gregor  BrowserAccessibility* result = NULL;
118946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner  switch (nav_dir) {
119946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner    case NAVDIR_DOWN:
120946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner    case NAVDIR_UP:
121946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner    case NAVDIR_LEFT:
122946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner    case NAVDIR_RIGHT:
123946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner      // These directions are not implemented, matching Mozilla and IE.
124946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner      return E_NOTIMPL;
125946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner    case NAVDIR_FIRSTCHILD:
126946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner      if (target->children_.size() > 0)
127946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner        result = target->children_[0];
128946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner      break;
129946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner    case NAVDIR_LASTCHILD:
130946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner      if (target->children_.size() > 0)
131946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner        result = target->children_[target->children_.size() - 1];
132946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner      break;
133946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner    case NAVDIR_NEXT:
134946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner      result = target->GetNextSibling();
135946928f48c96bddf3cfa126862f5ab69c2d904a0Chris Lattner      break;
136d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson    case NAVDIR_PREVIOUS:
13730ce344307f8a8b00054021307015571f83c7364Chris Lattner      result = target->GetPreviousSibling();
138925e60d3fa706f31886027c876989af79eb0e0d2Chris Lattner      break;
1391b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner  }
140690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner
1410eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl  if (!result) {
142d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson    end->vt = VT_EMPTY;
14349ff7a1c8c67d56e62d3b4627463b705c0d5008cTed Kremenek    return S_FALSE;
14430ce344307f8a8b00054021307015571f83c7364Chris Lattner  }
1450eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl
1460eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl  end->vt = VT_DISPATCH;
147d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  end->pdispVal = result->toBrowserAccessibilityWin()->NewReference();
1481b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner  return S_OK;
1491b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner}
1501b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner
1511b9a0793955070738cac6f04b5abe9496be9b317Chris LattnerSTDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child,
1521b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner                                                IDispatch** disp_child) {
1531b9a0793955070738cac6f04b5abe9496be9b317Chris Lattner  if (!instance_active_)
1540eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl    return E_FAIL;
1550eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl
156d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  if (!disp_child)
157e771a7ac11fb27f0e734e5de4d858f2c268895e5Benjamin Kramer    return E_INVALIDARG;
158e771a7ac11fb27f0e734e5de4d858f2c268895e5Benjamin Kramer
159e771a7ac11fb27f0e734e5de4d858f2c268895e5Benjamin Kramer  *disp_child = NULL;
160e771a7ac11fb27f0e734e5de4d858f2c268895e5Benjamin Kramer
1619ac6f62a77be5b281a7ddc24a16669b457ac47c2Eli Friedman  BrowserAccessibilityWin* target = GetTargetFromChildID(var_child);
1629ac6f62a77be5b281a7ddc24a16669b457ac47c2Eli Friedman  if (!target)
1639ac6f62a77be5b281a7ddc24a16669b457ac47c2Eli Friedman    return E_INVALIDARG;
1649ac6f62a77be5b281a7ddc24a16669b457ac47c2Eli Friedman
1659ac6f62a77be5b281a7ddc24a16669b457ac47c2Eli Friedman  (*disp_child) = target->NewReference();
1663b1e26b708e8d00d4ba10ff857201bae2aff6baeBenjamin Kramer  return S_OK;
1679ac6f62a77be5b281a7ddc24a16669b457ac47c2Eli Friedman}
1689ac6f62a77be5b281a7ddc24a16669b457ac47c2Eli Friedman
169d38617c8a50f9729c254ab76cd359af797c6739bEli FriedmanSTDMETHODIMP BrowserAccessibilityWin::get_accChildCount(LONG* child_count) {
1700eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl  if (!instance_active_)
1710eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl    return E_FAIL;
1720eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl
1734493f79fce48cd9cbd9f55fa9d452cde736747a0Daniel Dunbar  if (!child_count)
1740eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl    return E_INVALIDARG;
1750eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl
176d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  *child_count = children_.size();
177d5f8a4fd4d6dfb0415b93bb7ab721bba5cab1332Daniel Dunbar  return S_OK;
1780eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl}
1790eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl
180d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders CarlssonSTDMETHODIMP BrowserAccessibilityWin::get_accDefaultAction(VARIANT var_id,
181d875fed28578835de89cd407e9db4be788596d7cEli Friedman                                                        BSTR* def_action) {
182d875fed28578835de89cd407e9db4be788596d7cEli Friedman  if (!instance_active_)
183d875fed28578835de89cd407e9db4be788596d7cEli Friedman    return E_FAIL;
184d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson
1858e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  if (!def_action)
1868e10f3b9cc1db43645bbc2999eb163af8997d468John McCall    return E_INVALIDARG;
1878e10f3b9cc1db43645bbc2999eb163af8997d468John McCall
1888e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
1898e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  if (!target)
19075c29a012793292ff4578015a9113bf086156d7fChris Lattner    return E_INVALIDARG;
1918e10f3b9cc1db43645bbc2999eb163af8997d468John McCall
1928e10f3b9cc1db43645bbc2999eb163af8997d468John McCall  return target->GetAttributeAsBstr(
19375c29a012793292ff4578015a9113bf086156d7fChris Lattner      WebAccessibility::ATTR_SHORTCUT, def_action);
1945caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner}
195a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
196a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas GregorSTDMETHODIMP BrowserAccessibilityWin::get_accDescription(VARIANT var_id,
197a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor                                                      BSTR* desc) {
198a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!instance_active_)
199a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_FAIL;
2005caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner
201a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!desc)
202a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_INVALIDARG;
203a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
204a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
205a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!target)
2065caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    return E_INVALIDARG;
207a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
208a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  return target->GetAttributeAsBstr(WebAccessibility::ATTR_DESCRIPTION, desc);
209a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor}
210a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
211a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas GregorSTDMETHODIMP BrowserAccessibilityWin::get_accFocus(VARIANT* focus_child) {
2125caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if (!instance_active_)
213a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_FAIL;
214a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
215a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!focus_child)
216a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_INVALIDARG;
217a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
2185caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  BrowserAccessibilityWin* focus = static_cast<BrowserAccessibilityWin*>(
219a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      manager_->GetFocus(this));
220a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (focus == this) {
221a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    focus_child->vt = VT_I4;
222a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    focus_child->lVal = CHILDID_SELF;
223a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  } else if (focus == NULL) {
2245caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    focus_child->vt = VT_EMPTY;
225a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  } else {
226a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    focus_child->vt = VT_DISPATCH;
227a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    focus_child->pdispVal = focus->NewReference();
228a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  }
229a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
2305caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  return S_OK;
231a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor}
232a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
233a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas GregorSTDMETHODIMP BrowserAccessibilityWin::get_accHelp(VARIANT var_id, BSTR* help) {
234a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!instance_active_)
235a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_FAIL;
2365caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner
237a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!help)
238a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_INVALIDARG;
239a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
240a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
241a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!target)
2425caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    return E_INVALIDARG;
243a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
244a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  return target->GetAttributeAsBstr(WebAccessibility::ATTR_HELP, help);
245a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor}
246a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
247a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas GregorSTDMETHODIMP BrowserAccessibilityWin::get_accKeyboardShortcut(VARIANT var_id,
2485caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner                                                           BSTR* acc_key) {
249a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!instance_active_)
250a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_FAIL;
251a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
252a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!acc_key)
253a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_INVALIDARG;
2545caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner
255a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
256a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!target)
257a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_INVALIDARG;
258a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
259a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  return target->GetAttributeAsBstr(WebAccessibility::ATTR_SHORTCUT, acc_key);
2605caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner}
261a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
262a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas GregorSTDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) {
263a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!instance_active_)
264a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_FAIL;
265a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
2665caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if (!name)
267a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_INVALIDARG;
268a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
269a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
270a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!target)
271a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return E_INVALIDARG;
2725caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner
273a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (target->name_.empty())
274a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    return S_FALSE;
275a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
276a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  *name = SysAllocString(target->name_.c_str());
277a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
27823aa9c8ca0bc441aab2a38a4c9fc7a1c9e9ac16aChris Lattner  DCHECK(*name);
279a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  return S_OK;
280a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor}
281a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor
282a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas GregorSTDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) {
283a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor  if (!instance_active_)
2843fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer    return E_FAIL;
285ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
286ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!disp_parent)
287ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_INVALIDARG;
2883fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer
289ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  IAccessible* parent = parent_->toBrowserAccessibilityWin();
29077f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge  if (parent == NULL) {
291e59392176c2369df2bdd11b7786cb38abac00198Julien Lerouge    // This happens if we're the root of the tree;
29277f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    // return the IAccessible for the window.
29377f68bb90af93b95045fb994e7cd68137adcc132Julien Lerouge    parent = manager_->toBrowserAccessibilityManagerWin()->
2945154dce6388e3aaa445467030df7a45ed1211abeRichard Smith        GetParentWindowIAccessible();
2955154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  }
2965154dce6388e3aaa445467030df7a45ed1211abeRichard Smith
2975154dce6388e3aaa445467030df7a45ed1211abeRichard Smith  parent->AddRef();
29826a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman  *disp_parent = parent;
29926a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman  return S_OK;
30026a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman}
30126a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman
30226a31428f130b66f61834d1b4d1cf72f590f70b9Nate BegemanSTDMETHODIMP BrowserAccessibilityWin::get_accRole(
303bcfd1f55bfbb3e5944cd5e03d07b343e280838c4Douglas Gregor    VARIANT var_id, VARIANT* role) {
30426a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman  if (!instance_active_)
30526a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman    return E_FAIL;
30626a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman
30726a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman  if (!role)
30826a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman    return E_INVALIDARG;
309b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
310b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
311b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!target)
312b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_INVALIDARG;
313fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan
314fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  if (!target->role_name_.empty()) {
315fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    role->vt = VT_BSTR;
316fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    role->bstrVal = SysAllocString(target->role_name_.c_str());
317fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  } else {
318fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    role->vt = VT_I4;
319fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    role->lVal = target->ia_role_;
32026a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman  }
32126a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman  return S_OK;
32226a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman}
32326a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman
32426a31428f130b66f61834d1b4d1cf72f590f70b9Nate BegemanSTDMETHODIMP BrowserAccessibilityWin::get_accState(VARIANT var_id,
3253fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer                                                VARIANT* state) {
32626a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman  if (!instance_active_)
32726a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman    return E_FAIL;
32861eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman
32961eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman  if (!state)
330da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    return E_INVALIDARG;
331da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
332da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
333da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  if (!target)
334da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    return E_INVALIDARG;
335da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
336da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  state->vt = VT_I4;
337da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  state->lVal = target->ia_state_;
338da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  if (manager_->GetFocus(NULL) == this)
339da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    state->lVal |= STATE_SYSTEM_FOCUSED;
340da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
341da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  return S_OK;
342da95f73b59f9af964e33725c515139d34c90c863Bob Wilson}
343da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
344da95f73b59f9af964e33725c515139d34c90c863Bob WilsonSTDMETHODIMP BrowserAccessibilityWin::get_accValue(
345da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    VARIANT var_id, BSTR* value) {
346da95f73b59f9af964e33725c515139d34c90c863Bob Wilson  if (!instance_active_)
347da95f73b59f9af964e33725c515139d34c90c863Bob Wilson    return E_FAIL;
348da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
349b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!value)
350b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_INVALIDARG;
351b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
35261eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman  BrowserAccessibilityWin* target = GetTargetFromChildID(var_id);
3537530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie  if (!target)
35461eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman    return E_INVALIDARG;
35561eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman
3566f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  *value = SysAllocString(target->value_.c_str());
3576f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson
3586f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  DCHECK(*value);
3596f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  return S_OK;
3606f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson}
3616f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson
3626f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob WilsonSTDMETHODIMP BrowserAccessibilityWin::get_accHelpTopic(
3636f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson    BSTR* help_file, VARIANT var_id, LONG* topic_id) {
3646f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  return E_NOTIMPL;
3656f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson}
3666f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson
3676f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob WilsonSTDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) {
3686f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  if (!instance_active_)
3696f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson    return E_FAIL;
3706f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson
3716f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  return E_NOTIMPL;
3726f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson}
3736f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson
3746f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob WilsonSTDMETHODIMP BrowserAccessibilityWin::accSelect(
3756f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson    LONG flags_sel, VARIANT var_id) {
3766f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  if (!instance_active_)
377b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_FAIL;
378b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
3796f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  if (flags_sel & SELFLAG_TAKEFOCUS) {
3807530c034c0c71a64c5a9173206d9742ae847af8bDavid Blaikie    manager_->SetFocus(*this);
3816f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson    return S_OK;
3826f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  }
383b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
384b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  return S_FALSE;
385b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover}
386b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
387b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover//
388b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover// IAccessible2 methods.
389b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover//
390b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
391b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::role(LONG* role) {
392b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!instance_active_)
393b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_FAIL;
394b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
395b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!role)
396b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_INVALIDARG;
397b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
398b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  *role = ia2_role_;
399b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
400b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  return S_OK;
401b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover}
402b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
403b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_attributes(BSTR* attributes) {
404b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!instance_active_)
405b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_FAIL;
406b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
407b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!attributes)
408b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_INVALIDARG;
409b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
410b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  // Follow Firefox's convention, which is to return a set of key-value pairs
411b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  // separated by semicolons, with a colon between the key and the value.
412b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  string16 str;
413b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  for (unsigned int i = 0; i < html_attributes_.size(); i++) {
414b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    if (i != 0)
415b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover      str += L';';
416b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    str += Escape(html_attributes_[i].first);
417b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    str += L':';
418b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    str += Escape(html_attributes_[i].second);
419b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  }
420b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
421b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (str.empty())
422b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return S_FALSE;
423b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
424b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  *attributes = SysAllocString(str.c_str());
425b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  DCHECK(*attributes);
426b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  return S_OK;
427b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover}
428b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
429b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_states(AccessibleStates* states) {
430b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!instance_active_)
431b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_FAIL;
432b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
433b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!states)
434b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_INVALIDARG;
435b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
436b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  *states = ia2_state_;
437b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
438b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  return S_OK;
439b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover}
440b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
441b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_uniqueID(LONG* unique_id) {
442b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!instance_active_)
443b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_FAIL;
444b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
445b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!unique_id)
446b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_INVALIDARG;
447b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
448b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  *unique_id = child_id_;
449b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  return S_OK;
450b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover}
451b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
452b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) {
453b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!instance_active_)
454b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_FAIL;
455b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
456b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  if (!window_handle)
457b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover    return E_INVALIDARG;
458b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover
459b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  *window_handle = manager_->GetParentView();
460b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover  return S_OK;
46109df2b066221d869f17f4b5762405f111a65f983Tim Northover}
46209df2b066221d869f17f4b5762405f111a65f983Tim Northover
46309df2b066221d869f17f4b5762405f111a65f983Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) {
46409df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!instance_active_)
46509df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_FAIL;
46609df2b066221d869f17f4b5762405f111a65f983Tim Northover
46709df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!index_in_parent)
46809df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_INVALIDARG;
46909df2b066221d869f17f4b5762405f111a65f983Tim Northover
47009df2b066221d869f17f4b5762405f111a65f983Tim Northover  *index_in_parent = index_in_parent_;
47109df2b066221d869f17f4b5762405f111a65f983Tim Northover  return S_OK;
47209df2b066221d869f17f4b5762405f111a65f983Tim Northover}
47309df2b066221d869f17f4b5762405f111a65f983Tim Northover
47409df2b066221d869f17f4b5762405f111a65f983Tim Northover//
47509df2b066221d869f17f4b5762405f111a65f983Tim Northover// IAccessibleImage methods.
47609df2b066221d869f17f4b5762405f111a65f983Tim Northover//
47709df2b066221d869f17f4b5762405f111a65f983Tim Northover
47809df2b066221d869f17f4b5762405f111a65f983Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_description(BSTR* desc) {
47909df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!instance_active_)
48009df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_FAIL;
48109df2b066221d869f17f4b5762405f111a65f983Tim Northover
48209df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!desc)
48309df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_INVALIDARG;
48409df2b066221d869f17f4b5762405f111a65f983Tim Northover
48509df2b066221d869f17f4b5762405f111a65f983Tim Northover  return GetAttributeAsBstr(WebAccessibility::ATTR_DESCRIPTION, desc);
48609df2b066221d869f17f4b5762405f111a65f983Tim Northover}
48709df2b066221d869f17f4b5762405f111a65f983Tim Northover
48809df2b066221d869f17f4b5762405f111a65f983Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_imagePosition(
48909df2b066221d869f17f4b5762405f111a65f983Tim Northover    enum IA2CoordinateType coordinate_type, LONG* x, LONG* y) {
49009df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!instance_active_)
49109df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_FAIL;
49209df2b066221d869f17f4b5762405f111a65f983Tim Northover
49309df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!x || !y)
49409df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_INVALIDARG;
49509df2b066221d869f17f4b5762405f111a65f983Tim Northover
49609df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) {
49709df2b066221d869f17f4b5762405f111a65f983Tim Northover    HWND parent_hwnd = manager_->GetParentView();
49809df2b066221d869f17f4b5762405f111a65f983Tim Northover    POINT top_left = {0, 0};
49909df2b066221d869f17f4b5762405f111a65f983Tim Northover    ::ClientToScreen(parent_hwnd, &top_left);
50009df2b066221d869f17f4b5762405f111a65f983Tim Northover    *x = location_.x + top_left.x;
50109df2b066221d869f17f4b5762405f111a65f983Tim Northover    *y = location_.y + top_left.y;
50209df2b066221d869f17f4b5762405f111a65f983Tim Northover  } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) {
50309df2b066221d869f17f4b5762405f111a65f983Tim Northover    *x = location_.x;
50409df2b066221d869f17f4b5762405f111a65f983Tim Northover    *y = location_.y;
50509df2b066221d869f17f4b5762405f111a65f983Tim Northover    if (parent_) {
50609df2b066221d869f17f4b5762405f111a65f983Tim Northover      *x -= parent_->location().x;
50709df2b066221d869f17f4b5762405f111a65f983Tim Northover      *y -= parent_->location().y;
50809df2b066221d869f17f4b5762405f111a65f983Tim Northover    }
50909df2b066221d869f17f4b5762405f111a65f983Tim Northover  } else {
51009df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_INVALIDARG;
51109df2b066221d869f17f4b5762405f111a65f983Tim Northover  }
51209df2b066221d869f17f4b5762405f111a65f983Tim Northover
51309df2b066221d869f17f4b5762405f111a65f983Tim Northover  return S_OK;
51409df2b066221d869f17f4b5762405f111a65f983Tim Northover}
51509df2b066221d869f17f4b5762405f111a65f983Tim Northover
51609df2b066221d869f17f4b5762405f111a65f983Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_imageSize(LONG* height, LONG* width) {
51709df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!instance_active_)
51809df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_FAIL;
51909df2b066221d869f17f4b5762405f111a65f983Tim Northover
52009df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!height || !width)
52109df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_INVALIDARG;
52209df2b066221d869f17f4b5762405f111a65f983Tim Northover
52309df2b066221d869f17f4b5762405f111a65f983Tim Northover  *height = location_.height;
52409df2b066221d869f17f4b5762405f111a65f983Tim Northover  *width = location_.width;
52509df2b066221d869f17f4b5762405f111a65f983Tim Northover  return S_OK;
52609df2b066221d869f17f4b5762405f111a65f983Tim Northover}
52709df2b066221d869f17f4b5762405f111a65f983Tim Northover
52809df2b066221d869f17f4b5762405f111a65f983Tim Northover//
52909df2b066221d869f17f4b5762405f111a65f983Tim Northover// IAccessibleText methods.
53009df2b066221d869f17f4b5762405f111a65f983Tim Northover//
53109df2b066221d869f17f4b5762405f111a65f983Tim Northover
53209df2b066221d869f17f4b5762405f111a65f983Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) {
53309df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!instance_active_)
53409df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_FAIL;
53509df2b066221d869f17f4b5762405f111a65f983Tim Northover
53609df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!n_characters)
53709df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_INVALIDARG;
53809df2b066221d869f17f4b5762405f111a65f983Tim Northover
53909df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
54009df2b066221d869f17f4b5762405f111a65f983Tim Northover    *n_characters = value_.length();
54109df2b066221d869f17f4b5762405f111a65f983Tim Northover  } else {
54209df2b066221d869f17f4b5762405f111a65f983Tim Northover    *n_characters = name_.length();
54309df2b066221d869f17f4b5762405f111a65f983Tim Northover  }
54409df2b066221d869f17f4b5762405f111a65f983Tim Northover
54509df2b066221d869f17f4b5762405f111a65f983Tim Northover  return S_OK;
54609df2b066221d869f17f4b5762405f111a65f983Tim Northover}
54709df2b066221d869f17f4b5762405f111a65f983Tim Northover
54809df2b066221d869f17f4b5762405f111a65f983Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) {
54909df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!instance_active_)
55009df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_FAIL;
55109df2b066221d869f17f4b5762405f111a65f983Tim Northover
55209df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!offset)
55309df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_INVALIDARG;
55409df2b066221d869f17f4b5762405f111a65f983Tim Northover
55509df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
55609df2b066221d869f17f4b5762405f111a65f983Tim Northover    int sel_start = 0;
55709df2b066221d869f17f4b5762405f111a65f983Tim Northover    if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start)) {
55809df2b066221d869f17f4b5762405f111a65f983Tim Northover      *offset = sel_start;
55909df2b066221d869f17f4b5762405f111a65f983Tim Northover    } else {
56009df2b066221d869f17f4b5762405f111a65f983Tim Northover      *offset = 0;
56109df2b066221d869f17f4b5762405f111a65f983Tim Northover    }
56209df2b066221d869f17f4b5762405f111a65f983Tim Northover  } else {
56309df2b066221d869f17f4b5762405f111a65f983Tim Northover    *offset = 0;
56426a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman  }
5651c2a88cfaeb11227d3a6bf7204207e0c8cf6de6fNate Begeman
5661c2a88cfaeb11227d3a6bf7204207e0c8cf6de6fNate Begeman  return S_OK;
56709df2b066221d869f17f4b5762405f111a65f983Tim Northover}
56809df2b066221d869f17f4b5762405f111a65f983Tim Northover
56909df2b066221d869f17f4b5762405f111a65f983Tim NorthoverSTDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) {
57009df2b066221d869f17f4b5762405f111a65f983Tim Northover  if (!instance_active_)
57109df2b066221d869f17f4b5762405f111a65f983Tim Northover    return E_FAIL;
572f8ee6bc1ef0eec8e22b413dfc2baa3cfa4f19f91Richard Smith
57361eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman  if (!n_selections)
5744648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson    return E_INVALIDARG;
5756f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson
5761c2a88cfaeb11227d3a6bf7204207e0c8cf6de6fNate Begeman  if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
577a23326b5c244a03bf61ebb86db60a777ea26f926Nate Begeman    int sel_start = 0;
578a23326b5c244a03bf61ebb86db60a777ea26f926Nate Begeman    int sel_end = 0;
579a23326b5c244a03bf61ebb86db60a777ea26f926Nate Begeman    if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) &&
5801c2a88cfaeb11227d3a6bf7204207e0c8cf6de6fNate Begeman        GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_END, &sel_end) &&
5811c2a88cfaeb11227d3a6bf7204207e0c8cf6de6fNate Begeman        sel_start != sel_end) {
5820d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman      *n_selections = 1;
5830d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman    } else {
5846f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson      *n_selections = 0;
5850d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman    }
5866f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  } else {
5870d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman    *n_selections = 0;
5880d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman  }
589da95f73b59f9af964e33725c515139d34c90c863Bob Wilson
590f8ee6bc1ef0eec8e22b413dfc2baa3cfa4f19f91Richard Smith  return S_OK;
5910d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman}
5926f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson
5936f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob WilsonSTDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index,
5946f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson                                                    LONG* start_offset,
5954648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson                                                    LONG* end_offset) {
5966f9f03ef370ad48ece0c5d10edda28f39ccadb5dBob Wilson  if (!instance_active_)
5974648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson    return E_FAIL;
5984648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson
5994648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson  if (!start_offset || !end_offset || selection_index != 0)
6004648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson    return E_INVALIDARG;
6014648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson
6024648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson  if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
6034648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson    int sel_start = 0;
6044648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson    int sel_end = 0;
6054648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson    if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) &&
6064648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson        GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_END, &sel_end)) {
6074648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson      *start_offset = sel_start;
6084648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson      *end_offset = sel_end;
6094648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson    } else {
6104648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson      *start_offset = 0;
6114648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson      *end_offset = 0;
6124648255cebd2fc7c18293c1f93afd6e9add9ccccBob Wilson    }
6130d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman  } else {
6141c2a88cfaeb11227d3a6bf7204207e0c8cf6de6fNate Begeman    *start_offset = 0;
6150d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman    *end_offset = 0;
6160d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman  }
61761eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman
6180d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman  return S_OK;
6190d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman}
620bb37f50c2d0d72e1fa5b349d5f6a11fdc5acb86eNate Begeman
621bb37f50c2d0d72e1fa5b349d5f6a11fdc5acb86eNate BegemanSTDMETHODIMP BrowserAccessibilityWin::get_text(
62299c40bb13b523d58d7aeb6446e4f486d6918ca58Nate Begeman    LONG start_offset, LONG end_offset, BSTR* text) {
62399c40bb13b523d58d7aeb6446e4f486d6918ca58Nate Begeman  if (!instance_active_)
624a23326b5c244a03bf61ebb86db60a777ea26f926Nate Begeman    return E_FAIL;
625a23326b5c244a03bf61ebb86db60a777ea26f926Nate Begeman
626a23326b5c244a03bf61ebb86db60a777ea26f926Nate Begeman  if (!text)
6270d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman    return E_INVALIDARG;
6280d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman
629592a4230c6e91fead00d605f6155080544cdf8c9Douglas Gregor  const string16& text_str = TextForIAccessibleText();
630592a4230c6e91fead00d605f6155080544cdf8c9Douglas Gregor
631592a4230c6e91fead00d605f6155080544cdf8c9Douglas Gregor  // The spec allows the arguments to be reversed.
632592a4230c6e91fead00d605f6155080544cdf8c9Douglas Gregor  if (start_offset > end_offset) {
633592a4230c6e91fead00d605f6155080544cdf8c9Douglas Gregor    LONG tmp = start_offset;
63461eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman    start_offset = end_offset;
6350d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman    end_offset = tmp;
6360d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman  }
6370d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman
63861eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman  // The spec does not allow the start or end offsets to be out or range;
6390d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman  // we must return an error if so.
64061eecf5aea018ea65c9ab0bccacd2996b15c632dNate Begeman  LONG len = text_str.length();
6410d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman  if (start_offset < 0)
642476d8b863cb65b2b5833235d97315cdb46e6f5aaBenjamin Kramer    return E_INVALIDARG;
6430d15c5321a11a5fee53b17ca8e9e0d72d6192b23Nate Begeman  if (end_offset > len)
64499c40bb13b523d58d7aeb6446e4f486d6918ca58Nate Begeman    return E_INVALIDARG;
64526a31428f130b66f61834d1b4d1cf72f590f70b9Nate Begeman
646d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  string16 substr = text_str.substr(start_offset, end_offset - start_offset);
647d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  if (substr.empty())
648fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    return S_FALSE;
649fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan
650fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  *text = SysAllocString(substr.c_str());
651fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  DCHECK(*text);
652fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  return S_OK;
653fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan}
654be22cb84f32cfa6cf0b6bdaf523288b747bb0f18Simon Atanasyan
655be22cb84f32cfa6cf0b6bdaf523288b747bb0f18Simon AtanasyanSTDMETHODIMP BrowserAccessibilityWin::get_textAtOffset(
656be22cb84f32cfa6cf0b6bdaf523288b747bb0f18Simon Atanasyan    LONG offset,
657be22cb84f32cfa6cf0b6bdaf523288b747bb0f18Simon Atanasyan    enum IA2TextBoundaryType boundary_type,
658be22cb84f32cfa6cf0b6bdaf523288b747bb0f18Simon Atanasyan    LONG* start_offset, LONG* end_offset,
659fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    BSTR* text) {
660fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  if (!instance_active_)
661fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    return E_FAIL;
662fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan
663fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  if (!start_offset || !end_offset || !text)
664fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    return E_INVALIDARG;
665fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan
666fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  // The IAccessible2 spec says we don't have to implement the "sentence"
667fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  // boundary type, we can just let the screenreader handle it.
668fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
669fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    *start_offset = 0;
670fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    *end_offset = 0;
671fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    *text = NULL;
672fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan    return S_FALSE;
673fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  }
674fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan
675fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  const string16& text_str = TextForIAccessibleText();
676fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan
677fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  *start_offset = FindBoundary(text_str, boundary_type, offset, -1);
678fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  *end_offset = FindBoundary(text_str, boundary_type, offset, 1);
679fad0a32da8ea34a58aa0a0dd3fd67cd30959b080Simon Atanasyan  return get_text(*start_offset, *end_offset, text);
680831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith}
681831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
682831421f24057b93ea28bc92d8bd6290631a43cafRichard SmithSTDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset(
683831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    LONG offset,
684831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    enum IA2TextBoundaryType boundary_type,
685831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    LONG* start_offset, LONG* end_offset,
686831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    BSTR* text) {
687831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (!instance_active_)
688831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    return E_FAIL;
689de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar
690831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (!start_offset || !end_offset || !text)
691831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    return E_INVALIDARG;
692831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
693831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  // The IAccessible2 spec says we don't have to implement the "sentence"
694831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  // boundary type, we can just let the screenreader handle it.
695831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
696831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    *start_offset = 0;
697831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    *end_offset = 0;
698831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    *text = NULL;
699831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    return S_FALSE;
700831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  }
701831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
7021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  const string16& text_str = TextForIAccessibleText();
703831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
704831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  *start_offset = FindBoundary(text_str, boundary_type, offset, -1);
7051c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko  *end_offset = offset;
7061c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko  return get_text(*start_offset, *end_offset, text);
707831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith}
708831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
709831421f24057b93ea28bc92d8bd6290631a43cafRichard SmithSTDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset(
710831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    LONG offset,
711831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    enum IA2TextBoundaryType boundary_type,
71266360e224689dc23a0acd8a6705ba50bec13bc97Jordan Rose    LONG* start_offset, LONG* end_offset,
71366360e224689dc23a0acd8a6705ba50bec13bc97Jordan Rose    BSTR* text) {
714de45428f923b38d80407dbb9ede0df504256f9f6Daniel Dunbar  if (!instance_active_)
715c82faca0be59b072b38bed375e21bd24f1f72647Ted Kremenek    return E_FAIL;
716831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
7170538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu  if (!start_offset || !end_offset || !text)
7180538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    return E_INVALIDARG;
7190538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu
7200538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu  // The IAccessible2 spec says we don't have to implement the "sentence"
7210538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu  // boundary type, we can just let the screenreader handle it.
7220538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu  if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) {
7230538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    *start_offset = 0;
724831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    *end_offset = 0;
725831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    *text = NULL;
726831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    return S_FALSE;
727831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  }
7281c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko
7290234bfa2b03470b8ce379a7485e60ffa35c1d550Ted Kremenek  const string16& text_str = TextForIAccessibleText();
7301c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko
7310234bfa2b03470b8ce379a7485e60ffa35c1d550Ted Kremenek  *start_offset = offset;
7320234bfa2b03470b8ce379a7485e60ffa35c1d550Ted Kremenek  *end_offset = FindBoundary(text_str, boundary_type, offset, 1);
7331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  return get_text(*start_offset, *end_offset, text);
7340538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu}
7350538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu
7360538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu//
7370538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu// ISimpleDOMDocument methods.
7380538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu//
7390538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu
7400538f0e9200df56974b5a71bc276dbce456e9781Richard TrieuSTDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) {
7410538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu  if (!instance_active_)
7420538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    return E_FAIL;
7430538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu
7440538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu  if (!url)
7450538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    return E_INVALIDARG;
7460538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu
7470d5a069f66df09b3308ccfdce84a88170034c657Dmitri Gribenko  return GetAttributeAsBstr(WebAccessibility::ATTR_DOC_URL, url);
748831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith}
749831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
750831421f24057b93ea28bc92d8bd6290631a43cafRichard SmithSTDMETHODIMP BrowserAccessibilityWin::get_title(BSTR* title) {
751831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (!instance_active_)
7521c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko    return E_FAIL;
7531c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko
754831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (!title)
755831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    return E_INVALIDARG;
756831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
757831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  return GetAttributeAsBstr(WebAccessibility::ATTR_DOC_TITLE, title);
7581c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko}
759831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
760831421f24057b93ea28bc92d8bd6290631a43cafRichard SmithSTDMETHODIMP BrowserAccessibilityWin::get_mimeType(BSTR* mime_type) {
761831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (!instance_active_)
762831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    return E_FAIL;
763831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
764831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (!mime_type)
765831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    return E_INVALIDARG;
7662edcde8747a000113b434a5c88b4648beed4197bEli Friedman
7672edcde8747a000113b434a5c88b4648beed4197bEli Friedman  return GetAttributeAsBstr(WebAccessibility::ATTR_DOC_MIMETYPE, mime_type);
7682edcde8747a000113b434a5c88b4648beed4197bEli Friedman}
7692edcde8747a000113b434a5c88b4648beed4197bEli Friedman
770831421f24057b93ea28bc92d8bd6290631a43cafRichard SmithSTDMETHODIMP BrowserAccessibilityWin::get_docType(BSTR* doc_type) {
771831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (!instance_active_)
772831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    return E_FAIL;
7732edcde8747a000113b434a5c88b4648beed4197bEli Friedman
7742edcde8747a000113b434a5c88b4648beed4197bEli Friedman  if (!doc_type)
775df75b0c74b277c6b46af2f9e90e13160fbc14d6fEli Friedman    return E_INVALIDARG;
7762edcde8747a000113b434a5c88b4648beed4197bEli Friedman
7772edcde8747a000113b434a5c88b4648beed4197bEli Friedman  return GetAttributeAsBstr(WebAccessibility::ATTR_DOC_DOCTYPE, doc_type);
7782edcde8747a000113b434a5c88b4648beed4197bEli Friedman}
7792edcde8747a000113b434a5c88b4648beed4197bEli Friedman
7802edcde8747a000113b434a5c88b4648beed4197bEli Friedman//
7812edcde8747a000113b434a5c88b4648beed4197bEli Friedman// ISimpleDOMNode methods.
7821c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko//
7831c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko
784831421f24057b93ea28bc92d8bd6290631a43cafRichard SmithSTDMETHODIMP BrowserAccessibilityWin::get_nodeInfo(
785831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    BSTR* node_name,
786831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    short* name_space_id,
787831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    BSTR* node_value,
788831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    unsigned int* num_children,
789831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    unsigned int* unique_id,
790831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    unsigned short* node_type) {
791831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (!instance_active_)
7920eb23307222bda7ad95d968eac4e1ab30864b213Sebastian Redl    return E_FAIL;
7930a151a137a68bb656acbcce7ff2407613bb80cfcAnna Zaks
7940a151a137a68bb656acbcce7ff2407613bb80cfcAnna Zaks  if (!node_name || !name_space_id || !node_value || !num_children ||
795d9b859a74ecaede23a78d37f364498102ef418c9Anna Zaks      !unique_id || !node_type) {
796bd5da9d1a711e90b3bc265b4798954085c0b48d9Ted Kremenek    return E_INVALIDARG;
797d9b859a74ecaede23a78d37f364498102ef418c9Anna Zaks  }
7980a151a137a68bb656acbcce7ff2407613bb80cfcAnna Zaks
799bd5da9d1a711e90b3bc265b4798954085c0b48d9Ted Kremenek  string16 tag;
800c36bedc90c687caa71748480c60707ea4608b092Anna Zaks  if (GetAttribute(WebAccessibility::ATTR_HTML_TAG, &tag))
801c36bedc90c687caa71748480c60707ea4608b092Anna Zaks    *node_name = SysAllocString(tag.c_str());
802d9b859a74ecaede23a78d37f364498102ef418c9Anna Zaks  else
8030a151a137a68bb656acbcce7ff2407613bb80cfcAnna Zaks    *node_name = NULL;
8047ccc95bceebb2d1c8fbe277c9e33bde7dc1ccbb1Chandler Carruth
805d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  *name_space_id = 0;
80671993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  *node_value = SysAllocString(value_.c_str());
80771993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson  *num_children = children_.size();
80829c3f814b64808c6dac4597b61a50ceecdf141fcJean-Daniel Dupas  *unique_id = child_id_;
809287f24d3991994b9a263af9e2a873f4feadfb8faDmitri Gribenko
810831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  if (ia_role_ == ROLE_SYSTEM_DOCUMENT) {
811831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    *node_type = NODETYPE_DOCUMENT;
81229c3f814b64808c6dac4597b61a50ceecdf141fcJean-Daniel Dupas  } else if (ia_role_ == ROLE_SYSTEM_TEXT &&
813287f24d3991994b9a263af9e2a873f4feadfb8faDmitri Gribenko             ((ia2_state_ & IA2_STATE_EDITABLE) == 0)) {
814831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith    *node_type = NODETYPE_TEXT;
815831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  } else {
81629c3f814b64808c6dac4597b61a50ceecdf141fcJean-Daniel Dupas    *node_type = NODETYPE_ELEMENT;
81729c3f814b64808c6dac4597b61a50ceecdf141fcJean-Daniel Dupas  }
81829c3f814b64808c6dac4597b61a50ceecdf141fcJean-Daniel Dupas
81929c3f814b64808c6dac4597b61a50ceecdf141fcJean-Daniel Dupas  return S_OK;
820f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu}
821f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu
822725165f2846bd37d3aaf863747fa30126992085eFariborz JahanianSTDMETHODIMP BrowserAccessibilityWin::get_attributes(
823725165f2846bd37d3aaf863747fa30126992085eFariborz Jahanian    unsigned short max_attribs,
824d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson    BSTR* attrib_names,
8251eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    short* name_space_id,
826725165f2846bd37d3aaf863747fa30126992085eFariborz Jahanian    BSTR* attrib_values,
827f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu    unsigned short* num_attribs) {
828d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson  if (!instance_active_)
8291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    return E_FAIL;
830f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu
831a4993778f65212f01168c857cf3043e99ba85c9fRichard Trieu  if (!attrib_names || !name_space_id || !attrib_values || !num_attribs)
832f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu    return E_INVALIDARG;
833f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu
834f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu  *num_attribs = max_attribs;
835f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu  if (*num_attribs > html_attributes_.size())
836f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu    *num_attribs = html_attributes_.size();
837f462b0152f10eed0b989b07bcf457b6fb0d83bdbRichard Trieu
838831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  for (unsigned short i = 0; i < *num_attribs; ++i) {
839d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson    attrib_names[i] = SysAllocString(html_attributes_[i].first.c_str());
8401c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko    name_space_id[i] = 0;
8411c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko    attrib_values[i] = SysAllocString(html_attributes_[i].second.c_str());
8421c030e9a3f290a1eea5de82fe1e63dfde2bd8f1eDmitri Gribenko  }
843831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith  return S_OK;
844831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith}
845831421f24057b93ea28bc92d8bd6290631a43cafRichard Smith
846831421f24057b93ea28bc92d8bd6290631a43cafRichard SmithSTDMETHODIMP BrowserAccessibilityWin::get_attributesForNames(
847d406bf0e8c17012110a8476d03c6f9a97b56ecf7Anders Carlsson    unsigned short num_attribs,
848725165f2846bd37d3aaf863747fa30126992085eFariborz Jahanian    BSTR* attrib_names,
849725165f2846bd37d3aaf863747fa30126992085eFariborz Jahanian    short* name_space_id,
8500538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    BSTR* attrib_values) {
8510538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu  if (!instance_active_)
8520538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    return E_FAIL;
8530538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu
8540538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu  if (!attrib_names || !name_space_id || !attrib_values)
8550538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    return E_INVALIDARG;
8560538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu
8570538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu  for (unsigned short i = 0; i < num_attribs; ++i) {
8580538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    name_space_id[i] = 0;
8590538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    bool found = false;
8600538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    string16 name = (LPCWSTR)attrib_names[i];
8610538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu    for (unsigned int j = 0;  j < html_attributes_.size(); ++j) {
8620538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu      if (html_attributes_[j].first == name) {
8630538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu        attrib_values[i] = SysAllocString(html_attributes_[j].second.c_str());
8640538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu        found = true;
8650538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu        break;
8660538f0e9200df56974b5a71bc276dbce456e9781Richard Trieu      }
867ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    }
868ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    if (!found) {
869276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman      attrib_values[i] = NULL;
870276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    }
871276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
872ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  return S_OK;
873ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
874ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
875ff34d401ff385ef7173ca612432b4ea717fff690Richard SmithSTDMETHODIMP BrowserAccessibilityWin::get_computedStyle(
876ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    unsigned short max_style_properties,
877ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    boolean use_alternate_view,
878ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    BSTR *style_properties,
879ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    BSTR *style_values,
880ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    unsigned short *num_style_properties)  {
881ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
882ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_FAIL;
883ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
884ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!style_properties || !style_values)
885ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_INVALIDARG;
886ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
887ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  // We only cache a single style property for now: DISPLAY
888ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
889ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (max_style_properties == 0 ||
890ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      !HasAttribute(WebAccessibility::ATTR_DISPLAY)) {
891ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    *num_style_properties = 0;
892ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return S_OK;
893ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
894ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
895ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  string16 display;
896ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  GetAttribute(WebAccessibility::ATTR_DISPLAY, &display);
897ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  *num_style_properties = 1;
898ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  style_properties[0] = SysAllocString(L"display");
899ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  style_values[0] = SysAllocString(display.c_str());
900ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
901ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  return S_OK;
902ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
903ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
904ff34d401ff385ef7173ca612432b4ea717fff690Richard SmithSTDMETHODIMP BrowserAccessibilityWin::get_computedStyleForProperties(
905ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    unsigned short num_style_properties,
906ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    boolean use_alternate_view,
907ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    BSTR* style_properties,
908ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    BSTR* style_values) {
909ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
910ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_FAIL;
911ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
912ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!style_properties || !style_values)
913ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_INVALIDARG;
914ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
915ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  // We only cache a single style property for now: DISPLAY
916ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
917ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  for (unsigned short i = 0; i < num_style_properties; i++) {
918ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    string16 name = (LPCWSTR)style_properties[i];
919ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    StringToLowerASCII(&name);
920ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    if (name == L"display") {
921ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      string16 display;
922ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      GetAttribute(WebAccessibility::ATTR_DISPLAY, &display);
923ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      style_values[i] = SysAllocString(display.c_str());
924ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    } else {
925ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      style_values[i] = NULL;
926ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    }
927ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
928ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
929ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  return S_OK;
930ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
931ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
932ff34d401ff385ef7173ca612432b4ea717fff690Richard SmithSTDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) {
933ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  return E_NOTIMPL;
934ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
935ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
936ff34d401ff385ef7173ca612432b4ea717fff690Richard SmithSTDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) {
937ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
938ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_FAIL;
939ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
940ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!node)
941ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_INVALIDARG;
94251b92401c9f95023a2ef27064fd5a60fd99175f5Richard Smith
943ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  *node = parent_->toBrowserAccessibilityWin()->NewReference();
944ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  return S_OK;
945ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
94651b92401c9f95023a2ef27064fd5a60fd99175f5Richard Smith
947ff34d401ff385ef7173ca612432b4ea717fff690Richard SmithSTDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node)  {
948ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
949ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_FAIL;
950ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
951ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!node)
952ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_INVALIDARG;
953ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
954ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (children_.size()) {
955ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    *node = children_[0]->toBrowserAccessibilityWin()->NewReference();
956ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return S_OK;
957ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  } else {
958ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    *node = NULL;
959ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return S_FALSE;
960ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
961ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
962ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
963ff34d401ff385ef7173ca612432b4ea717fff690Richard SmithSTDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) {
964ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
965ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_FAIL;
966ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
967ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!node)
968276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return E_INVALIDARG;
969276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
970ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (children_.size()) {
971ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    *node = children_[children_.size() - 1]->toBrowserAccessibilityWin()->
972276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman        NewReference();
973ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return S_OK;
974276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  } else {
975276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    *node = NULL;
976ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return S_FALSE;
977ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
978276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman}
979ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
980276b061970939293f1abaf694bd3ef05b2cbda79Eli FriedmanSTDMETHODIMP BrowserAccessibilityWin::get_previousSibling(
981276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    ISimpleDOMNode** node) {
982276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (!instance_active_)
983276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return E_FAIL;
984ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
985dfa64ba45922e1c28e36341bdf34785fea74659bEli Friedman  if (!node)
986276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return E_INVALIDARG;
987276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
988276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (parent_ && index_in_parent_ > 0) {
989ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    *node = parent_->children()[index_in_parent_ - 1]->
990276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman        toBrowserAccessibilityWin()->NewReference();
991276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return S_OK;
992276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  } else {
993276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    *node = NULL;
994ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return S_FALSE;
995ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
996ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
997ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
998ff34d401ff385ef7173ca612432b4ea717fff690Richard SmithSTDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) {
999ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
1000ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_FAIL;
1001ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1002ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!node)
1003bc57b108b2253e26b83768dba196c28564952f18Richard Smith    return E_INVALIDARG;
1004bc57b108b2253e26b83768dba196c28564952f18Richard Smith
1005bc57b108b2253e26b83768dba196c28564952f18Richard Smith  if (parent_ &&
1006bc57b108b2253e26b83768dba196c28564952f18Richard Smith      index_in_parent_ >= 0 &&
1007bc57b108b2253e26b83768dba196c28564952f18Richard Smith      index_in_parent_ < static_cast<int>(parent_->children().size()) - 1) {
1008ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    *node = parent_->children()[index_in_parent_ + 1]->
1009276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman        toBrowserAccessibilityWin()->NewReference();
1010276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return S_OK;
1011ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  } else {
1012ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    *node = NULL;
1013ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return S_FALSE;
1014ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
1015ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
1016ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1017ff34d401ff385ef7173ca612432b4ea717fff690Richard SmithSTDMETHODIMP BrowserAccessibilityWin::get_childAt(
1018ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    unsigned int child_index,
1019ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    ISimpleDOMNode** node) {
1020ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
1021ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_FAIL;
1022ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1023ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!node)
1024ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_INVALIDARG;
1025ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1026ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (child_index < children_.size()) {
1027276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    *node = children_[child_index]->toBrowserAccessibilityWin()->NewReference();
1028ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return S_OK;
1029276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  } else {
1030276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    *node = NULL;
1031276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return S_FALSE;
1032ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
1033ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
1034ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1035ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith//
1036276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman// ISimpleDOMText methods.
1037276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman//
1038276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
1039276b061970939293f1abaf694bd3ef05b2cbda79Eli FriedmanSTDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) {
1040ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
1041ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return E_FAIL;
1042ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1043276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (!dom_text)
1044276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return E_INVALIDARG;
1045276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
1046276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (name_.empty())
1047276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return S_FALSE;
1048276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
1049276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  *dom_text = SysAllocString(name_.c_str());
1050276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  DCHECK(*dom_text);
1051276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  return S_OK;
1052ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
1053ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1054276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman//
1055276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman// IServiceProvider methods.
1056276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman//
1057276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
1058276b061970939293f1abaf694bd3ef05b2cbda79Eli FriedmanSTDMETHODIMP BrowserAccessibilityWin::QueryService(
1059276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    REFGUID guidService, REFIID riid, void** object) {
1060ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
1061276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return E_FAIL;
1062ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1063276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (guidService == IID_IAccessible ||
1064276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman      guidService == IID_IAccessible2 ||
1065ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      guidService == IID_IAccessibleImage ||
1066ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      guidService == IID_IAccessibleText ||
1067ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      guidService == IID_ISimpleDOMDocument ||
1068ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      guidService == IID_ISimpleDOMNode ||
1069ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      guidService == IID_ISimpleDOMText) {
1070ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    return QueryInterface(riid, object);
1071276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  }
1072276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
1073276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  *object = NULL;
1074ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  return E_FAIL;
1075276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman}
1076ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1077ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith//
1078ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith// CComObjectRootEx methods.
1079ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith//
1080ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1081ff34d401ff385ef7173ca612432b4ea717fff690Richard SmithHRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface(
1082ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    void* this_ptr,
1083ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    const _ATL_INTMAP_ENTRY* entries,
1084ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    REFIID iid,
1085ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    void** object) {
1086ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (iid == IID_IAccessibleText) {
1087ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    if (ia_role_ != ROLE_SYSTEM_LINK && ia_role_ != ROLE_SYSTEM_TEXT) {
1088ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      *object = NULL;
1089ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      return E_NOINTERFACE;
1090ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    }
1091ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  } else if (iid == IID_IAccessibleImage) {
1092ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    if (ia_role_ != ROLE_SYSTEM_GRAPHIC) {
1093ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      *object = NULL;
1094ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      return E_NOINTERFACE;
1095ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    }
1096ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  } else if (iid == IID_ISimpleDOMDocument) {
1097ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    if (ia_role_ != ROLE_SYSTEM_DOCUMENT) {
1098ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      *object = NULL;
1099ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith      return E_NOINTERFACE;
1100ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    }
1101ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  }
1102ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1103276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  return CComObjectRootBase::InternalQueryInterface(
1104276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman      this_ptr, entries, iid, object);
1105276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman}
1106276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
1107ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith//
1108276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman// Private methods.
1109276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman//
1110ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1111276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman// Initialize this object and mark it as active.
1112276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedmanvoid BrowserAccessibilityWin::Initialize() {
1113276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  InitRoleAndState();
1114276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
1115276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  // Expose headings levels to NVDA with the "level" object attribute.
1116276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (role_ == WebAccessibility::ROLE_HEADING && role_name_.size() == 2 &&
1117ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith          IsAsciiDigit(role_name_[1])) {
1118dfa64ba45922e1c28e36341bdf34785fea74659bEli Friedman    html_attributes_.push_back(std::make_pair(L"level", role_name_.substr(1)));
1119dfa64ba45922e1c28e36341bdf34785fea74659bEli Friedman  }
1120ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1121ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  // Expose the "display" object attribute.
1122ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  string16 display;
11237a7ee3033e44b45630981355460ef89efa0bdcc4David Chisnall  if (GetAttribute(WebAccessibility::ATTR_DISPLAY, &display))
1124ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    html_attributes_.push_back(std::make_pair(L"display", display));
1125ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1126ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  // If this object doesn't have a name but it does have a description,
1127ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  // use the description as its name - because some screen readers only
1128ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  // announce the name.
1129ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (name_.empty() && HasAttribute(WebAccessibility::ATTR_DESCRIPTION)) {
1130ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith    GetAttribute(WebAccessibility::ATTR_DESCRIPTION, &name_);
1131dfa64ba45922e1c28e36341bdf34785fea74659bEli Friedman  }
1132dfa64ba45922e1c28e36341bdf34785fea74659bEli Friedman
1133ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  instance_active_ = true;
1134ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
1135ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1136ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith// Mark this object as inactive, and remove references to all children.
1137ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith// When no other clients hold any references to this object it will be
1138ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith// deleted, and in the meantime, calls to any methods will return E_FAIL.
1139ff34d401ff385ef7173ca612432b4ea717fff690Richard Smithvoid BrowserAccessibilityWin::ReleaseTree() {
1140ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  if (!instance_active_)
1141dfa64ba45922e1c28e36341bdf34785fea74659bEli Friedman    return;
1142dfa64ba45922e1c28e36341bdf34785fea74659bEli Friedman
1143dfa64ba45922e1c28e36341bdf34785fea74659bEli Friedman  // Mark this object as inactive, so calls to all COM methods will return
11442ebb98a78471f2039af4321bae657e7daacc2a62David Chisnall  // failure.
1145ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  instance_active_ = false;
1146ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1147ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  BrowserAccessibility::ReleaseTree();
1148ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
1149ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith
1150ff34d401ff385ef7173ca612432b4ea717fff690Richard Smithvoid BrowserAccessibilityWin::ReleaseReference() {
1151ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith  Release();
1152ff34d401ff385ef7173ca612432b4ea717fff690Richard Smith}
1153276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
1154538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian
1155538bbe597b935a74d95c668ad209536753f13481Fariborz JahanianBrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() {
1156538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian  AddRef();
1157538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian  return this;
1158538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian}
1159538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian
1160538bbe597b935a74d95c668ad209536753f13481Fariborz JahanianBrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID(
1161538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian    const VARIANT& var_id) {
1162538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian  if (var_id.vt != VT_I4)
1163538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian    return NULL;
1164dfa64ba45922e1c28e36341bdf34785fea74659bEli Friedman
1165538bbe597b935a74d95c668ad209536753f13481Fariborz Jahanian  LONG child_id = var_id.lVal;
1166276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman  if (child_id == CHILDID_SELF)
1167276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman    return this;
1168276b061970939293f1abaf694bd3ef05b2cbda79Eli Friedman
11695f8d604246976a93a73549b07bbc8ee0b2061b50John McCall  if (child_id >= 1 && child_id <= static_cast<LONG>(children_.size()))
11705f8d604246976a93a73549b07bbc8ee0b2061b50John McCall    return children_[child_id - 1]->toBrowserAccessibilityWin();
11715f8d604246976a93a73549b07bbc8ee0b2061b50John McCall
11725f8d604246976a93a73549b07bbc8ee0b2061b50John McCall  return manager_->GetFromChildID(child_id)->toBrowserAccessibilityWin();
11735f8d604246976a93a73549b07bbc8ee0b2061b50John McCall}
11745f8d604246976a93a73549b07bbc8ee0b2061b50John McCall
11755f8d604246976a93a73549b07bbc8ee0b2061b50John McCallHRESULT BrowserAccessibilityWin::GetAttributeAsBstr(
11765f8d604246976a93a73549b07bbc8ee0b2061b50John McCall    WebAccessibility::Attribute attribute, BSTR* value_bstr) {
11775f8d604246976a93a73549b07bbc8ee0b2061b50John McCall  string16 str;
11785f8d604246976a93a73549b07bbc8ee0b2061b50John McCall
11795f8d604246976a93a73549b07bbc8ee0b2061b50John McCall  if (!GetAttribute(attribute, &str))
11805f8d604246976a93a73549b07bbc8ee0b2061b50John McCall    return S_FALSE;
11815f8d604246976a93a73549b07bbc8ee0b2061b50John McCall
11825f8d604246976a93a73549b07bbc8ee0b2061b50John McCall  if (str.empty())
11835f8d604246976a93a73549b07bbc8ee0b2061b50John McCall    return S_FALSE;
11845f8d604246976a93a73549b07bbc8ee0b2061b50John McCall
11855f8d604246976a93a73549b07bbc8ee0b2061b50John McCall  *value_bstr = SysAllocString(str.c_str());
11865f8d604246976a93a73549b07bbc8ee0b2061b50John McCall  DCHECK(*value_bstr);
11875f8d604246976a93a73549b07bbc8ee0b2061b50John McCall
11885f8d604246976a93a73549b07bbc8ee0b2061b50John McCall  return S_OK;
11895f8d604246976a93a73549b07bbc8ee0b2061b50John McCall}
11905f8d604246976a93a73549b07bbc8ee0b2061b50John McCall
11915f8d604246976a93a73549b07bbc8ee0b2061b50John McCallstring16 BrowserAccessibilityWin::Escape(string16 str) {
11925f8d604246976a93a73549b07bbc8ee0b2061b50John McCall  return EscapeQueryParamValueUTF8(str, false);
11935caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner}
11945caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner
11955caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattnerconst string16& BrowserAccessibilityWin::TextForIAccessibleText() {
11965caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
11975caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    return value_;
11985caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  } else {
11995caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    return name_;
12005caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  }
120160d7b3a319d84d688752be3870615ac0f111fb16John McCall}
120260d7b3a319d84d688752be3870615ac0f111fb16John McCall
1203d201457cc781f1b13d0f4b1268ff934e6004cbffChandler CarruthLONG BrowserAccessibilityWin::FindBoundary(
12045caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    const string16& text,
12055caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    IA2TextBoundaryType boundary,
12065caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    LONG start_offset,
12075caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    LONG direction) {
1208d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth  LONG text_size = static_cast<LONG>(text.size());
1209d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth  DCHECK(start_offset >= 0 && start_offset <= text_size);
1210d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth  DCHECK(direction == 1 || direction == -1);
1211d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth
1212d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth  if (boundary == IA2_TEXT_BOUNDARY_CHAR) {
1213d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth    if (direction == 1 && start_offset < text_size)
12141eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      return start_offset + 1;
12155caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    else
12165caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      return start_offset;
12175caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  }
12185caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner
1219d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth  LONG result = start_offset;
12205caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  for (;;) {
12218c382060c9e6668a94f1485dd16f012cda526c5fEli Friedman    LONG pos;
12228c382060c9e6668a94f1485dd16f012cda526c5fEli Friedman    if (direction == 1) {
12238c382060c9e6668a94f1485dd16f012cda526c5fEli Friedman      if (result >= text_size)
12248c382060c9e6668a94f1485dd16f012cda526c5fEli Friedman        return text_size;
12258c382060c9e6668a94f1485dd16f012cda526c5fEli Friedman      pos = result;
12268c382060c9e6668a94f1485dd16f012cda526c5fEli Friedman    } else {
1227f85e193739c953358c865005855253af4f68a497John McCall      if (result <= 0)
1228f85e193739c953358c865005855253af4f68a497John McCall        return 0;
1229d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth      pos = result - 1;
1230d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth    }
1231d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth
1232d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth    switch (boundary) {
12331eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      case IA2_TEXT_BOUNDARY_WORD:
1234f85e193739c953358c865005855253af4f68a497John McCall        if (IsWhitespace(text[pos]))
1235dd5fa7a21ca9db9d620001ca977681a1b724e3feChris Lattner          return result;
1236d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth        break;
1237d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth      case IA2_TEXT_BOUNDARY_LINE:
1238d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth      case IA2_TEXT_BOUNDARY_PARAGRAPH:
1239d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth        if (text[pos] == '\n')
1240d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth          return result;
12415caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      case IA2_TEXT_BOUNDARY_SENTENCE:
1242f85e193739c953358c865005855253af4f68a497John McCall        // Note that we don't actually have to implement sentence support;
1243f85e193739c953358c865005855253af4f68a497John McCall        // currently IAccessibleText functions return S_FALSE so that
1244f85e193739c953358c865005855253af4f68a497John McCall        // screenreaders will handle it on their own.
1245f85e193739c953358c865005855253af4f68a497John McCall        if ((text[pos] == '.' || text[pos] == '!' || text[pos] == '?') &&
1246f85e193739c953358c865005855253af4f68a497John McCall            (pos == text_size - 1 || IsWhitespace(text[pos + 1]))) {
1247f85e193739c953358c865005855253af4f68a497John McCall          return result;
1248f85e193739c953358c865005855253af4f68a497John McCall        }
1249f85e193739c953358c865005855253af4f68a497John McCall      case IA2_TEXT_BOUNDARY_ALL:
1250f85e193739c953358c865005855253af4f68a497John McCall      default:
1251b8b0313e84700b5c6d597b3be4de41c97b7550f1Argyrios Kyrtzidis        break;
1252f85e193739c953358c865005855253af4f68a497John McCall    }
1253f85e193739c953358c865005855253af4f68a497John McCall
1254f85e193739c953358c865005855253af4f68a497John McCall    if (direction > 0) {
1255f85e193739c953358c865005855253af4f68a497John McCall      result++;
1256b45ae256cfd5ef3ab22b4d715159f978d8120d45John McCall    } else if (direction < 0) {
1257b45ae256cfd5ef3ab22b4d715159f978d8120d45John McCall      result--;
1258b45ae256cfd5ef3ab22b4d715159f978d8120d45John McCall    } else {
12598d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth      NOTREACHED();
12608d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth      return result;
12618d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth    }
12628d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth  }
12635caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner}
12645caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner
12655caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattnervoid BrowserAccessibilityWin::InitRoleAndState() {
12665caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  ia_state_ = 0;
12675caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  ia2_state_ = IA2_STATE_OPAQUE;
12685caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner
12691eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if ((state_ >> WebAccessibility::STATE_CHECKED) & 1)
12705caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_ |= STATE_SYSTEM_CHECKED;
12715caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_COLLAPSED) & 1)
12725caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_COLLAPSED;
12735caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_EXPANDED) & 1)
12745caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_EXPANDED;
12755caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_FOCUSABLE) & 1)
12761eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ia_state_|= STATE_SYSTEM_FOCUSABLE;
12775caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_HASPOPUP) & 1)
12785caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_HASPOPUP;
12795caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_HOTTRACKED) & 1)
12805caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_HOTTRACKED;
12815caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_INDETERMINATE) & 1)
12821eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    ia_state_|= STATE_SYSTEM_INDETERMINATE;
12835caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_INVISIBLE) & 1)
12845caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_INVISIBLE;
12855caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_LINKED) & 1)
128623aa9c8ca0bc441aab2a38a4c9fc7a1c9e9ac16aChris Lattner    ia_state_|= STATE_SYSTEM_LINKED;
128723aa9c8ca0bc441aab2a38a4c9fc7a1c9e9ac16aChris Lattner  if ((state_ >> WebAccessibility::STATE_MULTISELECTABLE) & 1)
12885caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_MULTISELECTABLE;
12891eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect.
12901eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if ((state_ >> WebAccessibility::STATE_OFFSCREEN) & 1)
12915caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_OFFSCREEN;
12925caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_PRESSED) & 1)
1293199c3d6cd16aebbb9c7f0d42af9d922c9628bf70Ken Dyck    ia_state_|= STATE_SYSTEM_PRESSED;
12945caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_PROTECTED) & 1)
12955caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_PROTECTED;
12965caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_SELECTABLE) & 1)
12975caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_SELECTABLE;
12985caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_SELECTED) & 1)
12995caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_SELECTED;
1300d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth  if ((state_ >> WebAccessibility::STATE_READONLY) & 1)
1301d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth    ia_state_|= STATE_SYSTEM_READONLY;
1302d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth  if ((state_ >> WebAccessibility::STATE_TRAVERSED) & 1)
13035caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_TRAVERSED;
13041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  if ((state_ >> WebAccessibility::STATE_BUSY) & 1)
13055caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_BUSY;
13065caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  if ((state_ >> WebAccessibility::STATE_UNAVAILABLE) & 1)
13075caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    ia_state_|= STATE_SYSTEM_UNAVAILABLE;
13085caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner
13097814e6d6645d587891293d59ecf6576defcfac92Douglas Gregor  ia_role_ = 0;
13105caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  ia2_role_ = 0;
13115caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner  switch (role_) {
1312b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    case WebAccessibility::ROLE_ALERT:
1313a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_ALERT_DIALOG:
1314a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_ALERT;
1315a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1316a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_APPLICATION:
1317a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_APPLICATION;
1318a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1319a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_ARTICLE:
1320a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_GROUPING;
1321a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_role_ = IA2_ROLE_SECTION;
1322a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1323a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_BUTTON:
1324a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_PUSHBUTTON;
1325a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1326a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_CELL:
1327a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_CELL;
1328a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1329a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_CHECKBOX:
1330a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_CHECKBUTTON;
1331a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1332a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_COLOR_WELL:
1333a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_CLIENT;
1334a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_role_ = IA2_ROLE_COLOR_CHOOSER;
1335a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1336a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_COLUMN:
1337a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_COLUMN;
1338a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1339a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_COLUMN_HEADER:
1340a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_COLUMNHEADER;
1341a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1342a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_COMBO_BOX:
1343a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_COMBOBOX;
1344a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1345a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_DEFINITION_LIST_DEFINITION:
1346a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_);
1347a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_role_ = IA2_ROLE_PARAGRAPH;
1348a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1349a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_DEFINITION_LIST_TERM:
1350a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_LISTITEM;
1351a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1352a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_DIALOG:
1353a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_DIALOG;
1354a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1355a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_DOCUMENT:
1356a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_WEB_AREA:
1357a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_DOCUMENT;
1358a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_state_|= STATE_SYSTEM_READONLY;
1359a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_state_|= STATE_SYSTEM_FOCUSABLE;
1360a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1361a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_EDITABLE_TEXT:
1362a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_TEXT;
1363a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_state_ |= IA2_STATE_SINGLE_LINE;
1364a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_state_ |= IA2_STATE_EDITABLE;
1365a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1366a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_GRID:
1367a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_TABLE;
1368a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1369a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_GROUP:
1370a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_);
1371a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      if (role_name_.empty())
1372a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor        role_name_ = L"div";
1373a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_role_ = IA2_ROLE_SECTION;
1374a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1375a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_HEADING:
1376a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_);
1377a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_role_ = IA2_ROLE_HEADING;
1378a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1379a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_IMAGE:
1380a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_GRAPHIC;
1381a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1382a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_IMAGE_MAP:
1383a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      GetAttribute(WebAccessibility::ATTR_HTML_TAG, &role_name_);
1384a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_role_ = IA2_ROLE_IMAGE_MAP;
1385a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1386a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_IMAGE_MAP_LINK:
1387a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_LINK;
1388a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_state_|= STATE_SYSTEM_LINKED;
1389a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1390a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LANDMARK_APPLICATION:
1391a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LANDMARK_BANNER:
1392a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LANDMARK_COMPLEMENTARY:
1393a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LANDMARK_CONTENTINFO:
1394a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LANDMARK_MAIN:
1395a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LANDMARK_NAVIGATION:
1396a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LANDMARK_SEARCH:
1397a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_GROUPING;
1398a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_role_ = IA2_ROLE_SECTION;
1399a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1400a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LINK:
1401a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_WEBCORE_LINK:
14021eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      ia_role_ = ROLE_SYSTEM_LINK;
14035caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      ia_state_|= STATE_SYSTEM_LINKED;
1404a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1405a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LIST:
1406a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_LIST;
1407a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1408a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LISTBOX:
14097eff7c4153faf45b19b5919ef409ee5f6794eb25Daniel Dunbar      ia_role_ = ROLE_SYSTEM_LIST;
14105caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      break;
14115caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_LISTBOX_OPTION:
1412a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_LIST_ITEM:
14135caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_LIST_MARKER:
1414a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_LISTITEM;
1415a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1416a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_MENU:
1417a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_MENU_BUTTON:
1418a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_MENUPOPUP;
14197eff7c4153faf45b19b5919ef409ee5f6794eb25Daniel Dunbar      break;
14205caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_MENU_BAR:
14218d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth      ia_role_ = ROLE_SYSTEM_MENUBAR;
14225caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      break;
1423a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_MENU_ITEM:
1424a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_MENU_LIST_OPTION:
1425a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_MENUITEM;
1426a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1427a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_MENU_LIST_POPUP:
1428a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_MENUPOPUP;
1429a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1430a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_NOTE:
1431a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_GROUPING;
1432a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_role_ = IA2_ROLE_NOTE;
14335caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      break;
1434a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_OUTLINE:
1435a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_OUTLINE;
1436a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1437a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_POPUP_BUTTON:
1438a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_COMBOBOX;
14397eff7c4153faf45b19b5919ef409ee5f6794eb25Daniel Dunbar      break;
14405caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_PROGRESS_INDICATOR:
14418d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth      ia_role_ = ROLE_SYSTEM_PROGRESSBAR;
14425caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      break;
1443a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_RADIO_BUTTON:
1444a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_RADIOBUTTON;
1445a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1446a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_RADIO_GROUP:
1447a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_GROUPING;
1448a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia2_role_ = IA2_ROLE_SECTION;
1449a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      break;
1450a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor    case WebAccessibility::ROLE_REGION:
1451a9766411aaaa1446a5da96dc5042de8da05d89bdDouglas Gregor      ia_role_ = ROLE_SYSTEM_GROUPING;
14525caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      ia2_role_ = IA2_ROLE_SECTION;
14531eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
14545caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_ROW:
14555caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      ia_role_ = ROLE_SYSTEM_ROW;
1456d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth      break;
1457d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth    case WebAccessibility::ROLE_ROW_HEADER:
1458d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth      ia_role_ = ROLE_SYSTEM_ROWHEADER;
1459d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth      break;
1460d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth    case WebAccessibility::ROLE_RULER:
1461d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth      ia_role_ = ROLE_SYSTEM_CLIENT;
14621eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      ia2_role_ = IA2_ROLE_RULER;
1463e7ac0a94f1dee3fae9292eb8372962b6d70b3e0dChris Lattner      break;
1464e7ac0a94f1dee3fae9292eb8372962b6d70b3e0dChris Lattner    case WebAccessibility::ROLE_SCROLLAREA:
1465e7ac0a94f1dee3fae9292eb8372962b6d70b3e0dChris Lattner      ia_role_ = ROLE_SYSTEM_CLIENT;
1466e7ac0a94f1dee3fae9292eb8372962b6d70b3e0dChris Lattner      ia2_role_ = IA2_ROLE_SCROLL_PANE;
14672ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara      break;
14682ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara    case WebAccessibility::ROLE_SCROLLBAR:
14692ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara      ia_role_ = ROLE_SYSTEM_SCROLLBAR;
14702ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara      break;
14712ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara    case WebAccessibility::ROLE_SLIDER:
14722ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara      ia_role_ = ROLE_SYSTEM_SLIDER;
14732ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara      break;
14742ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara    case WebAccessibility::ROLE_SPLIT_GROUP:
14752ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara      ia_role_ = ROLE_SYSTEM_CLIENT;
14762ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara      ia2_role_ = IA2_ROLE_SPLIT_PANE;
14772ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara      break;
14782ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara    case WebAccessibility::ROLE_ANNOTATION:
14792ad11cd666f8e80463b5fd155072633f8e1283a4Abramo Bagnara    case WebAccessibility::ROLE_STATIC_TEXT:
1480d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth      ia_role_ = ROLE_SYSTEM_TEXT;
1481f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      break;
1482f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall    case WebAccessibility::ROLE_STATUS:
1483f871d0cc377a1367b519a6cce26be74607566ebaJohn McCall      ia_role_ = ROLE_SYSTEM_STATUSBAR;
14845caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      break;
1485429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley    case WebAccessibility::ROLE_TAB:
14861eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      ia_role_ = ROLE_SYSTEM_PAGETAB;
14875caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      break;
14885caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_TABLE:
1489b45ae256cfd5ef3ab22b4d715159f978d8120d45John McCall      ia_role_ = ROLE_SYSTEM_TABLE;
1490b45ae256cfd5ef3ab22b4d715159f978d8120d45John McCall      break;
1491b45ae256cfd5ef3ab22b4d715159f978d8120d45John McCall    case WebAccessibility::ROLE_TABLE_HEADER_CONTAINER:
1492b45ae256cfd5ef3ab22b4d715159f978d8120d45John McCall      ia_role_ = ROLE_SYSTEM_GROUPING;
1493429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley      ia2_role_ = IA2_ROLE_SECTION;
1494d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth      break;
14951eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case WebAccessibility::ROLE_TAB_GROUP:
14965caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_TAB_LIST:
14975caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_TAB_PANEL:
14985caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      ia_role_ = ROLE_SYSTEM_PAGETABLIST;
14995caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      break;
15005caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_TEXTAREA:
15011eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      ia_role_ = ROLE_SYSTEM_TEXT;
1502b45ae256cfd5ef3ab22b4d715159f978d8120d45John McCall      ia2_state_ |= IA2_STATE_MULTI_LINE;
15035caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      ia2_state_ |= IA2_STATE_EDITABLE;
15041eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
1505bbcb7ea8a062a8f1d5cb504e4518a5d4fbab873aDouglas Gregor    case WebAccessibility::ROLE_TEXT_FIELD:
1506bbcb7ea8a062a8f1d5cb504e4518a5d4fbab873aDouglas Gregor      ia_role_ = ROLE_SYSTEM_TEXT;
1507bbcb7ea8a062a8f1d5cb504e4518a5d4fbab873aDouglas Gregor      ia2_state_ |= IA2_STATE_SINGLE_LINE;
1508bbcb7ea8a062a8f1d5cb504e4518a5d4fbab873aDouglas Gregor      ia2_state_ |= IA2_STATE_EDITABLE;
1509bbcb7ea8a062a8f1d5cb504e4518a5d4fbab873aDouglas Gregor      break;
1510bbcb7ea8a062a8f1d5cb504e4518a5d4fbab873aDouglas Gregor    case WebAccessibility::ROLE_TOOLBAR:
1511e4b92761b43ced611c417ae478568610f1ad7b1eAbramo Bagnara      ia_role_ = ROLE_SYSTEM_TOOLBAR;
1512bbcb7ea8a062a8f1d5cb504e4518a5d4fbab873aDouglas Gregor      break;
1513f4b88a45902af1802a1cb42ba48b1c474474f228John McCall    case WebAccessibility::ROLE_TOOLTIP:
1514bbcb7ea8a062a8f1d5cb504e4518a5d4fbab873aDouglas Gregor      ia_role_ = ROLE_SYSTEM_TOOLTIP;
1515a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman      break;
1516bbcb7ea8a062a8f1d5cb504e4518a5d4fbab873aDouglas Gregor    case WebAccessibility::ROLE_TREE:
15171eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      ia_role_ = ROLE_SYSTEM_OUTLINE;
15185caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner      break;
1519a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman    case WebAccessibility::ROLE_TREE_GRID:
1520a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman      ia_role_ = ROLE_SYSTEM_OUTLINE;
1521a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman      break;
1522a6c66cedc022c9e5d45a937d6b8cff491a6bf81bEli Friedman    case WebAccessibility::ROLE_TREE_ITEM:
1523429bb276991ff2dbc7c5b438828b9b7737cb15ebJohn Wiegley      ia_role_ = ROLE_SYSTEM_OUTLINEITEM;
15241eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump      break;
1525db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth    case WebAccessibility::ROLE_WINDOW:
1526db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth      ia_role_ = ROLE_SYSTEM_WINDOW;
1527db4325b098eff5e9e660db19f0148423fb21f27fChandler Carruth      break;
15288d13d221cf7c1657404c611efaadf3ac19d899b3Chandler Carruth
1529d201457cc781f1b13d0f4b1268ff934e6004cbffChandler Carruth    // TODO(dmazzoni): figure out the proper MSAA role for all of these.
15303fe198bf0d6118c7b080c17c3bb28d7c84e458b9Benjamin Kramer    case WebAccessibility::ROLE_BROWSER:
15315caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_BUSY_INDICATOR:
15325caa370ea6f70bd3e7e4a9cc3b69ac1a849c8534Chris Lattner    case WebAccessibility::ROLE_DIRECTORY:
1533690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner    case WebAccessibility::ROLE_DISCLOSURE_TRIANGLE:
153471993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    case WebAccessibility::ROLE_DRAWER:
1535fd942628abfe30e30427875db953222ae99b4325Steve Naroff    case WebAccessibility::ROLE_GROW_AREA:
1536fd942628abfe30e30427875db953222ae99b4325Steve Naroff    case WebAccessibility::ROLE_HELP_TAG:
1537690398188ea5b428f06aa13c7d4ce6eb741ad4f9Chris Lattner    case WebAccessibility::ROLE_IGNORED:
153856f349400c5932a196509c0480ff6f99a9a0b48fChris Lattner    case WebAccessibility::ROLE_INCREMENTOR:
153971993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    case WebAccessibility::ROLE_LOG:
154071993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    case WebAccessibility::ROLE_MARQUEE:
15415cee1195584fa8672253139c86e922daeda69b9eDouglas Gregor    case WebAccessibility::ROLE_MATH:
1542fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner    case WebAccessibility::ROLE_MATTE:
1543fa25bbb351f4fdd977f51254119cdfc2b525ce90Chris Lattner    case WebAccessibility::ROLE_RULER_MARKER:
15449cdc4d3834f203dcde3ff274b8928e4620a914d5Anders Carlsson    case WebAccessibility::ROLE_SHEET:
154571993dd85eed9cc42c6b2fa61ee5c53026b74817Anders Carlsson    case WebAccessibility::ROLE_SLIDER_THUMB:
15461eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    case WebAccessibility::ROLE_SPLITTER:
15477da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian    case WebAccessibility::ROLE_SYSTEM_WIDE:
15485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    case WebAccessibility::ROLE_TIMER:
15497da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian    case WebAccessibility::ROLE_VALUE_INDICATOR:
15505f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner    default:
155131ba6135375433b617a8587ea6cc836a014ebd86Roman Divacky      ia_role_ = ROLE_SYSTEM_CLIENT;
15527da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian      break;
15537da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian  }
15547da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian
15557da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian  // The role should always be set.
15567da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian  DCHECK(!role_name_.empty() || ia_role_);
15577da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian
15587da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian  // If we didn't explicitly set the IAccessible2 role, make it the same
15597da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian  // as the MSAA role.
15607da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian  if (!ia2_role_)
15617da71020b97c69b95831bd03d35e8e8404bfdea0Fariborz Jahanian    ia2_role_ = ia_role_;
15629cdc4d3834f203dcde3ff274b8928e4620a914d5Anders Carlsson}
156359907c4d8f6fc8aacfdaa0273bd7a9c140fbb45fChris Lattner