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