15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_win.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <UIAutomationClient.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <UIAutomationCoreApi.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_split.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/enum_variant.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/scoped_comptr.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_manager_win.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "content/browser/accessibility/browser_accessibility_state_impl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/accessibility_messages.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/public/common/content_client.h" 21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/accessibility/ax_text_utils.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/base/win/accessibility_ids_win.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/accessibility_misc_utils.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These nonstandard GUIDs are taken directly from the Mozilla sources 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (accessible/src/msaa/nsAccessNodeWrap.cpp); some documentation is here: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://developer.mozilla.org/en/Accessibility/AT-APIs/ImplementationFeatures/MSAA 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GUID GUID_ISimpleDOM = { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0c539790, 0x12e4, 0x11cf, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8}; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GUID GUID_IAccessibleContentDocument = { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0xa5d8e1f3, 0x3571, 0x4d8f, 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0x95, 0x21, 0x07, 0xed, 0x28, 0xfb, 0x07, 0x2e}; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 BrowserAccessibilityWin::kEmbeddedCharacter[] = L"\xfffc"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LONG BrowserAccessibilityWin::next_unique_id_win_ = 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kFirstBrowserAccessibilityManagerAccessibilityId; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserAccessibilityRelation 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple implementation of IAccessibleRelation, used to represent 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a relationship between two accessible nodes in the tree. 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserAccessibilityRelation 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public CComObjectRootEx<CComMultiThreadModel>, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public IAccessibleRelation { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BEGIN_COM_MAP(BrowserAccessibilityRelation) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COM_INTERFACE_ENTRY(IAccessibleRelation) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) END_COM_MAP() 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT BrowserAccessibilityRelation() {} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT virtual ~BrowserAccessibilityRelation() {} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT void Initialize(BrowserAccessibilityWin* owner, 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& type); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT void AddTarget(int target_id); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IAccessibleRelation methods. 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_relationType(BSTR* relation_type); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_nTargets(long* n_targets); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_target(long target_index, IUnknown** target); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_targets(long max_targets, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown** targets, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_targets); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IAccessibleRelation methods not implemented. 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_localizedRelationType(BSTR* relation_type) { 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 type_; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedComPtr<BrowserAccessibilityWin> owner_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> target_ids_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityRelation::Initialize(BrowserAccessibilityWin* owner, 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& type) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owner_ = owner; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_ = type; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityRelation::AddTarget(int target_id) { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_ids_.push_back(target_id); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_relationType( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* relation_type) { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relation_type) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *relation_type = SysAllocString(type_.c_str()); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*relation_type); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_nTargets(long* n_targets) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_targets) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = static_cast<long>(target_ids_.size()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityManager* manager = owner_->manager(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = *n_targets - 1; i >= 0; --i) { 1170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility* result = manager->GetFromID(target_ids_[i]); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !result->instance_active()) { 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = 0; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_target(long target_index, 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** target) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_index < 0 || 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_index >= static_cast<long>(target_ids_.size())) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityManager* manager = owner_->manager(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = 1410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager->GetFromID(target_ids_[target_index]); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !result->instance_active()) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *target = static_cast<IAccessible*>( 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->ToBrowserAccessibilityWin()->NewReference()); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_targets(long max_targets, 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** targets, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_targets) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!targets || !n_targets) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long count = static_cast<long>(target_ids_.size()); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count > max_targets) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count = max_targets; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = count; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = 0; i < count; ++i) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT result = get_target(i, &targets[i]); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != S_OK) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserAccessibilityWin 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibility* BrowserAccessibility::Create() { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CComObject<BrowserAccessibilityWin>* instance; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SUCCEEDED(hr)); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance->NewReference(); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibility::ToBrowserAccessibilityWin() { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<BrowserAccessibilityWin*>(this); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin::BrowserAccessibilityWin() 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ia_role_(0), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_(0), 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_(0), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_(0), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_time_(true), 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) old_ia_state_(0), 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) previous_scroll_x_(0), 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) previous_scroll_y_(0) { 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start unique IDs at -1 and decrement each time, because get_accChild 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // uses positive IDs to enumerate children, so we use negative IDs to 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // clearly distinguish between indices and unique IDs. 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unique_id_win_ = next_unique_id_win_; 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (next_unique_id_win_ == 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kLastBrowserAccessibilityManagerAccessibilityId) { 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_unique_id_win_ = 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kFirstBrowserAccessibilityManagerAccessibilityId; 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_unique_id_win_--; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin::~BrowserAccessibilityWin() { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < relations_.size(); ++i) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->Release(); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessible methods. 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Conventions: 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// * Always test for instance_active() first and return E_FAIL if it's false. 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Always check for invalid arguments first, even if they're unused. 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Return S_FALSE if the only output is a string argument and it's empty. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BrowserAccessibilityWin::accDoDefaultAction(VARIANT var_id) { 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->DoDefaultAction(*target); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accHitTest(LONG x_left, 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG y_top, 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* child) { 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!child) 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(x_left, y_top); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetGlobalBoundsRect().Contains(point)) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return S_FALSE and VT_EMPTY when the outside the object's boundaries. 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_EMPTY; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = BrowserAccessibilityForPoint(point); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == this) { 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Point is within this object. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_I4; 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->lVal = CHILDID_SELF; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_DISPATCH; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* y_top, 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* width, 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* height, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT var_id) { 272a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!x_left || !y_top || !width || !height) 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = target->GetGlobalBoundsRect(); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x_left = bounds.x(); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y_top = bounds.y(); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *width = bounds.width(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *height = bounds.height(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accNavigate(LONG nav_dir, 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT start, 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT* end) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(start); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) && 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start.lVal != CHILDID_SELF) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MSAA states that navigating to first/last child can only be from self. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 child_count = target->PlatformChildCount(); 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = NULL; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (nav_dir) { 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_DOWN: 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_UP: 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_LEFT: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_RIGHT: 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These directions are not implemented, matching Mozilla and IE. 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_FIRSTCHILD: 315f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (child_count > 0) 316f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result = target->PlatformGetChild(0); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_LASTCHILD: 319f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (child_count > 0) 320f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result = target->PlatformGetChild(child_count - 1); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_NEXT: 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->GetNextSibling(); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_PREVIOUS: 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->GetPreviousSibling(); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) { 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->vt = VT_EMPTY; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->vt = VT_DISPATCH; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child, 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDispatch** disp_child) { 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!disp_child) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *disp_child = NULL; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_child); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*disp_child) = target->NewReference(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accChildCount(LONG* child_count) { 359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!child_count) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3650f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) *child_count = PlatformChildCount(); 3660f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accDefaultAction(VARIANT var_id, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* def_action) { 372a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!def_action) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 3835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_SHORTCUT, def_action); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accDescription(VARIANT var_id, 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* desc) { 388a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!desc) 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 3995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION, desc); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accFocus(VARIANT* focus_child) { 403a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!focus_child) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* focus = static_cast<BrowserAccessibilityWin*>( 410a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->GetFocus(this)); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focus == this) { 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_I4; 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->lVal = CHILDID_SELF; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (focus == NULL) { 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_EMPTY; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_DISPATCH; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->pdispVal = focus->NewReference(); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accHelp(VARIANT var_id, BSTR* help) { 425a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!help) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_HELP, help); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accKeyboardShortcut(VARIANT var_id, 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* acc_key) { 441a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!acc_key) 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_SHORTCUT, acc_key); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) { 456a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!name) 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4663551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string name_str = target->name(); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the name is empty, see if it's labeled by another element. 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_str.empty()) { 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int title_elem_id; 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (target->GetIntAttribute(ui::AX_ATTR_TITLE_UI_ELEMENT, 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &title_elem_id)) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* title_elem = 4740529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(title_elem_id); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title_elem) 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_str = title_elem->GetTextRecursive(); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_str.empty()) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *name = SysAllocString(base::UTF8ToUTF16(name_str).c_str()); 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*name); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) { 490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!disp_parent) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 496a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IAccessible* parent_obj = GetParent()->ToBrowserAccessibilityWin(); 497a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (parent_obj == NULL) { 4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This happens if we're the root of the tree; 4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the IAccessible for the window. 500a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) parent_obj = 501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->parent_iaccessible(); 50290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |parent| can only be NULL if the manager was created before the parent 50390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // IAccessible was known and it wasn't subsequently set before a client 504a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // requested it. This has been fixed. |parent| may also be NULL during 505a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // destruction. Possible cases where this could occur include tabs being 506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // dragged to a new window, etc. 507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!parent_obj) { 508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DVLOG(1) << "In Function: " 509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << __FUNCTION__ 510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << ". Parent IAccessible interface is NULL. Returning failure"; 511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return E_FAIL; 512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 514a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) parent_obj->AddRef(); 515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *disp_parent = parent_obj; 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accRole(VARIANT var_id, 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT* role) { 521a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!role) 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target->role_name_.empty()) { 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->vt = VT_BSTR; 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->bstrVal = SysAllocString(target->role_name_.c_str()); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->vt = VT_I4; 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->lVal = target->ia_role_; 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accState(VARIANT var_id, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* state) { 543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!state) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->vt = VT_I4; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->lVal = target->ia_state_; 555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (manager()->GetFocus(NULL) == this) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->lVal |= STATE_SYSTEM_FOCUSED; 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accValue(VARIANT var_id, 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* value) { 563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5733551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (target->ia_role() == ROLE_SYSTEM_PROGRESSBAR || 5743551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) target->ia_role() == ROLE_SYSTEM_SCROLLBAR || 5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) target->ia_role() == ROLE_SYSTEM_SLIDER) { 576a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 value_text = target->GetValueText(); 5773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *value = SysAllocString(value_text.c_str()); 5783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(*value); 5793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return S_OK; 5803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Expose color well value. 5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (target->ia2_role() == IA2_ROLE_COLOR_CHOOSER) { 5843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int r = target->GetIntAttribute( 5855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_COLOR_VALUE_RED); 5863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int g = target->GetIntAttribute( 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_COLOR_VALUE_GREEN); 5883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int b = target->GetIntAttribute( 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_COLOR_VALUE_BLUE); 590a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 value_text; 5913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value_text = base::IntToString16((r * 100) / 255) + L"% red " + 5923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::IntToString16((g * 100) / 255) + L"% green " + 5933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::IntToString16((b * 100) / 255) + L"% blue"; 5943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *value = SysAllocString(value_text.c_str()); 5953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(*value); 5963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return S_OK; 5973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = SysAllocString(base::UTF8ToUTF16(target->value()).c_str()); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*value); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accHelpTopic(BSTR* help_file, 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT var_id, 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* topic_id) { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) { 611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 614a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() != ui::AX_ROLE_LIST_BOX) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long selected_count = 0; 618a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < InternalChildCount(); ++i) { 619a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++selected_count; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_count == 0) { 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_EMPTY; 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_count == 1) { 629a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < InternalChildCount(); ++i) { 630a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) { 6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_DISPATCH; 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->pdispVal = 633a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference(); 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Multiple items are selected. 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::EnumVariant* enum_variant = 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::win::EnumVariant(selected_count); 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->AddRef(); 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long index = 0; 644a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < InternalChildCount(); ++i) { 645a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->ItemAt(index)->vt = VT_DISPATCH; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->ItemAt(index)->pdispVal = 648a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference(); 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_UNKNOWN; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->punkVal = static_cast<IUnknown*>( 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<base::win::IUnknownImpl*>(enum_variant)); 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accSelect( 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG flags_sel, VARIANT var_id) { 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags_sel & SELFLAG_TAKEFOCUS) { 664a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetFocus(this, true); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessible2 methods. 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::role(LONG* role) { 676a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!role) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *role = ia2_role_; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributes(BSTR* attributes) { 688a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attributes) 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The iaccessible2 attributes are a set of key-value pairs 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // separated by semicolons, with a colon between the key and the value. 696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 str; 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < ia2_attributes_.size(); ++i) { 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != 0) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += L';'; 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += ia2_attributes_[i]; 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str.empty()) 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *attributes = SysAllocString(str.c_str()); 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*attributes); 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_states(AccessibleStates* states) { 712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!states) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *states = ia2_state_; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_uniqueID(LONG* unique_id) { 724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!unique_id) 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 730c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *unique_id = unique_id_win_; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) { 735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window_handle) 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 741a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *window_handle = manager()->ToBrowserAccessibilityManagerWin()->parent_hwnd(); 742f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!*window_handle) 743f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return E_FAIL; 744f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) { 749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!index_in_parent) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *index_in_parent = this->GetIndexInParent(); 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nRelations(LONG* n_relations) { 760a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_relations) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_relations = relations_.size(); 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_relation( 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG relation_index, 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleRelation** relation) { 773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (relation_index < 0 || 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation_index >= static_cast<long>(relations_.size())) { 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relation) 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[relation_index]->AddRef(); 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *relation = relations_[relation_index]; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_relations( 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG max_relations, 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleRelation** relations, 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* n_relations) { 793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relations || !n_relations) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long count = static_cast<long>(relations_.size()); 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_relations = count; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = 0; i < count; ++i) { 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->AddRef(); 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations[i] = relations_[i]; 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollTo(enum IA2ScrollType scroll_type) { 813a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 816a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch gfx::Rect r = GetLocation(); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(scroll_type) { 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_TOP_LEFT: 819a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible(*this, gfx::Rect(r.x(), r.y(), 0, 0)); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_BOTTOM_RIGHT: 822a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.right(), r.bottom(), 0, 0)); 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_TOP_EDGE: 826a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.y(), r.width(), 0)); 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_BOTTOM_EDGE: 830a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.bottom(), r.width(), 0)); 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_LEFT_EDGE: 834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.y(), 0, r.height())); 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_RIGHT_EDGE: 838a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.right(), r.y(), 0, r.height())); 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_ANYWHERE: 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 843a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible(*this, r); 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 847a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this); 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollToPoint( 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2CoordinateType coordinate_type, 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG x, 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG y) { 856a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point scroll_to(x, y); 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 862a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scroll_to -= manager()->GetViewBounds().OffsetFromOrigin(); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 864a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetParent()) 865a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scroll_to += GetParent()->GetLocation().OffsetFromOrigin(); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 8685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 870a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToPoint(*this, scroll_to); 871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this); 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_groupPosition( 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* group_level, 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* similar_items_in_group, 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* position_in_group) { 880a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!group_level || !similar_items_in_group || !position_in_group) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 886a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION && 887a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent() && 888a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent()->GetRole() == ui::AX_ROLE_LIST_BOX) { 8895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *group_level = 0; 890a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *similar_items_in_group = GetParent()->PlatformChildCount(); 891a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *position_in_group = GetIndexInParent() + 1; 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 899c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// IAccessibleApplication methods. 900c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 901c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_appName(BSTR* app_name) { 903a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // No need to check |instance_active()| because this interface is 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 906c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!app_name) 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 909eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out 910eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the part before the "/". 911eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> product_components; 912eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SplitString(GetContentClient()->GetProduct(), '/', &product_components); 913eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK_EQ(2U, product_components.size()); 914eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (product_components.size() != 2) 915eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return E_FAIL; 9165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *app_name = SysAllocString(base::UTF8ToUTF16(product_components[0]).c_str()); 917c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*app_name); 918c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *app_name ? S_OK : E_FAIL; 919c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_appVersion(BSTR* app_version) { 922a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // No need to check |instance_active()| because this interface is 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 925c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!app_version) 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 928eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out 929eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the part after the "/". 930eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> product_components; 931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SplitString(GetContentClient()->GetProduct(), '/', &product_components); 932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK_EQ(2U, product_components.size()); 933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (product_components.size() != 2) 934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return E_FAIL; 9355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *app_version = 9365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SysAllocString(base::UTF8ToUTF16(product_components[1]).c_str()); 937c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*app_version); 938c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *app_version ? S_OK : E_FAIL; 939c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_toolkitName(BSTR* toolkit_name) { 942a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // No need to check |instance_active()| because this interface is 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 945c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!toolkit_name) 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is hard-coded; all products based on the Chromium engine 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will have the same toolkit name, so that assistive technology can 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // detect any Chrome-based product. 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *toolkit_name = SysAllocString(L"Chrome"); 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*toolkit_name); 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *toolkit_name ? S_OK : E_FAIL; 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_toolkitVersion( 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BSTR* toolkit_version) { 958a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // No need to check |instance_active()| because this interface is 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 961c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!toolkit_version) 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string user_agent = GetContentClient()->GetUserAgent(); 9655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *toolkit_version = SysAllocString(base::UTF8ToUTF16(user_agent).c_str()); 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*toolkit_version); 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *toolkit_version ? S_OK : E_FAIL; 968c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 9715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleImage methods. 9725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 9735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_description(BSTR* desc) { 975a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!desc) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 9825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION, desc); 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_imagePosition( 9862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum IA2CoordinateType coordinate_type, 9872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* x, 9882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* y) { 989a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 9905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!x || !y) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 9962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HWND parent_hwnd = 997a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->parent_hwnd(); 998f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!parent_hwnd) 999f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return E_FAIL; 10005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POINT top_left = {0, 0}; 10015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::ClientToScreen(parent_hwnd, &top_left); 1002a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *x = GetLocation().x() + top_left.x; 1003a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *y = GetLocation().y() + top_left.y; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 1005a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *x = GetLocation().x(); 1006a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *y = GetLocation().y(); 1007a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetParent()) { 1008a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *x -= GetParent()->GetLocation().x(); 1009a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *y -= GetParent()->GetLocation().y(); 10105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_imageSize(LONG* height, LONG* width) { 1019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!height || !width) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *height = GetLocation().height(); 1026a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *width = GetLocation().width(); 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTable methods. 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accessibleAt( 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long row, 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown** accessible) { 1038a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 10475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute( 10495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 10505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 10525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 10595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 10603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size())); 10615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10623551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 10630529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibilityWin* cell = GetFromID(cell_id); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell) { 10655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *accessible = static_cast<IAccessible*>(cell->NewReference()); 10665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *accessible = NULL; 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_caption(IUnknown** accessible) { 1074a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_childIndex(long row, 10852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 10862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* cell_index) { 1087a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 10885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_index) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 10965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute( 10985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 10995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 11015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 11085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 11093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 11105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 11113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size())); 11123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 11133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (size_t i = 0; i < unique_cell_ids.size(); ++i) { 11143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (unique_cell_ids[i] == cell_id) { 11155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_index = (long)i; 11165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnDescription(long column, 11242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* description) { 1125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 11265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 11345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 11355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 11375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 11385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (column < 0 || column >= columns) 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 11455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 11473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[i * columns + column]; 11485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>( 11490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)); 1150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) { 1151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 cell_name = cell->GetString16Attribute( 11525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_NAME); 11533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (cell_name.size() > 0) { 11543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *description = SysAllocString(cell_name.c_str()); 11555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cell->GetStringAttributeAsBstr( 11595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION, description); 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnExtentAt( 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long row, 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_columns_spanned) { 1170a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_columns_spanned) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 11795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 11805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 11825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 11835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 11905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 11913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 11925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>( 11930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)); 11945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 11965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 11975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns_spanned = colspan; 12005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnHeader( 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleTable** accessible_table, 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* starting_row_index) { 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long cell_index, 12142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* column_index) { 1215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_index) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 12225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 12233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids.size()); 12245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index < 0) 12255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index >= cell_id_count) 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = unique_cell_ids[cell_index]; 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 12310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 12325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col_index; 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 12345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 12355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &col_index)) { 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = col_index; 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nColumns(long* column_count) { 1244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_count) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 12525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns)) { 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_count = columns; 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nRows(long* row_count) { 1261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_count) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 12685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows)) { 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_count = rows; 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedChildren(long* cell_count) { 1277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_count) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): add support for selected cells/rows/columns in tables. 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_count = 0; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedColumns(long* column_count) { 1289a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_count) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_count = 0; 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedRows(long* row_count) { 1300a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_count) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_count = 0; 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowDescription(long row, 13112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* description) { 1312a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 13135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 13215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 13225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 13245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 13255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows) 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 13325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 13343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + i]; 13355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 13360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 1337a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) { 1338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 cell_name = cell->GetString16Attribute( 13395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_NAME); 13403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (cell_name.size() > 0) { 13413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *description = SysAllocString(cell_name.c_str()); 13425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cell->GetStringAttributeAsBstr( 13465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION, description); 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt(long row, 13542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 13552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows_spanned) { 1356a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 13575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_rows_spanned) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 13655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 13665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 13685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 13695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 13765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 13773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 13785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 13790529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 13805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 13825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 13835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1) { 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows_spanned = rowspan; 13865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowHeader( 13932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IAccessibleTable** accessible_table, 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* starting_column_index) { 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 13965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long cell_index, 14002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* row_index) { 1401a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index) 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 14085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 14093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids.size()); 14105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index < 0) 14115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index >= cell_id_count) 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = unique_cell_ids[cell_index]; 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 14170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 14185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_row_index; 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 14205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 14215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &cell_row_index)) { 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = cell_row_index; 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedChildren(long max_children, 14302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** children, 14312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_children) { 1432a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!children || !n_children) 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_children = 0; 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long max_columns, 14442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** columns, 14452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_columns) { 1446a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!columns || !n_columns) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns = 0; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long max_rows, 14582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** rows, 14592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows) { 1460a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rows || !n_rows) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows = 0; 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_summary(IUnknown** accessible) { 1472a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isColumnSelected( 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 1485a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isRowSelected(long row, 14972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) boolean* is_selected) { 1498a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isSelected(long row, 15102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 15112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) boolean* is_selected) { 1512a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 15135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtentsAtIndex( 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long index, 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row, 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column, 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_extents, 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_extents, 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 1530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row || !column || !row_extents || !column_extents || !is_selected) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 15375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 15383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids.size()); 15395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < 0) 15405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= cell_id_count) 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = unique_cell_ids[index]; 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 15460529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 15475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 15495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 15515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 15535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 15545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1 && 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 15565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_extents = rowspan; 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_extents = colspan; 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTable2 methods. 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_cellAt(long row, 15692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 15702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** cell) { 15715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_accessibleAt(row, column, cell); 15725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedCells(long* cell_count) { 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_nSelectedChildren(cell_count); 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedCells( 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cells, 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_selected_cells) { 1581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cells || !n_selected_cells) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_selected_cells = 0; 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long** columns, 15932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_columns) { 1594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 15955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!columns || !n_columns) 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns = 0; 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long** rows, 16062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows) { 1607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 16085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rows || !n_rows) 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows = 0; 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTableCell methods. 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnExtent( 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_columns_spanned) { 1625a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_columns_spanned) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 16335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns_spanned = colspan; 16365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells( 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cell_accessibles, 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_column_header_cells) { 1645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_accessibles || !n_column_header_cells) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_column_header_cells = 0; 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 16555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column)) { 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1659a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* table = GetParent(); 1660a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch while (table && table->GetRole() != ui::AX_ROLE_TABLE) 1661a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch table = table->GetParent(); 16625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) { 16635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table->GetIntAttribute( 16705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !table->GetIntAttribute( 16725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_ROW_COUNT, &rows)) { 16735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (columns <= 0 || rows <= 0 || column < 0 || column >= columns) 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = table->GetIntListAttribute( 16795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 16803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 16815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 16823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[i * columns + column]; 16835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 16840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 1685a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_column_header_cells)++; 16875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_column_header_cells) * sizeof(cell_accessibles[0]))); 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 16933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[i * columns + column]; 16940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility* cell = manager()->GetFromID(cell_id); 1695a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) { 1696a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*cell_accessibles)[index] = static_cast<IAccessible*>( 1697a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cell->ToBrowserAccessibilityWin()->NewReference()); 16985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 16995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long* column_index) { 1706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_index) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 17145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column)) { 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = column; 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowExtent(long* n_rows_spanned) { 1723a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_rows_spanned) 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 17315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1) { 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows_spanned = rowspan; 17345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells( 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cell_accessibles, 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_row_header_cells) { 1743a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_accessibles || !n_row_header_cells) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_row_header_cells = 0; 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 17535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row)) { 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1757a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* table = GetParent(); 1758a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch while (table && table->GetRole() != ui::AX_ROLE_TABLE) 1759a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch table = table->GetParent(); 17605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) { 17615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table->GetIntAttribute( 17685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !table->GetIntAttribute( 17705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_ROW_COUNT, &rows)) { 17715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (columns <= 0 || rows <= 0 || row < 0 || row >= rows) 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = table->GetIntListAttribute( 17775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 17783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 17795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 17803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + i]; 17810529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility* cell = manager()->GetFromID(cell_id); 1782a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) 17835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_row_header_cells)++; 17845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_row_header_cells) * sizeof(cell_accessibles[0]))); 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 17903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + i]; 17910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility* cell = manager()->GetFromID(cell_id); 1792a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) { 1793a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*cell_accessibles)[index] = static_cast<IAccessible*>( 1794a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cell->ToBrowserAccessibilityWin()->NewReference()); 17955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 17965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long* row_index) { 1803a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index) 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 18105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row)) { 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = row; 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isSelected(boolean* is_selected) { 1818a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtents( 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_index, 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_index, 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_extents, 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_extents, 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 1834a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index || 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !column_index || 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !row_extents || 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !column_extents || 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !is_selected) { 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 18495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row) && 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 18515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column) && 18525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 18535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 18545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 18555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan)) { 18565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = row; 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = column; 18585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_extents = rowspan; 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_extents = colspan; 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_table(IUnknown** table) { 1868a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 18775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row); 18785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column); 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1880a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* find_table = GetParent(); 1881a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch while (find_table && find_table->GetRole() != ui::AX_ROLE_TABLE) 1882a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch find_table = find_table->GetParent(); 18835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!find_table) { 18845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *table = static_cast<IAccessibleTable*>( 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_table->ToBrowserAccessibilityWin()->NewReference()); 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleText methods. 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { 1899a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_characters) 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_characters = TextForIAccessibleText().length(); 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) { 1910a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!offset) 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *offset = 0; 1917a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_TEXT_FIELD || 1918a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TEXT_AREA) { 19195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 19205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, 19212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &sel_start)) 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = sel_start; 19235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_characterExtents( 1929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG offset, 1930f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) enum IA2CoordinateType coordinate_type, 1931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG* out_x, 1932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG* out_y, 1933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG* out_width, 1934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG* out_height) { 1935a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 1936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_FAIL; 1937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1938f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!out_x || !out_y || !out_width || !out_height) 1939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 1940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1941a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 1942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HandleSpecialTextOffset(text_str, &offset); 1943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1944f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (offset < 0 || offset > static_cast<LONG>(text_str.size())) 1945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 1946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect character_bounds; 1948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 1949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) character_bounds = GetGlobalBoundsForRange(offset, 1); 1950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 1951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) character_bounds = GetLocalBoundsForRange(offset, 1); 1952a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch character_bounds -= GetLocation().OffsetFromOrigin(); 1953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 1954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 1955f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1956f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_x = character_bounds.x(); 1958f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_y = character_bounds.y(); 1959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_width = character_bounds.width(); 1960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_height = character_bounds.height(); 1961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return S_OK; 1963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 19655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) { 1966a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 19675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_selections) 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *n_selections = 0; 1973a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_TEXT_FIELD || 1974a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TEXT_AREA) { 19755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 19765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_end = 0; 19775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, 19782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &sel_start) && 19795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, &sel_end) && 19802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sel_start != sel_end) 19815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_selections = 1; 19825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index, 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* start_offset, 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* end_offset) { 1990a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || selection_index != 0) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *start_offset = 0; 19972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *end_offset = 0; 1998a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_TEXT_FIELD || 1999a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TEXT_AREA) { 20005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 20015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_end = 0; 20025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 20035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TEXT_SEL_START, &sel_start) && 20045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, &sel_end)) { 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = sel_start; 20065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = sel_end; 20075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset, 20142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG end_offset, 20152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* text) { 2016a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 20175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!text) 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle special text offsets. 20255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The spec allows the arguments to be reversed. 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (start_offset > end_offset) { 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG tmp = start_offset; 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_offset = end_offset; 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end_offset = tmp; 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The spec does not allow the start or end offsets to be out or range; 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we must return an error if so. 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG len = text_str.length(); 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (start_offset < 0) 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (end_offset > len) 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2043a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 substr = text_str.substr(start_offset, 2044a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) end_offset - start_offset); 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (substr.empty()) 20465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 20475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = SysAllocString(substr.c_str()); 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*text); 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textAtOffset( 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 20562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 20572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 2059a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 20605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2074a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = FindBoundary( 20775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = FindBoundary( 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset( 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 20862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 20872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 2089a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 20905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = FindBoundary( 21075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = offset; 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset( 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 21152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 21162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 2118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 21195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2133a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = offset; 21365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = FindBoundary( 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_newText(IA2TextSegment* new_text) { 2142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_text) 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2148a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text = TextForIAccessibleText(); 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->text = SysAllocString(text.c_str()); 21515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->start = 0; 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->end = static_cast<long>(text.size()); 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_oldText(IA2TextSegment* old_text) { 2157a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!old_text) 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->text = SysAllocString(old_text_.c_str()); 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->start = 0; 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->end = static_cast<long>(old_text_.size()); 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint( 21702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG x, 21712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG y, 21722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum IA2CoordinateType coord_type, 21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* offset) { 2174a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 21755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!offset) 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement this. We're returning S_OK for now so that 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // screen readers still return partially accurate results rather than 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completely failing. 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = 0; 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollSubstringTo( 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_index, 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_index, 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2ScrollType scroll_type) { 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): adjust this for the start and end index, too. 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollTo(scroll_type); 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint( 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_index, 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_index, 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2CoordinateType coordinate_type, 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG x, LONG y) { 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): adjust this for the start and end index, too. 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollToPoint(coordinate_type, x, y); 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset, 22052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG end_offset) { 2206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 22125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetTextSelection(*this, start_offset, end_offset); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) { 2218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_index != 0) 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetTextSelection(*this, 0, 0); 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) { 2229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &offset); 2234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetTextSelection(*this, offset, offset); 22355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index, 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_offset, 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_offset) { 2241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_index != 0) 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 22505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetTextSelection(*this, start_offset, end_offset); 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleHypertext methods. 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nHyperlinks(long* hyperlink_count) { 2260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink_count) 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_count = hyperlink_offset_to_index_.size(); 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_hyperlink( 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long index, 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleHyperlink** hyperlink) { 2273a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink || 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index < 0 || 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index >= static_cast<long>(hyperlinks_.size())) { 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* child = 2283a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InternalGetChild(hyperlinks_[index])->ToBrowserAccessibilityWin(); 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink = static_cast<IAccessibleHyperlink*>(child->NewReference()); 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex( 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long char_index, 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* hyperlink_index) { 2291a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink_index) 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_index = -1; 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (char_index < 0 || char_index >= static_cast<long>(hypertext_.size())) 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int32, int32>::iterator it = 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_.find(char_index); 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it == hyperlink_offset_to_index_.end()) 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_index = it->second; 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleValue methods. 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_currentValue(VARIANT* value) { 2316a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFloatAttribute( 23245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_VALUE_FOR_RANGE, &float_val)) { 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 23275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_minimumValue(VARIANT* value) { 2335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 23425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE, 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &float_val)) { 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 23455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_maximumValue(VARIANT* value) { 2354a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 23615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE, 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &float_val)) { 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 23645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setCurrentValue(VARIANT new_value) { 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMDocument methods. 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) { 2382a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url) 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetStringAttributeAsBstr(ui::AX_ATTR_DOC_URL, url); 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_title(BSTR* title) { 2392a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title) 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetStringAttributeAsBstr(ui::AX_ATTR_DOC_TITLE, title); 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_mimeType(BSTR* mime_type) { 2402a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mime_type) 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 24095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DOC_MIMETYPE, mime_type); 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_docType(BSTR* doc_type) { 2413a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!doc_type) 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 24205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DOC_DOCTYPE, doc_type); 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMNode methods. 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nodeInfo( 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* node_name, 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* node_value, 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int* num_children, 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int* unique_id, 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short* node_type) { 2434a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node_name || !name_space_id || !node_value || !num_children || 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !unique_id || !node_type) { 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2442a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 tag; 24435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetString16Attribute(ui::AX_ATTR_HTML_TAG, &tag)) 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_name = SysAllocString(tag.c_str()); 24455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 24465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_name = NULL; 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name_space_id = 0; 24495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *node_value = SysAllocString(base::UTF8ToUTF16(value()).c_str()); 2450f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *num_children = PlatformChildCount(); 2451c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *unique_id = unique_id_win_; 24525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_DOCUMENT) { 24545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_DOCUMENT; 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ia_role_ == ROLE_SYSTEM_TEXT && 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ia2_state_ & IA2_STATE_EDITABLE) == 0)) { 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_TEXT; 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_ELEMENT; 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributes( 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short max_attribs, 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_names, 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_values, 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short* num_attribs) { 2471a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attrib_names || !name_space_id || !attrib_values || !num_attribs) 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_attribs = max_attribs; 2478a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (*num_attribs > GetHtmlAttributes().size()) 2479a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *num_attribs = GetHtmlAttributes().size(); 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < *num_attribs; ++i) { 24823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_names[i] = SysAllocString( 2483a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::UTF8ToUTF16(GetHtmlAttributes()[i].first).c_str()); 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_space_id[i] = 0; 24853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_values[i] = SysAllocString( 2486a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::UTF8ToUTF16(GetHtmlAttributes()[i].second).c_str()); 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributesForNames( 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short num_attribs, 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_names, 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_values) { 2496a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attrib_names || !name_space_id || !attrib_values) 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < num_attribs; ++i) { 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_space_id[i] = 0; 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found = false; 25055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string name = base::UTF16ToUTF8((LPCWSTR)attrib_names[i]); 2506a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (unsigned int j = 0; j < GetHtmlAttributes().size(); ++j) { 2507a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetHtmlAttributes()[j].first == name) { 25083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_values[i] = SysAllocString( 2509a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::UTF8ToUTF16(GetHtmlAttributes()[j].second).c_str()); 25105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = true; 25115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!found) { 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrib_values[i] = NULL; 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_computedStyle( 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short max_style_properties, 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean use_alternate_view, 25242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* style_properties, 25252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* style_values, 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short *num_style_properties) { 2527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 25285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!style_properties || !style_values) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only cache a single style property for now: DISPLAY 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 display; 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_style_properties == 0 || 25375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetString16Attribute(ui::AX_ATTR_DISPLAY, &display)) { 25385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_style_properties = 0; 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_style_properties = 1; 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_properties[0] = SysAllocString(L"display"); 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[0] = SysAllocString(display.c_str()); 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_computedStyleForProperties( 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short num_style_properties, 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean use_alternate_view, 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* style_properties, 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* style_values) { 2554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!style_properties || !style_values) 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only cache a single style property for now: DISPLAY 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < num_style_properties; ++i) { 2563a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 name = (LPCWSTR)style_properties[i]; 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StringToLowerASCII(&name); 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == L"display") { 2566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 display = GetString16Attribute( 25675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DISPLAY); 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[i] = SysAllocString(display.c_str()); 25695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[i] = NULL; 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) { 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollTo(placeTopLeft ? 25792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IA2_SCROLL_TYPE_TOP_LEFT : IA2_SCROLL_TYPE_ANYWHERE); 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { 2583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2589a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *node = GetParent()->ToBrowserAccessibilityWin()->NewReference(); 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) { 2594a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2600f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (PlatformChildCount() == 0) { 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2605f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *node = PlatformGetChild(0)->ToBrowserAccessibilityWin()->NewReference(); 26062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) { 2610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (PlatformChildCount() == 0) { 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2621f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *node = PlatformGetChild(PlatformChildCount() - 1) 2622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ->ToBrowserAccessibilityWin()->NewReference(); 26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_previousSibling( 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISimpleDOMNode** node) { 2628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2634a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!GetParent() || GetIndexInParent() <= 0) { 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2639a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *node = GetParent()->InternalGetChild(GetIndexInParent() - 1)-> 26402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToBrowserAccessibilityWin()->NewReference(); 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) { 2645a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2651a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!GetParent() || 2652a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetIndexInParent() < 0 || 2653a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetIndexInParent() >= static_cast<int>( 2654a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent()->InternalChildCount()) - 1) { 26555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2659a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *node = GetParent()->InternalGetChild(GetIndexInParent() + 1)-> 26602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToBrowserAccessibilityWin()->NewReference(); 26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_childAt( 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int child_index, 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISimpleDOMNode** node) { 2667a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2673f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (child_index >= PlatformChildCount()) 2674f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 2675f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 26760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserAccessibility* child = PlatformGetChild(child_index); 26770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!child) { 26785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26820f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) *node = child->ToBrowserAccessibilityWin()->NewReference(); 26832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMText methods. 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) { 2691a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dom_text) 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return GetStringAttributeAsBstr( 26985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_NAME, dom_text); 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2701f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_clippedSubstringBounds( 2702f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int start_index, 2703f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int end_index, 2704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_x, 2705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_y, 2706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_width, 2707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_height) { 2708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(dmazzoni): fully support this API by intersecting the 2709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // rect with the container's rect. 2710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return get_unclippedSubstringBounds( 2711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index, end_index, out_x, out_y, out_width, out_height); 2712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_unclippedSubstringBounds( 2715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int start_index, 2716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int end_index, 2717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_x, 2718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_y, 2719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_width, 2720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_height) { 2721a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_FAIL; 2723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2724f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!out_x || !out_y || !out_width || !out_height) 2725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 2726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2727a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 2728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (start_index > text_str.size() || 2729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) end_index > text_str.size() || 2730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index > end_index) { 2731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 2732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect bounds = GetGlobalBoundsForRange( 2735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index, end_index - start_index); 2736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_x = bounds.x(); 2737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_y = bounds.y(); 2738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_width = bounds.width(); 2739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_height = bounds.height(); 2740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return S_OK; 2741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollToSubstring( 2744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int start_index, 2745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int end_index) { 2746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_FAIL; 2748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 2750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (start_index > text_str.size() || 2751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) end_index > text_str.size() || 2752f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index > end_index) { 2753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 2754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2756a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible(*this, GetLocalBoundsForRange( 2757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index, end_index - start_index)); 2758a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this); 2759f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return S_OK; 2761f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IServiceProvider methods. 27655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::QueryService(REFGUID guidService, 27682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REFIID riid, 27692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void** object) { 2770a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 27715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 27725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2773d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The system uses IAccessible APIs for many purposes, but only 2774d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // assistive technology like screen readers uses IAccessible2. 2775d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Enable full accessibility support when IAccessible2 APIs are queried. 2776d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (riid == IID_IAccessible2) 2777d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) BrowserAccessibilityStateImpl::GetInstance()->EnableAccessibility(); 2778d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 27792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guidService == GUID_IAccessibleContentDocument) { 27802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Special Mozilla extension: return the accessible for the root document. 27812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Screen readers use this to distinguish between a document loaded event 27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on the root document vs on an iframe. 2783a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return manager()->GetRoot()->ToBrowserAccessibilityWin()->QueryInterface( 27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IID_IAccessible2, object); 27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (guidService == IID_IAccessible || 27885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessible2 || 27895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleAction || 2790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) guidService == IID_IAccessibleApplication || 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleHyperlink || 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleHypertext || 27935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleImage || 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTable || 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTable2 || 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTableCell || 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleText || 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleValue || 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMDocument || 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMNode || 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMText || 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == GUID_ISimpleDOM) { 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QueryInterface(riid, object); 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only support the IAccessibleEx interface on Windows 8 and above. This 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is needed for the on-screen Keyboard to show up in metro mode, when the 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user taps an editable portion on the page. 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All methods in the IAccessibleEx interface are unimplemented. 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (riid == IID_IAccessibleEx && 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::GetVersion() >= base::win::VERSION_WIN8) { 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QueryInterface(riid, object); 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider(PATTERNID id, 28202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** provider) { 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "In Function: " 28225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << __FUNCTION__ 28235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " for pattern id: " 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << id; 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == UIA_ValuePatternId || id == UIA_TextPatternId) { 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEditableText()) { 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning UIA text provider"; 2828f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::win::UIATextProvider::CreateTextProvider( 2829f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetValueText(), true, provider); 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 28315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::GetPropertyValue(PROPERTYID id, 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* ret) { 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "In Function: " 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << __FUNCTION__ 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " for property id: " 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << id; 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V_VT(ret) = VT_EMPTY; 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == UIA_ControlTypePropertyId) { 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEditableText()) { 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V_VT(ret) = VT_I4; 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->lVal = UIA_EditControlTypeId; 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning Edit control type"; 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning empty control type"; 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CComObjectRootEx methods. 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface( 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* this_ptr, 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const _ATL_INTMAP_ENTRY* entries, 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REFIID iid, 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** object) { 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iid == IID_IAccessibleImage) { 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_GRAPHIC) { 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleTable || iid == IID_IAccessibleTable2) { 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_TABLE) { 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleTableCell) { 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_CELL) { 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleValue) { 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_PROGRESSBAR && 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_SCROLLBAR && 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_SLIDER) { 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_ISimpleDOMDocument) { 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_DOCUMENT) { 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CComObjectRootBase::InternalQueryInterface( 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this_ptr, entries, iid, object); 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Private methods. 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Called every time this node's data changes. 29020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserAccessibilityWin::OnDataChanged() { 29030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility::OnDataChanged(); 29045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitRoleAndState(); 29065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose the "display" and "tag" attributes. 29085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_DISPLAY, "display"); 29095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_HTML_TAG, "tag"); 29105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_ROLE, "xml-roles"); 29115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Expose "level" attribute for headings, trees, etc. 29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IntAttributeToIA2(ui::AX_ATTR_HIERARCHICAL_LEVEL, "level"); 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose the set size and position in set for listbox options. 2916a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION && 2917a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent() && 2918a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent()->GetRole() == ui::AX_ROLE_LIST_BOX) { 29195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back( 2920a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch L"setsize:" + base::IntToString16(GetParent()->PlatformChildCount())); 29215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back( 2922a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch L"setsize:" + base::IntToString16(GetIndexInParent() + 1)); 29235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_CHECKBUTTON || 29262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ == ROLE_SYSTEM_RADIOBUTTON || 29272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_role_ == IA2_ROLE_TOGGLE_BUTTON) { 29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_attributes_.push_back(L"checkable:true"); 29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose live region attributes. 29325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_LIVE_STATUS, "live"); 29335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_LIVE_RELEVANT, "relevant"); 29345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BoolAttributeToIA2(ui::AX_ATTR_LIVE_ATOMIC, "atomic"); 29355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BoolAttributeToIA2(ui::AX_ATTR_LIVE_BUSY, "busy"); 29365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose container live region attributes. 29385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_CONTAINER_LIVE_STATUS, 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-live"); 29405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_CONTAINER_LIVE_RELEVANT, 29415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-relevant"); 29425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BoolAttributeToIA2(ui::AX_ATTR_CONTAINER_LIVE_ATOMIC, 29435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-atomic"); 29445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BoolAttributeToIA2(ui::AX_ATTR_CONTAINER_LIVE_BUSY, 29455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-busy"); 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose slider value. 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_PROGRESSBAR || 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ == ROLE_SYSTEM_SCROLLBAR || 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ == ROLE_SYSTEM_SLIDER) { 29513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ia2_attributes_.push_back(L"valuetext:" + GetValueText()); 29522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose table cell index. 29555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_CELL) { 2956a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* table = GetParent(); 2957a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch while (table && table->GetRole() != ui::AX_ROLE_TABLE) 2958a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch table = table->GetParent(); 29595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (table) { 29603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = table->GetIntListAttribute( 29615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < unique_cell_ids.size(); ++i) { 2963a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (unique_cell_ids[i] == GetId()) { 29642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_attributes_.push_back( 2965a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(L"table-cell-index:") + base::IntToString16(i)); 29665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The calculation of the accessible name of an element has been 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // standardized in the HTML to Platform Accessibility APIs Implementation 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guide (http://www.w3.org/TR/html-aapi/). In order to return the 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appropriate accessible name on Windows, we need to apply some logic 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the fields we get from WebKit. 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): move most of this logic into WebKit. 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit gives us: 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name: the default name, e.g. inner text 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title ui element: a reference to a <label> element on the same 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page that labels this node. 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // description: accessible labels that override the default name: 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aria-label or aria-labelledby or aria-describedby 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // help: the value of the "title" attribute 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows, the logic we apply lets some fields take precedence and 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // always returns the primary name in "name" and the secondary name, 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if any, in "description". 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int title_elem_id = GetIntAttribute( 29935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TITLE_UI_ELEMENT); 29945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string help = GetStringAttribute(ui::AX_ATTR_HELP); 29953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string description = GetStringAttribute( 29965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION); 29975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit annoyingly puts the title in the description if there's no other 29995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // description, which just confuses the rest of the logic. Put it back. 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now "help" is always the value of the "title" attribute, if present. 30013551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string title_attr; 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetHtmlAttribute("title", &title_attr) && 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description == title_attr && 30045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help.empty()) { 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help = description; 30062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now implement the main logic: the descripion should become the name if 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's nonempty, and the help should become the description if 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there's no description - or the name if there's no name or description. 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description.empty()) { 3013a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_name(description); 30142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!help.empty() && description.empty()) { 30175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description = help; 30183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) help.clear(); 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3020a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!description.empty() && name().empty() && !title_elem_id) { 3021a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_name(description); 30222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 30235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it's a text field, also consider the placeholder. 30263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string placeholder; 3027a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_TEXT_FIELD && 30285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HasState(ui::AX_STATE_FOCUSABLE) && 30295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHtmlAttribute("placeholder", &placeholder)) { 3030a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (name().empty() && !title_elem_id) { 3031a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_name(placeholder); 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (description.empty()) { 30335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description = placeholder; 30345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetStringAttribute(ui::AX_ATTR_DESCRIPTION, description); 30385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetStringAttribute(ui::AX_ATTR_HELP, help); 30393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 30402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Windows, the value of a document should be its url. 3041a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || 3042a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_WEB_AREA) { 30435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_value(GetStringAttribute(ui::AX_ATTR_DOC_URL)); 30442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 30452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For certain roles (listbox option, static text, and list marker) 30475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit stores the main accessible text in the "value" - swap it so 30485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that it's the "name". 3049a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (name().empty() && 3050a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION || 3051a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_STATIC_TEXT || 3052a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_LIST_MARKER)) { 3053a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string tmp = value(); 3054a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_value(name()); 3055a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_name(tmp); 30565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this doesn't have a value and is linked then set its value to the url 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attribute. This allows screen readers to read an empty link's destination. 3060a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (value().empty() && (ia_state_ & STATE_SYSTEM_LINKED)) 30615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_value(GetStringAttribute(ui::AX_ATTR_URL)); 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear any old relationships between this node and other nodes. 30645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < relations_.size(); ++i) 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->Release(); 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_.clear(); 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle title UI element. 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title_elem_id) { 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a labelled by relationship. 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CComObject<BrowserAccessibilityRelation>* relation; 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = CComObject<BrowserAccessibilityRelation>::CreateInstance( 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &relation); 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SUCCEEDED(hr)); 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->AddRef(); 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->Initialize(this, IA2_RELATION_LABELLED_BY); 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->AddTarget(title_elem_id); 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_.push_back(relation); 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserAccessibilityWin::OnUpdateFinished() { 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct the hypertext for this node. 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_.clear(); 30855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlinks_.clear(); 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hypertext_.clear(); 30870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) for (unsigned int i = 0; i < PlatformChildCount(); ++i) { 30880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserAccessibility* child = PlatformGetChild(i); 3089a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (child->GetRole() == ui::AX_ROLE_STATIC_TEXT) { 30905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) hypertext_ += base::UTF8ToUTF16(child->name()); 30915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 30925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_[hypertext_.size()] = hyperlinks_.size(); 30935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hypertext_ += kEmbeddedCharacter; 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlinks_.push_back(i); 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(hyperlink_offset_to_index_.size(), hyperlinks_.size()); 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire an event when an alert first appears. 3100a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_ALERT && first_time_) 31015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager()->NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, this); 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire events if text has changed. 3104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text = TextForIAccessibleText(); 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (previous_text_ != text) { 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!previous_text_.empty() && !text.empty()) { 3107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->NotifyAccessibilityEvent( 31085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_EVENT_SHOW, this); 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Look into HIDE events, too. 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text_ = previous_text_; 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_text_ = text; 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserAccessibilityManagerWin* manager = 31185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this->manager()->ToBrowserAccessibilityManagerWin(); 31195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire events if the state has changed. 31215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!first_time_ && ia_state_ != old_ia_state_) { 31225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Normally focus events are handled elsewhere, however 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focus for managed descendants is platform-specific. 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire a focus event if the focused descendant in a multi-select 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list box changes. 3126a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION && 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_FOCUSABLE) && 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_SELECTABLE) && 31295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_FOCUSED) && 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(old_ia_state_ & STATE_SYSTEM_FOCUSED)) { 313190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_FOCUS, unique_id_win()); 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ia_state_ & STATE_SYSTEM_SELECTED) && 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(old_ia_state_ & STATE_SYSTEM_SELECTED)) { 313690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONADD, 313790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unique_id_win()); 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!(ia_state_ & STATE_SYSTEM_SELECTED) && 31395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (old_ia_state_ & STATE_SYSTEM_SELECTED)) { 314090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE, 314190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unique_id_win()); 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_ia_state_ = ia_state_; 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fire an event if this container object has scrolled. 31485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int sx = 0; 31495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int sy = 0; 31505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) && 31515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) { 31525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!first_time_ && 31535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (sx != previous_scroll_x_ || sy != previous_scroll_y_)) { 31545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_SYSTEM_SCROLLINGEND, 31555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unique_id_win()); 31565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) previous_scroll_x_ = sx; 31585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) previous_scroll_y_ = sy; 31595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_time_ = false; 31625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::NativeAddReference() { 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::NativeReleaseReference() { 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Release(); 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserAccessibilityWin::IsNative() const { 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserAccessibilityWin::OnLocationChanged() const { 3177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->MaybeCallNotifyWinEvent( 317890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EVENT_OBJECT_LOCATIONCHANGE, unique_id_win()); 3179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() { 31825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 31835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID( 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const VARIANT& var_id) { 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (var_id.vt != VT_I4) 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG child_id = var_id.lVal; 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_id == CHILDID_SELF) 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (child_id >= 1 && child_id <= static_cast<LONG>(PlatformChildCount())) 31960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PlatformGetChild(child_id - 1)->ToBrowserAccessibilityWin(); 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3198a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return manager()->ToBrowserAccessibilityManagerWin()-> 3199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFromUniqueIdWin(child_id); 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr( 32035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AXStringAttribute attribute, 32042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* value_bstr) { 3205a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 str; 32065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!GetString16Attribute(attribute, &str)) 32085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str.empty()) 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *value_bstr = SysAllocString(str.c_str()); 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*value_bstr); 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::StringAttributeToIA2( 32205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AXStringAttribute attribute, 32212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 3222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 value; 32233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetString16Attribute(attribute, &value)) 32245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ia2_attributes_.push_back(base::ASCIIToUTF16(ia2_attr) + L":" + value); 32255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::BoolAttributeToIA2( 32285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AXBoolAttribute attribute, 32292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool value; 32315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBoolAttribute(attribute, &value)) { 32325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ia2_attributes_.push_back((base::ASCIIToUTF16(ia2_attr) + L":") + 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (value ? L"true" : L"false")); 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::IntAttributeToIA2( 32385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AXIntAttribute attribute, 32392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value; 32413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetIntAttribute(attribute, &value)) { 32425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ia2_attributes_.push_back(base::ASCIIToUTF16(ia2_attr) + L":" + 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString16(value)); 32443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 32453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 32463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityWin::GetValueText() { 32483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) float fval; 32495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 value = base::UTF8ToUTF16(this->value()); 3250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 32513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (value.empty() && 32525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, &fval)) { 32535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) value = base::UTF8ToUTF16(base::DoubleToString(fval)); 32543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 32553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return value; 32565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityWin::TextForIAccessibleText() { 32592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsEditableText()) 32605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF8ToUTF16(value()); 3261a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return (GetRole() == ui::AX_ROLE_STATIC_TEXT) ? 32625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(name()) : hypertext_; 32635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void BrowserAccessibilityWin::HandleSpecialTextOffset( 3266a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 3267a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LONG* offset) { 32682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (*offset == IA2_TEXT_OFFSET_LENGTH) 32695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = static_cast<LONG>(text.size()); 32702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (*offset == IA2_TEXT_OFFSET_CARET) 32715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_caretOffset(offset); 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextBoundaryType BrowserAccessibilityWin::IA2TextBoundaryToTextBoundary( 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IA2TextBoundaryType ia2_boundary) { 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(ia2_boundary) { 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_CHAR: return ui::CHAR_BOUNDARY; 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_WORD: return ui::WORD_BOUNDARY; 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_LINE: return ui::LINE_BOUNDARY; 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_SENTENCE: return ui::SENTENCE_BOUNDARY; 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_PARAGRAPH: return ui::PARAGRAPH_BOUNDARY; 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_ALL: return ui::ALL_BOUNDARY; 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::CHAR_BOUNDARY; 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LONG BrowserAccessibilityWin::FindBoundary( 3290a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IA2TextBoundaryType ia2_boundary, 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_offset, 32935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextBoundaryDirection direction) { 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text, &start_offset); 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary); 32963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& line_breaks = GetIntListAttribute( 32975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_LINE_BREAKS); 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::FindAccessibleTextBoundary( 32993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) text, line_breaks, boundary, start_offset, direction); 33005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33020529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochBrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32 id) { 33030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return manager()->GetFromID(id)->ToBrowserAccessibilityWin(); 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::InitRoleAndState() { 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ = 0; 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ = IA2_STATE_OPAQUE; 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.clear(); 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_BUSY)) 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_BUSY; 33135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_CHECKED)) 33145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_CHECKED; 33155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_COLLAPSED)) 33165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_COLLAPSED; 33175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_EXPANDED)) 33185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_EXPANDED; 33195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_FOCUSABLE)) 33205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 33215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_HASPOPUP)) 33225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_HASPOPUP; 33235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_HOVERED)) 33245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_HOTTRACKED; 33255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_INDETERMINATE)) 33265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_INDETERMINATE; 33275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_INVISIBLE)) 33285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_INVISIBLE; 33295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_LINKED)) 33305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 33315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_MULTISELECTABLE)) { 33325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_EXTSELECTABLE; 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MULTISELECTABLE; 33345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect. 33365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_OFFSCREEN)) 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_OFFSCREEN; 33385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_PRESSED)) 33395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PRESSED; 33405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_PROTECTED)) 33415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PROTECTED; 33425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_REQUIRED)) 33435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_REQUIRED; 33445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_SELECTABLE)) 33455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_SELECTABLE; 33465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_SELECTED)) 33475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_SELECTED; 33485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_VISITED)) 33495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_TRAVERSED; 33505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasState(ui::AX_STATE_ENABLED)) 33515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_UNAVAILABLE; 33525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_VERTICAL)) { 33535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_VERTICAL; 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 33555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_HORIZONTAL; 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_VISITED)) 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_TRAVERSED; 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit marks everything as readonly unless it's editable text, so if it's 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not readonly, mark it as editable now. The final computation of the 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // READONLY state for MSAA is below, after the switch. 33635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasState(ui::AX_STATE_READ_ONLY)) 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3366a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 invalid; 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetHtmlAttribute("aria-invalid", &invalid)) 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_INVALID_ENTRY; 33695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetBoolAttribute(ui::AX_ATTR_BUTTON_MIXED)) 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MIXED; 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE)) 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3376a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 html_tag = GetString16Attribute( 33775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_HTML_TAG); 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = 0; 33795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = 0; 3380a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch switch (GetRole()) { 33815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ALERT: 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ALERT; 33835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ALERT_DIALOG: 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DIALOG; 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_APPLICATION: 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_APPLICATION; 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ARTICLE: 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 33935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_BUSY_INDICATOR: 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ANIMATION; 33975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_BUTTON: 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 34015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_aria_pressed_defined; 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_mixed; 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed)) 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PRESSED; 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_aria_pressed_defined) 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_mixed) 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MIXED; 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CANVAS: 34115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetBoolAttribute(ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { 341258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) role_name_ = L"canvas"; 341358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ia2_role_ = IA2_ROLE_CANVAS; 341458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 341558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 341658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 34175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CELL: 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CELL; 34205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CHECK_BOX: 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CHECKBUTTON; 34235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COLOR_WELL: 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 34265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_COLOR_CHOOSER; 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COLUMN: 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COLUMN; 34305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COLUMN_HEADER: 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COLUMNHEADER; 34345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COMBO_BOX: 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COMBOBOX; 34385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DIV: 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"div"; 34415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DEFINITION: 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 34455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL: 34492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) role_name_ = html_tag; 34502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 34512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 34535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DESCRIPTION_LIST_TERM: 34545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 34555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DIALOG: 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DIALOG; 34595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DISCLOSURE_TRIANGLE: 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINEBUTTON; 34635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DOCUMENT: 34665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ROOT_WEB_AREA: 34675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_WEB_AREA: 34685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DOCUMENT; 34695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_EDITABLE_TEXT: 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 34745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SINGLE_LINE; 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_FORM: 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"form"; 34795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_FORM; 34805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_FOOTER: 34825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = IA2_ROLE_FOOTER; 34835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_GRID: 34865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TABLE; 34875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_GROUP: { 3490a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 aria_role = GetString16Attribute( 34915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_ROLE); 34925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aria_role == L"group" || html_tag == L"fieldset") { 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (html_tag == L"li") { 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 34965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_tag.empty()) 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"div"; 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 35005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 35015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 35025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_GROW_AREA: 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRIP; 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_HEADING: 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_HEADING; 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_HORIZONTAL_RULE: 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SEPARATOR; 35175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3518c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::AX_ROLE_IFRAME: 3519c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ia_role_ = ROLE_SYSTEM_CLIENT; 3520c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ia2_role_ = IA2_ROLE_INTERNAL_FRAME; 3521c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 35225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_IMAGE: 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_IMAGE_MAP: 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_IMAGE_MAP; 35295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_IMAGE_MAP_LINK: 35325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LINK; 35335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LABEL_TEXT: 35375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_LABEL; 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_BANNER: 35415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COMPLEMENTARY: 35425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CONTENT_INFO: 35435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MAIN: 35445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_NAVIGATION: 35455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SEARCH: 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 35475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LINK: 35515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LINK; 35525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 35535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST: 35555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LIST; 35565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_BOX: 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LIST; 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_BOX_OPTION: 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 35635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_state_ & STATE_SYSTEM_SELECTABLE) { 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 35655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_FOCUSED)) 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSED; 35675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_ITEM: 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 35715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MATH_ELEMENT: 35745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_EQUATION; 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU: 35785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_BUTTON: 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUPOPUP; 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_BAR: 35825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUBAR; 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_ITEM: 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUITEM; 35865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_LIST_POPUP: 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_LIST_OPTION: 35915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_state_ & STATE_SYSTEM_SELECTABLE) { 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 35945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_FOCUSED)) 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSED; 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_NOTE: 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 36005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_NOTE; 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_OUTLINE: 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_PARAGRAPH: 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"P"; 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_POP_UP_BUTTON: 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_tag == L"select") { 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COMBOBOX; 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_BUTTONMENU; 36165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_PROGRESS_INDICATOR: 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PROGRESSBAR; 36205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_RADIO_BUTTON: 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_RADIOBUTTON; 36245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_RADIO_GROUP: 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_REGION: 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 36315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ROW: 36355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ROW; 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ROW_HEADER: 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ROWHEADER; 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_RULER: 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_RULER; 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SCROLL_AREA: 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SCROLL_PANE; 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 3651010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ia2_state_ &= ~(IA2_STATE_EDITABLE); 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SCROLL_BAR: 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SCROLLBAR; 36555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SLIDER: 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SLIDER; 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SPIN_BUTTON: 36605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SPINBUTTON; 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SPIN_BUTTON_PART: 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 36645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SPLIT_GROUP: 36665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SPLIT_PANE; 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ANNOTATION: 3671a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case ui::AX_ROLE_LIST_MARKER: 36725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_STATIC_TEXT: 3673a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_STATICTEXT; 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_STATUS: 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_STATUSBAR; 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SPLITTER: 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SEPARATOR; 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SVG_ROOT: 36832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 36842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 36855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TAB: 36865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PAGETAB; 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TABLE: { 3689a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 aria_role = GetString16Attribute( 36905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_ROLE); 36912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (aria_role == L"treegrid") { 36922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 36932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 36942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_TABLE; 36952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 36975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 36995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TABLE_HEADER_CONTAINER: 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 37015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 37025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TAB_LIST: 37055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PAGETABLIST; 37065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TAB_PANEL: 37085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PROPERTYPAGE; 37095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TOGGLE_BUTTON: 37115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 37125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TEXT_AREA: 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_MULTI_LINE; 37175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TEXT_FIELD: 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SINGLE_LINE; 37235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TIMER: 37275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLOCK; 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TOOLBAR: 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TOOLBAR; 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TOOLTIP: 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TOOLTIP; 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TREE: 37395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TREE_GRID: 37435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TREE_ITEM: 37475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINEITEM; 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_WINDOW: 37515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_WINDOW; 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): figure out the proper MSAA role for all of these. 37555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_BROWSER: 37565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DIRECTORY: 37575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DRAWER: 37585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_HELP_TAG: 37595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_IGNORED: 37605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_INCREMENTOR: 37615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LOG: 37625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MARQUEE: 37635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MATTE: 37645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_PRESENTATIONAL: 37655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_RULER_MARKER: 37665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SHEET: 37675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SLIDER_THUMB: 37685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SYSTEM_WIDE: 37695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_VALUE_INDICATOR: 37705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 37715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 37725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the final value of READONLY for MSAA. 37765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 37775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We always set the READONLY state for elements that have the 37785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aria-readonly attribute and for a few roles (in the switch above). 37795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We clear the READONLY state on focusable controls and on a document. 37805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Everything else, the majority of objects, do not have this state set. 37815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_FOCUSABLE) && 37825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_DOCUMENT) { 37835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ &= ~(STATE_SYSTEM_READONLY); 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasState(ui::AX_STATE_READ_ONLY)) 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ &= ~(STATE_SYSTEM_READONLY); 37875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The role should always be set. 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!role_name_.empty() || ia_role_); 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we didn't explicitly set the IAccessible2 role, make it the same 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the MSAA role. 37955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ia2_role_) 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = ia_role_; 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 3800