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" 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/base/win/atl_module.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// These nonstandard GUIDs are taken directly from the Mozilla sources 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// (accessible/src/msaa/nsAccessNodeWrap.cpp); some documentation is here: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// http://developer.mozilla.org/en/Accessibility/AT-APIs/ImplementationFeatures/MSAA 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const GUID GUID_ISimpleDOM = { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0x0c539790, 0x12e4, 0x11cf, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0xb6, 0x61, 0x00, 0xaa, 0x00, 0x4c, 0xd6, 0xd8}; 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GUID GUID_IAccessibleContentDocument = { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0xa5d8e1f3, 0x3571, 0x4d8f, 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0x95, 0x21, 0x07, 0xed, 0x28, 0xfb, 0x07, 0x2e}; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const base::char16 BrowserAccessibilityWin::kEmbeddedCharacter[] = L"\xfffc"; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LONG BrowserAccessibilityWin::next_unique_id_win_ = 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kFirstBrowserAccessibilityManagerAccessibilityId; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserAccessibilityRelation 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A simple implementation of IAccessibleRelation, used to represent 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a relationship between two accessible nodes in the tree. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserAccessibilityRelation 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public CComObjectRootEx<CComMultiThreadModel>, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public IAccessibleRelation { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BEGIN_COM_MAP(BrowserAccessibilityRelation) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) COM_INTERFACE_ENTRY(IAccessibleRelation) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) END_COM_MAP() 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT BrowserAccessibilityRelation() {} 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT virtual ~BrowserAccessibilityRelation() {} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT void Initialize(BrowserAccessibilityWin* owner, 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& type); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT void AddTarget(int target_id); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IAccessibleRelation methods. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_relationType(BSTR* relation_type); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_nTargets(long* n_targets); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_target(long target_index, IUnknown** target); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_targets(long max_targets, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown** targets, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_targets); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // IAccessibleRelation methods not implemented. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_EXPORT STDMETHODIMP get_localizedRelationType(BSTR* relation_type) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 79a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 type_; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::ScopedComPtr<BrowserAccessibilityWin> owner_; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<int> target_ids_; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityRelation::Initialize(BrowserAccessibilityWin* owner, 85a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& type) { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) owner_ = owner; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) type_ = type; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityRelation::AddTarget(int target_id) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_ids_.push_back(target_id); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_relationType( 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* relation_type) { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relation_type) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *relation_type = SysAllocString(type_.c_str()); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*relation_type); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_nTargets(long* n_targets) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_targets) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = static_cast<long>(target_ids_.size()); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityManager* manager = owner_->manager(); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = *n_targets - 1; i >= 0; --i) { 1180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility* result = manager->GetFromID(target_ids_[i]); 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !result->instance_active()) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = 0; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_target(long target_index, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** target) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (target_index < 0 || 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_index >= static_cast<long>(target_ids_.size())) { 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityManager* manager = owner_->manager(); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = 1420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager->GetFromID(target_ids_[target_index]); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result || !result->instance_active()) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *target = static_cast<IAccessible*>( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result->ToBrowserAccessibilityWin()->NewReference()); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityRelation::get_targets(long max_targets, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** targets, 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_targets) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!targets || !n_targets) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!owner_->instance_active()) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long count = static_cast<long>(target_ids_.size()); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count > max_targets) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count = max_targets; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_targets = count; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = 0; i < count; ++i) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT result = get_target(i, &targets[i]); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result != S_OK) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserAccessibilityWin 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibility* BrowserAccessibility::Create() { 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::win::CreateATLModuleIfNeeded(); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CComObject<BrowserAccessibilityWin>* instance; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = CComObject<BrowserAccessibilityWin>::CreateInstance(&instance); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SUCCEEDED(hr)); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return instance->NewReference(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibility::ToBrowserAccessibilityWin() { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<BrowserAccessibilityWin*>(this); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin::BrowserAccessibilityWin() 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : ia_role_(0), 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_(0), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_(0), 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_(0), 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_time_(true), 2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) old_ia_state_(0), 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) previous_scroll_x_(0), 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) previous_scroll_y_(0) { 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Start unique IDs at -1 and decrement each time, because get_accChild 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // uses positive IDs to enumerate children, so we use negative IDs to 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // clearly distinguish between indices and unique IDs. 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) unique_id_win_ = next_unique_id_win_; 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (next_unique_id_win_ == 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kLastBrowserAccessibilityManagerAccessibilityId) { 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_unique_id_win_ = 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::win::kFirstBrowserAccessibilityManagerAccessibilityId; 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) next_unique_id_win_--; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin::~BrowserAccessibilityWin() { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < relations_.size(); ++i) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->Release(); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessible methods. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Conventions: 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// * Always test for instance_active() first and return E_FAIL if it's false. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Always check for invalid arguments first, even if they're unused. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// * Return S_FALSE if the only output is a string argument and it's empty. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BrowserAccessibilityWin::accDoDefaultAction(VARIANT var_id) { 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->DoDefaultAction(*target); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accHitTest(LONG x_left, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG y_top, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* child) { 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!child) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point point(x_left, y_top); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetGlobalBoundsRect().Contains(point)) { 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return S_FALSE and VT_EMPTY when the outside the object's boundaries. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_EMPTY; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = BrowserAccessibilityForPoint(point); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (result == this) { 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Point is within this object. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_I4; 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->lVal = CHILDID_SELF; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->vt = VT_DISPATCH; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accLocation(LONG* x_left, 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* y_top, 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* width, 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* height, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT var_id) { 274a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!x_left || !y_top || !width || !height) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect bounds = target->GetGlobalBoundsRect(); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *x_left = bounds.x(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *y_top = bounds.y(); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *width = bounds.width(); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *height = bounds.height(); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accNavigate(LONG nav_dir, 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT start, 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT* end) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(start); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((nav_dir == NAVDIR_LASTCHILD || nav_dir == NAVDIR_FIRSTCHILD) && 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start.lVal != CHILDID_SELF) { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MSAA states that navigating to first/last child can only be from self. 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) uint32 child_count = target->PlatformChildCount(); 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* result = NULL; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (nav_dir) { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_DOWN: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_UP: 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_LEFT: 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_RIGHT: 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These directions are not implemented, matching Mozilla and IE. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_FIRSTCHILD: 317f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (child_count > 0) 318f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result = target->PlatformGetChild(0); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_LASTCHILD: 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (child_count > 0) 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) result = target->PlatformGetChild(child_count - 1); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_NEXT: 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->GetNextSibling(); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case NAVDIR_PREVIOUS: 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = target->GetPreviousSibling(); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!result) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->vt = VT_EMPTY; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->vt = VT_DISPATCH; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end->pdispVal = result->ToBrowserAccessibilityWin()->NewReference(); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accChild(VARIANT var_child, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IDispatch** disp_child) { 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!disp_child) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *disp_child = NULL; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_child); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*disp_child) = target->NewReference(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accChildCount(LONG* child_count) { 361a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!child_count) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3670f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) *child_count = PlatformChildCount(); 3680f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accDefaultAction(VARIANT var_id, 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* def_action) { 374a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!def_action) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_SHORTCUT, def_action); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accDescription(VARIANT var_id, 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* desc) { 390a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!desc) 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 4015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION, desc); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accFocus(VARIANT* focus_child) { 405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!focus_child) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* focus = static_cast<BrowserAccessibilityWin*>( 412a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->GetFocus(this)); 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (focus == this) { 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_I4; 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->lVal = CHILDID_SELF; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (focus == NULL) { 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_EMPTY; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->vt = VT_DISPATCH; 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) focus_child->pdispVal = focus->NewReference(); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accHelp(VARIANT var_id, BSTR* help) { 427a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!help) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 4385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_HELP, help); 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accKeyboardShortcut(VARIANT var_id, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* acc_key) { 443a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!acc_key) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return target->GetStringAttributeAsBstr( 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_SHORTCUT, acc_key); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accName(VARIANT var_id, BSTR* name) { 458a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!name) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4683551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string name_str = target->name(); 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If the name is empty, see if it's labeled by another element. 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_str.empty()) { 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int title_elem_id; 4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (target->GetIntAttribute(ui::AX_ATTR_TITLE_UI_ELEMENT, 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &title_elem_id)) { 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibility* title_elem = 4760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(title_elem_id); 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title_elem) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_str = title_elem->GetTextRecursive(); 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name_str.empty()) 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *name = SysAllocString(base::UTF8ToUTF16(name_str).c_str()); 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*name); 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accParent(IDispatch** disp_parent) { 492a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!disp_parent) 4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 498a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch IAccessible* parent_obj = GetParent()->ToBrowserAccessibilityWin(); 499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (parent_obj == NULL) { 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This happens if we're the root of the tree; 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // return the IAccessible for the window. 502a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) parent_obj = 5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->GetParentIAccessible(); 50490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // |parent| can only be NULL if the manager was created before the parent 50590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // IAccessible was known and it wasn't subsequently set before a client 506a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // requested it. This has been fixed. |parent| may also be NULL during 507a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // destruction. Possible cases where this could occur include tabs being 508a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // dragged to a new window, etc. 509a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (!parent_obj) { 510a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DVLOG(1) << "In Function: " 511a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << __FUNCTION__ 512a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) << ". Parent IAccessible interface is NULL. Returning failure"; 513a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return E_FAIL; 514a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 516a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) parent_obj->AddRef(); 517a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *disp_parent = parent_obj; 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accRole(VARIANT var_id, 5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT* role) { 523a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!role) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target->role_name_.empty()) { 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->vt = VT_BSTR; 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->bstrVal = SysAllocString(target->role_name_.c_str()); 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->vt = VT_I4; 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role->lVal = target->ia_role_; 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accState(VARIANT var_id, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* state) { 545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!state) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->vt = VT_I4; 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->lVal = target->ia_state_; 557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (manager()->GetFocus(NULL) == this) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state->lVal |= STATE_SYSTEM_FOCUSED; 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accValue(VARIANT var_id, 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* value) { 565a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* target = GetTargetFromChildID(var_id); 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!target) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5753551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (target->ia_role() == ROLE_SYSTEM_PROGRESSBAR || 5763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) target->ia_role() == ROLE_SYSTEM_SCROLLBAR || 5773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) target->ia_role() == ROLE_SYSTEM_SLIDER) { 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 value_text = target->GetValueText(); 5793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *value = SysAllocString(value_text.c_str()); 5803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(*value); 5813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return S_OK; 5823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 5833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 5843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Expose color well value. 5853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (target->ia2_role() == IA2_ROLE_COLOR_CHOOSER) { 5863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int r = target->GetIntAttribute( 5875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_COLOR_VALUE_RED); 5883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int g = target->GetIntAttribute( 5895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_COLOR_VALUE_GREEN); 5903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int b = target->GetIntAttribute( 5915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_COLOR_VALUE_BLUE); 592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 value_text; 5933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) value_text = base::IntToString16((r * 100) / 255) + L"% red " + 5943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::IntToString16((g * 100) / 255) + L"% green " + 5953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::IntToString16((b * 100) / 255) + L"% blue"; 5963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *value = SysAllocString(value_text.c_str()); 5973551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK(*value); 5983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return S_OK; 5993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *value = SysAllocString(base::UTF8ToUTF16(target->value()).c_str()); 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*value); 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accHelpTopic(BSTR* help_file, 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) VARIANT var_id, 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* topic_id) { 6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accSelection(VARIANT* selected) { 613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 616a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() != ui::AX_ROLE_LIST_BOX) 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long selected_count = 0; 620a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < InternalChildCount(); ++i) { 621a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++selected_count; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_count == 0) { 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_EMPTY; 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selected_count == 1) { 631a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < InternalChildCount(); ++i) { 632a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_DISPATCH; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->pdispVal = 635a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference(); 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Multiple items are selected. 6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::EnumVariant* enum_variant = 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new base::win::EnumVariant(selected_count); 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->AddRef(); 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned long index = 0; 646a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (size_t i = 0; i < InternalChildCount(); ++i) { 647a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (InternalGetChild(i)->HasState(ui::AX_STATE_SELECTED)) { 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->ItemAt(index)->vt = VT_DISPATCH; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum_variant->ItemAt(index)->pdispVal = 650a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InternalGetChild(i)->ToBrowserAccessibilityWin()->NewReference(); 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->vt = VT_UNKNOWN; 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) selected->punkVal = static_cast<IUnknown*>( 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<base::win::IUnknownImpl*>(enum_variant)); 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::accSelect( 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG flags_sel, VARIANT var_id) { 662a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags_sel & SELFLAG_TAKEFOCUS) { 666a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetFocus(this, true); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessible2 methods. 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::role(LONG* role) { 678a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!role) 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *role = ia2_role_; 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributes(BSTR* attributes) { 690a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attributes) 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The iaccessible2 attributes are a set of key-value pairs 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // separated by semicolons, with a colon between the key and the value. 698a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 str; 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned int i = 0; i < ia2_attributes_.size(); ++i) { 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i != 0) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += L';'; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) str += ia2_attributes_[i]; 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str.empty()) 7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *attributes = SysAllocString(str.c_str()); 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*attributes); 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_states(AccessibleStates* states) { 714a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!states) 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *states = ia2_state_; 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_uniqueID(LONG* unique_id) { 726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!unique_id) 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *unique_id = unique_id_win_; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_windowHandle(HWND* window_handle) { 737a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!window_handle) 7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) *window_handle = 7445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->GetParentHWND(); 745f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!*window_handle) 746f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return E_FAIL; 747f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_indexInParent(LONG* index_in_parent) { 752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!index_in_parent) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 758a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *index_in_parent = this->GetIndexInParent(); 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nRelations(LONG* n_relations) { 763a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_relations) 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_relations = relations_.size(); 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_relation( 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG relation_index, 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleRelation** relation) { 776a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (relation_index < 0 || 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation_index >= static_cast<long>(relations_.size())) { 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relation) 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[relation_index]->AddRef(); 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *relation = relations_[relation_index]; 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_relations( 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG max_relations, 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleRelation** relations, 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* n_relations) { 796a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!relations || !n_relations) 8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long count = static_cast<long>(relations_.size()); 8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_relations = count; 8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count == 0) 8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (long i = 0; i < count; ++i) { 8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->AddRef(); 8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations[i] = relations_[i]; 8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollTo(enum IA2ScrollType scroll_type) { 816a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 819a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch gfx::Rect r = GetLocation(); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(scroll_type) { 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_TOP_LEFT: 822a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible(*this, gfx::Rect(r.x(), r.y(), 0, 0)); 8235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_BOTTOM_RIGHT: 825a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.right(), r.bottom(), 0, 0)); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_TOP_EDGE: 829a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.y(), r.width(), 0)); 8315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_BOTTOM_EDGE: 833a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.bottom(), r.width(), 0)); 8355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_LEFT_EDGE: 837a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.x(), r.y(), 0, r.height())); 8395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_RIGHT_EDGE: 841a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible( 8425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this, gfx::Rect(r.right(), r.y(), 0, r.height())); 8435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_SCROLL_TYPE_ANYWHERE: 8455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 846a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible(*this, r); 8475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 8485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 850a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this); 8515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollToPoint( 8565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2CoordinateType coordinate_type, 8575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG x, 8585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG y) { 859a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 8605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point scroll_to(x, y); 8635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 865a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scroll_to -= manager()->GetViewBounds().OffsetFromOrigin(); 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 867a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetParent()) 868a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch scroll_to += GetParent()->GetLocation().OffsetFromOrigin(); 8695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 8705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 8715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 873a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToPoint(*this, scroll_to); 874a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this); 8755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_groupPosition( 8805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* group_level, 8815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* similar_items_in_group, 8825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* position_in_group) { 883a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 8845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 8855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!group_level || !similar_items_in_group || !position_in_group) 8875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 8885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 889a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION && 890a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent() && 891a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent()->GetRole() == ui::AX_ROLE_LIST_BOX) { 8925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *group_level = 0; 893a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *similar_items_in_group = GetParent()->PlatformChildCount(); 894a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *position_in_group = GetIndexInParent() + 1; 8955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 8965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 8995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 902c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// IAccessibleApplication methods. 903c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 904c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 905c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_appName(BSTR* app_name) { 906a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // No need to check |instance_active()| because this interface is 907c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 908c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 909c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!app_name) 910c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 911c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 912eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out 913eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the part before the "/". 914eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> product_components; 915eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SplitString(GetContentClient()->GetProduct(), '/', &product_components); 916eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK_EQ(2U, product_components.size()); 917eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (product_components.size() != 2) 918eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return E_FAIL; 9195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *app_name = SysAllocString(base::UTF8ToUTF16(product_components[0]).c_str()); 920c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*app_name); 921c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *app_name ? S_OK : E_FAIL; 922c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 923c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 924c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_appVersion(BSTR* app_version) { 925a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // No need to check |instance_active()| because this interface is 926c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 927c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 928c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!app_version) 929c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 930c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 931eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // GetProduct() returns a string like "Chrome/aa.bb.cc.dd", split out 932eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // the part after the "/". 933eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch std::vector<std::string> product_components; 934eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch base::SplitString(GetContentClient()->GetProduct(), '/', &product_components); 935eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK_EQ(2U, product_components.size()); 936eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (product_components.size() != 2) 937eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return E_FAIL; 9385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *app_version = 9395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SysAllocString(base::UTF8ToUTF16(product_components[1]).c_str()); 940c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*app_version); 941c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *app_version ? S_OK : E_FAIL; 942c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 943c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 944c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_toolkitName(BSTR* toolkit_name) { 945a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // No need to check |instance_active()| because this interface is 946c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 947c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 948c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!toolkit_name) 949c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 950c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 951c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // This is hard-coded; all products based on the Chromium engine 952c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // will have the same toolkit name, so that assistive technology can 953c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // detect any Chrome-based product. 954c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *toolkit_name = SysAllocString(L"Chrome"); 955c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*toolkit_name); 956c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *toolkit_name ? S_OK : E_FAIL; 957c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 958c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 959c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_toolkitVersion( 960c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) BSTR* toolkit_version) { 961a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // No need to check |instance_active()| because this interface is 962c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // global, and doesn't depend on any local state. 963c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 964c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!toolkit_version) 965c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return E_INVALIDARG; 966c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 967c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string user_agent = GetContentClient()->GetUserAgent(); 9685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *toolkit_version = SysAllocString(base::UTF8ToUTF16(user_agent).c_str()); 969c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK(*toolkit_version); 970c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return *toolkit_version ? S_OK : E_FAIL; 971c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 972c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 973c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// 9745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleImage methods. 9755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 9765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_description(BSTR* desc) { 978a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 9795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!desc) 9825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 9855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION, desc); 9865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_imagePosition( 9892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum IA2CoordinateType coordinate_type, 9902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* x, 9912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* y) { 992a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 9935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 9945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!x || !y) 9965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 9975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 9992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HWND parent_hwnd = 10005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->GetParentHWND(); 1001f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!parent_hwnd) 1002f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return E_FAIL; 10035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) POINT top_left = {0, 0}; 10045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::ClientToScreen(parent_hwnd, &top_left); 1005a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *x = GetLocation().x() + top_left.x; 1006a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *y = GetLocation().y() + top_left.y; 10075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 1008a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *x = GetLocation().x(); 1009a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *y = GetLocation().y(); 1010a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetParent()) { 1011a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *x -= GetParent()->GetLocation().x(); 1012a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *y -= GetParent()->GetLocation().y(); 10135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 10155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_imageSize(LONG* height, LONG* width) { 1022a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 10235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!height || !width) 10265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1028a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *height = GetLocation().height(); 1029a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *width = GetLocation().width(); 10305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 10345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTable methods. 10355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 10365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_accessibleAt( 10385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long row, 10395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 10405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown** accessible) { 1041a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 10425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 10455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 10485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 10495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 10505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 10515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute( 10525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 10535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 10545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 10555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 10595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 10625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 10633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size())); 10645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10653551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 10660529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibilityWin* cell = GetFromID(cell_id); 10675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell) { 10685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *accessible = static_cast<IAccessible*>(cell->NewReference()); 10695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 10705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 10715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *accessible = NULL; 10735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_caption(IUnknown** accessible) { 1077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 10785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 10815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 10845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 10855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 10865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_childIndex(long row, 10882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 10892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* cell_index) { 1090a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 10915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 10925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_index) 10945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 10955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 10975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 10985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 10995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 11005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !GetIntAttribute( 11015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 11025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 11035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 11045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 11085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 11115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 11123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 11135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 11143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) DCHECK_EQ(columns * rows, static_cast<int>(cell_ids.size())); 11153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 11163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) for (size_t i = 0; i < unique_cell_ids.size(); ++i) { 11173551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (unique_cell_ids[i] == cell_id) { 11185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_index = (long)i; 11195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnDescription(long column, 11272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* description) { 1128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 11295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description) 11325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 11355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 11365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 11375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 11385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 11395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 11405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 11415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (column < 0 || column >= columns) 11455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 11485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 11495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 11503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[i * columns + column]; 11515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>( 11520529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)); 1153a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) { 1154a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 cell_name = cell->GetString16Attribute( 11555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_NAME); 11563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (cell_name.size() > 0) { 11573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *description = SysAllocString(cell_name.c_str()); 11585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 11595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cell->GetStringAttributeAsBstr( 11625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION, description); 11635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 11685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnExtentAt( 11705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long row, 11715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 11725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_columns_spanned) { 1173a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 11745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 11755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_columns_spanned) 11775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 11805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 11815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 11825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 11835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 11845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 11855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 11865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 11875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 11885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 11905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 11915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 11935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 11943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 11955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = static_cast<BrowserAccessibilityWin*>( 11960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)); 11975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 11985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 11995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 12005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 12015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 12025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns_spanned = colspan; 12035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnHeader( 12105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleTable** accessible_table, 12115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* starting_row_index) { 12125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 12135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 12145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long cell_index, 12172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* column_index) { 1218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_index) 12225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 12255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 12263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids.size()); 12275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index < 0) 12285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index >= cell_id_count) 12305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = unique_cell_ids[cell_index]; 12335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 12340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 12355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int col_index; 12365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 12375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 12385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &col_index)) { 12395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = col_index; 12405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nColumns(long* column_count) { 1247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_count) 12515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 12545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 12555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns)) { 12565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_count = columns; 12575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nRows(long* row_count) { 1264a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_count) 12685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 12715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows)) { 12725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_count = rows; 12735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 12755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 12775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedChildren(long* cell_count) { 1280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_count) 12845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): add support for selected cells/rows/columns in tables. 12875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_count = 0; 12885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 12895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 12905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedColumns(long* column_count) { 1292a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 12935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 12945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_count) 12965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 12975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_count = 0; 12995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedRows(long* row_count) { 1303a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 13045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_count) 13075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_count = 0; 13105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowDescription(long row, 13142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* description) { 1315a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 13165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description) 13195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 13225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 13235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 13245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 13255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 13265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 13275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 13285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows) 13325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13343551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 13355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 13365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 13373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + i]; 13385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 13390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 1340a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) { 1341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 cell_name = cell->GetString16Attribute( 13425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_NAME); 13433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (cell_name.size() > 0) { 13443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) *description = SysAllocString(cell_name.c_str()); 13455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cell->GetStringAttributeAsBstr( 13495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION, description); 13505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowExtentAt(long row, 13572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 13582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows_spanned) { 1359a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 13605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 13615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_rows_spanned) 13635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 13665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 13675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 13685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 13695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetIntAttribute(ui::AX_ATTR_TABLE_ROW_COUNT, &rows) || 13705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns <= 0 || 13715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows <= 0) { 13725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (row < 0 || row >= rows || column < 0 || column >= columns) 13765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 13775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = GetIntListAttribute( 13795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 13803551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + column]; 13815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 13820529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 13835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 13845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 13855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 13865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 13875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1) { 13885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows_spanned = rowspan; 13895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 13905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 13915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 13935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 13945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowHeader( 13962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IAccessibleTable** accessible_table, 13975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* starting_column_index) { 13985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 13995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 14005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long cell_index, 14032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* row_index) { 1404a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index) 14085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 14115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 14123551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids.size()); 14135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index < 0) 14145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell_index >= cell_id_count) 14165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = unique_cell_ids[cell_index]; 14195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 14200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 14215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cell_row_index; 14225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 14235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 14245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &cell_row_index)) { 14255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = cell_row_index; 14265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 14285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedChildren(long max_children, 14332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** children, 14342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_children) { 1435a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!children || !n_children) 14395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_children = 0; 14435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long max_columns, 14472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** columns, 14482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_columns) { 1449a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!columns || !n_columns) 14535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns = 0; 14575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long max_rows, 14612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long** rows, 14622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows) { 1463a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rows || !n_rows) 14675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows = 0; 14715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_summary(IUnknown** accessible) { 1475a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!accessible) 14795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement 14825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 14835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isColumnSelected( 14865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long column, 14875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 1488a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 14895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 14905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 14925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 14935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 14955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 14965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 14975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 14985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 14992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isRowSelected(long row, 15002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) boolean* is_selected) { 1501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 15025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 15055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 15095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isSelected(long row, 15132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 15142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) boolean* is_selected) { 1515a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 15165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 15195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 15235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtentsAtIndex( 15275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long index, 15285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row, 15295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column, 15305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_extents, 15315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_extents, 15325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 1533a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 15345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row || !column || !row_extents || !column_extents || !is_selected) 15375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = GetIntListAttribute( 15405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 15413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id_count = static_cast<int>(unique_cell_ids.size()); 15425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < 0) 15435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index >= cell_id_count) 15455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = unique_cell_ids[index]; 15485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 15490529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 15505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 15515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 15525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell && 15535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 15545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 15555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell->GetIntAttribute( 15565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 15575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1 && 15585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 15595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_extents = rowspan; 15605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_extents = colspan; 15615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 15635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 15655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTable2 methods. 15695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 15705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_cellAt(long row, 15722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long column, 15732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** cell) { 15745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_accessibleAt(row, column, cell); 15755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelectedCells(long* cell_count) { 15785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_nSelectedChildren(cell_count); 15795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedCells( 15825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cells, 15835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_selected_cells) { 1584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 15855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cells || !n_selected_cells) 15885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 15895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 15915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_selected_cells = 0; 15925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 15935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 15945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 15952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedColumns(long** columns, 15962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_columns) { 1597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 15985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 15995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!columns || !n_columns) 16015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 16045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns = 0; 16055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selectedRows(long** rows, 16092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) long* n_rows) { 1610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 16115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!rows || !n_rows) 16145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 16175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows = 0; 16185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleTableCell methods. 16245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 16255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnExtent( 16275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_columns_spanned) { 1628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 16295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_columns_spanned) 16325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 16355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 16365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan) && 16375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) colspan >= 1) { 16385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_columns_spanned = colspan; 16395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 16405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 16445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnHeaderCells( 16465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cell_accessibles, 16475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_column_header_cells) { 1648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 16495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 16505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_accessibles || !n_column_header_cells) 16525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 16535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_column_header_cells = 0; 16555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 16575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 16585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column)) { 16595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1662a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* table = GetParent(); 1663a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch while (table && table->GetRole() != ui::AX_ROLE_TABLE) 1664a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch table = table->GetParent(); 16655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) { 16665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 16675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 16715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 16725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table->GetIntAttribute( 16735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 16745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !table->GetIntAttribute( 16755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_ROW_COUNT, &rows)) { 16765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (columns <= 0 || rows <= 0 || column < 0 || column >= columns) 16795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 16805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = table->GetIntListAttribute( 16825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 16833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 16845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 16853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[i * columns + column]; 16865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* cell = 16870529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch manager()->GetFromID(cell_id)->ToBrowserAccessibilityWin(); 1688a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) 16895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_column_header_cells)++; 16905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 16915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 16935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_column_header_cells) * sizeof(cell_accessibles[0]))); 16945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 16955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < rows; ++i) { 16963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[i * columns + column]; 16970529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility* cell = manager()->GetFromID(cell_id); 1698a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_COLUMN_HEADER) { 1699a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*cell_accessibles)[index] = static_cast<IAccessible*>( 1700a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cell->ToBrowserAccessibilityWin()->NewReference()); 17015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 17025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_columnIndex(long* column_index) { 1709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 17105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!column_index) 17135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 17165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 17175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column)) { 17185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = column; 17195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowExtent(long* n_rows_spanned) { 1726a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 17275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_rows_spanned) 17305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 17335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 17345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 17355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rowspan >= 1) { 17365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_rows_spanned = rowspan; 17375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 17385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 17425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowHeaderCells( 17445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IUnknown*** cell_accessibles, 17455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* n_row_header_cells) { 1746a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 17475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 17485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!cell_accessibles || !n_row_header_cells) 17505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 17515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_row_header_cells = 0; 17535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 17555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetIntAttribute( 17565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row)) { 17575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1760a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* table = GetParent(); 1761a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch while (table && table->GetRole() != ui::AX_ROLE_TABLE) 1762a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch table = table->GetParent(); 17635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) { 17645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 17655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int columns; 17695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rows; 17705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table->GetIntAttribute( 17715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_COLUMN_COUNT, &columns) || 17725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !table->GetIntAttribute( 17735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_ROW_COUNT, &rows)) { 17745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (columns <= 0 || rows <= 0 || row < 0 || row >= rows) 17775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 17785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17793551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& cell_ids = table->GetIntListAttribute( 17805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_CELL_IDS); 17813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 17825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 17833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + i]; 17840529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility* cell = manager()->GetFromID(cell_id); 1785a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) 17865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_row_header_cells)++; 17875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 17885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *cell_accessibles = static_cast<IUnknown**>(CoTaskMemAlloc( 17905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (*n_row_header_cells) * sizeof(cell_accessibles[0]))); 17915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = 0; 17925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < columns; ++i) { 17933551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int cell_id = cell_ids[row * columns + i]; 17940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility* cell = manager()->GetFromID(cell_id); 1795a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (cell && cell->GetRole() == ui::AX_ROLE_ROW_HEADER) { 1796a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) (*cell_accessibles)[index] = static_cast<IAccessible*>( 1797a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) cell->ToBrowserAccessibilityWin()->NewReference()); 17985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 17995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowIndex(long* row_index) { 1806a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 18075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index) 18105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 18135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row)) { 18145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = row; 18155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_isSelected(boolean* is_selected) { 1821a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 18225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!is_selected) 18255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 18285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_rowColumnExtents( 18325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_index, 18335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_index, 18345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* row_extents, 18355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* column_extents, 18365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean* is_selected) { 1837a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 18385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!row_index || 18415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !column_index || 18425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !row_extents || 18435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !column_extents || 18445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !is_selected) { 18455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 18495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 18505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int rowspan; 18515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int colspan; 18525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row) && 18535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 18545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column) && 18555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 18565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_ROW_SPAN, &rowspan) && 18575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetIntAttribute( 18585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TABLE_CELL_COLUMN_SPAN, &colspan)) { 18595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_index = row; 18605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_index = column; 18615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *row_extents = rowspan; 18625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *column_extents = colspan; 18635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *is_selected = false; 18645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_table(IUnknown** table) { 1871a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 18725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 18735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!table) 18755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 18765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int row; 18795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int column; 18805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TABLE_CELL_ROW_INDEX, &row); 18815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TABLE_CELL_COLUMN_INDEX, &column); 18825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1883a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* find_table = GetParent(); 1884a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch while (find_table && find_table->GetRole() != ui::AX_ROLE_TABLE) 1885a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch find_table = find_table->GetParent(); 18865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!find_table) { 18875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 18885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 18895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 18905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *table = static_cast<IAccessibleTable*>( 18925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) find_table->ToBrowserAccessibilityWin()->NewReference()); 18935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 18955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 18965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 18975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 18985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleText methods. 18995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 19005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) { 1902a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 19035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_characters) 19065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_characters = TextForIAccessibleText().length(); 19095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) { 1913a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 19145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!offset) 19175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *offset = 0; 1920a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_TEXT_FIELD || 1921a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TEXT_AREA) { 19225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 19235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, 19242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &sel_start)) 19255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = sel_start; 19265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1931f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_characterExtents( 1932f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG offset, 1933f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) enum IA2CoordinateType coordinate_type, 1934f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG* out_x, 1935f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG* out_y, 1936f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG* out_width, 1937f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) LONG* out_height) { 1938a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 1939f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_FAIL; 1940f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1941f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!out_x || !out_y || !out_width || !out_height) 1942f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 1943f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1944a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 1945f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) HandleSpecialTextOffset(text_str, &offset); 1946f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1947f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (offset < 0 || offset > static_cast<LONG>(text_str.size())) 1948f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 1949f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1950f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect character_bounds; 1951f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (coordinate_type == IA2_COORDTYPE_SCREEN_RELATIVE) { 1952f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) character_bounds = GetGlobalBoundsForRange(offset, 1); 1953f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else if (coordinate_type == IA2_COORDTYPE_PARENT_RELATIVE) { 1954f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) character_bounds = GetLocalBoundsForRange(offset, 1); 1955a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch character_bounds -= GetLocation().OffsetFromOrigin(); 1956f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } else { 1957f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 1958f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 1959f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1960f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_x = character_bounds.x(); 1961f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_y = character_bounds.y(); 1962f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_width = character_bounds.width(); 1963f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_height = character_bounds.height(); 1964f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1965f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return S_OK; 1966f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 1967f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 19685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) { 1969a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 19705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!n_selections) 19735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *n_selections = 0; 1976a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_TEXT_FIELD || 1977a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TEXT_AREA) { 19785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 19795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_end = 0; 19805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, 19812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &sel_start) && 19825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, &sel_end) && 19832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sel_start != sel_end) 19845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *n_selections = 1; 19855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 19865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 19885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 19895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index, 19915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* start_offset, 19925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG* end_offset) { 1993a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 19945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 19955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || selection_index != 0) 19975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 19985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *start_offset = 0; 20002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *end_offset = 0; 2001a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_TEXT_FIELD || 2002a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_TEXT_AREA) { 20035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_start = 0; 20045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int sel_end = 0; 20055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetIntAttribute( 20065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TEXT_SEL_START, &sel_start) && 20075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, &sel_end)) { 20085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = sel_start; 20095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = sel_end; 20105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_text(LONG start_offset, 20172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG end_offset, 20182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* text) { 2019a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 20205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!text) 20235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 20265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle special text offsets. 20285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 20295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 20305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The spec allows the arguments to be reversed. 20325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (start_offset > end_offset) { 20335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG tmp = start_offset; 20345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) start_offset = end_offset; 20355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) end_offset = tmp; 20365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The spec does not allow the start or end offsets to be out or range; 20395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // we must return an error if so. 20405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG len = text_str.length(); 20415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (start_offset < 0) 20425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (end_offset > len) 20445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2046a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 substr = text_str.substr(start_offset, 2047a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) end_offset - start_offset); 20485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (substr.empty()) 20495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 20505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = SysAllocString(substr.c_str()); 20525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*text); 20535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 20545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textAtOffset( 20575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 20585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 20592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 20602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 20615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 2062a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 20635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 20665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 20695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 20705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 20715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 20725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 20735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 20745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 20755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 20765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2077a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 20785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = FindBoundary( 20805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 20815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = FindBoundary( 20825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 20835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 20845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 20855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textBeforeOffset( 20875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 20885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 20892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 20902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 20915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 2092a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 20935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 20945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 20965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 20975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 20995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 21005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 21015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 21025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 21035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 21045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 21055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 21085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = FindBoundary( 21105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::BACKWARDS_DIRECTION); 21115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = offset; 21125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 21135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_textAfterOffset( 21165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG offset, 21175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2TextBoundaryType boundary_type, 21182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* start_offset, 21192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* end_offset, 21205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* text) { 2121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 21225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!start_offset || !end_offset || !text) 21255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The IAccessible2 spec says we don't have to implement the "sentence" 21285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // boundary type, we can just let the screenreader handle it. 21295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) { 21305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = 0; 21315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = 0; 21325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *text = NULL; 21335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 21345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 21355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2136a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 21375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *start_offset = offset; 21395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *end_offset = FindBoundary( 21405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) text_str, boundary_type, offset, ui::FORWARDS_DIRECTION); 21415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return get_text(*start_offset, *end_offset, text); 21425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_newText(IA2TextSegment* new_text) { 2145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 21465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!new_text) 21495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2151a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text = TextForIAccessibleText(); 21525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->text = SysAllocString(text.c_str()); 21545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->start = 0; 21555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_text->end = static_cast<long>(text.size()); 21565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_oldText(IA2TextSegment* old_text) { 2160a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 21615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!old_text) 21645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->text = SysAllocString(old_text_.c_str()); 21675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->start = 0; 21685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text->end = static_cast<long>(old_text_.size()); 21695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_offsetAtPoint( 21732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG x, 21742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG y, 21752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum IA2CoordinateType coord_type, 21762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG* offset) { 2177a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 21785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 21795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!offset) 21815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 21825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): implement this. We're returning S_OK for now so that 21845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // screen readers still return partially accurate results rather than 21855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // completely failing. 21865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = 0; 21875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 21885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollSubstringTo( 21915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_index, 21925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_index, 21935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2ScrollType scroll_type) { 21945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): adjust this for the start and end index, too. 21955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollTo(scroll_type); 21965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 21975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 21985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollSubstringToPoint( 21995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_index, 22005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_index, 22015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum IA2CoordinateType coordinate_type, 22025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG x, LONG y) { 22035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): adjust this for the start and end index, too. 22045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollToPoint(coordinate_type, x, y); 22055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::addSelection(LONG start_offset, 22082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LONG end_offset) { 2209a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 22135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 22145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 22155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetTextSelection(*this, start_offset, end_offset); 22175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::removeSelection(LONG selection_index) { 2221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_index != 0) 22255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetTextSelection(*this, 0, 0); 22285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setCaretOffset(LONG offset) { 2232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 22365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &offset); 2237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetTextSelection(*this, offset, offset); 22385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setSelection(LONG selection_index, 22425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_offset, 22435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG end_offset) { 2244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (selection_index != 0) 22485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 22515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &start_offset); 22525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text_str, &end_offset); 22535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->SetTextSelection(*this, start_offset, end_offset); 22555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleHypertext methods. 22605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 22615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nHyperlinks(long* hyperlink_count) { 2263a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink_count) 22675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_count = hyperlink_offset_to_index_.size(); 22705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_hyperlink( 22745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long index, 22755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IAccessibleHyperlink** hyperlink) { 2276a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink || 22805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index < 0 || 22815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) index >= static_cast<long>(hyperlinks_.size())) { 22825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 22845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BrowserAccessibilityWin* child = 2286a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InternalGetChild(hyperlinks_[index])->ToBrowserAccessibilityWin(); 22875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink = static_cast<IAccessibleHyperlink*>(child->NewReference()); 22885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 22895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 22905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_hyperlinkIndex( 22925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long char_index, 22935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) long* hyperlink_index) { 2294a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 22955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 22965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 22975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!hyperlink_index) 22985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 22995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_index = -1; 23015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (char_index < 0 || char_index >= static_cast<long>(hypertext_.size())) 23035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::map<int32, int32>::iterator it = 23065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_.find(char_index); 23075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (it == hyperlink_offset_to_index_.end()) 23085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *hyperlink_index = it->second; 23115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IAccessibleValue methods. 23165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_currentValue(VARIANT* value) { 2319a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 23235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 23265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetFloatAttribute( 23275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_VALUE_FOR_RANGE, &float_val)) { 23285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 23295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 23305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 23345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 23355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_minimumValue(VARIANT* value) { 2338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 23425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 23455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE, 23465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &float_val)) { 23475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 23485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 23495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 23535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 23545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_maximumValue(VARIANT* value) { 2357a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!value) 23615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float float_val; 23645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetFloatAttribute(ui::AX_ATTR_MAX_VALUE_FOR_RANGE, 23655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &float_val)) { 23665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_R8; 23675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->dblVal = float_val; 23685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 23695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 23705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) value->vt = VT_EMPTY; 23725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 23735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::setCurrentValue(VARIANT new_value) { 23765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Implement this. 23775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 23785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMDocument methods. 23825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 23835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_URL(BSTR* url) { 2385a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!url) 23895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 23905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetStringAttributeAsBstr(ui::AX_ATTR_DOC_URL, url); 23925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 23935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_title(BSTR* title) { 2395a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 23965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 23975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!title) 23995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return GetStringAttributeAsBstr(ui::AX_ATTR_DOC_TITLE, title); 24025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_mimeType(BSTR* mime_type) { 2405a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 24065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!mime_type) 24095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 24125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DOC_MIMETYPE, mime_type); 24135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_docType(BSTR* doc_type) { 2416a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 24175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!doc_type) 24205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetStringAttributeAsBstr( 24235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DOC_DOCTYPE, doc_type); 24245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 24275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMNode methods. 24285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 24295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nodeInfo( 24315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* node_name, 24325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 24335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* node_value, 24345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int* num_children, 24355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int* unique_id, 24365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short* node_type) { 2437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 24385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node_name || !name_space_id || !node_value || !num_children || 24415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !unique_id || !node_type) { 24425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 tag; 24465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetString16Attribute(ui::AX_ATTR_HTML_TAG, &tag)) 24475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_name = SysAllocString(tag.c_str()); 24485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 24495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_name = NULL; 24505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *name_space_id = 0; 24525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *node_value = SysAllocString(base::UTF8ToUTF16(value()).c_str()); 2453f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *num_children = PlatformChildCount(); 2454c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) *unique_id = unique_id_win_; 24555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_DOCUMENT) { 24575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_DOCUMENT; 24585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (ia_role_ == ROLE_SYSTEM_TEXT && 24595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ((ia2_state_ & IA2_STATE_EDITABLE) == 0)) { 24605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_TEXT; 24615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 24625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node_type = NODETYPE_ELEMENT; 24635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributes( 24695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short max_attribs, 24705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_names, 24715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 24725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_values, 24735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short* num_attribs) { 2474a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 24755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 24765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attrib_names || !name_space_id || !attrib_values || !num_attribs) 24785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 24795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_attribs = max_attribs; 2481a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (*num_attribs > GetHtmlAttributes().size()) 2482a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *num_attribs = GetHtmlAttributes().size(); 24835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < *num_attribs; ++i) { 24853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_names[i] = SysAllocString( 2486a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::UTF8ToUTF16(GetHtmlAttributes()[i].first).c_str()); 24875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_space_id[i] = 0; 24883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_values[i] = SysAllocString( 2489a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::UTF8ToUTF16(GetHtmlAttributes()[i].second).c_str()); 24905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 24915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 24925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 24935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_attributesForNames( 24955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short num_attribs, 24965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_names, 24975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) short* name_space_id, 24985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* attrib_values) { 2499a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 25005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!attrib_names || !name_space_id || !attrib_values) 25035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < num_attribs; ++i) { 25065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) name_space_id[i] = 0; 25075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool found = false; 25085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string name = base::UTF16ToUTF8((LPCWSTR)attrib_names[i]); 2509a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch for (unsigned int j = 0; j < GetHtmlAttributes().size(); ++j) { 2510a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetHtmlAttributes()[j].first == name) { 25113551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) attrib_values[i] = SysAllocString( 2512a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch base::UTF8ToUTF16(GetHtmlAttributes()[j].second).c_str()); 25135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) found = true; 25145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 25155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!found) { 25185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attrib_values[i] = NULL; 25195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_computedStyle( 25255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short max_style_properties, 25265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean use_alternate_view, 25272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* style_properties, 25282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* style_values, 25295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short *num_style_properties) { 2530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 25315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!style_properties || !style_values) 25345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only cache a single style property for now: DISPLAY 25375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2538a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 display; 25395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (max_style_properties == 0 || 25405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) !GetString16Attribute(ui::AX_ATTR_DISPLAY, &display)) { 25415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_style_properties = 0; 25425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *num_style_properties = 1; 25465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_properties[0] = SysAllocString(L"display"); 25475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[0] = SysAllocString(display.c_str()); 25485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_computedStyleForProperties( 25535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned short num_style_properties, 25545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) boolean use_alternate_view, 25555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* style_properties, 25565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BSTR* style_values) { 2557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 25585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!style_properties || !style_values) 25615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only cache a single style property for now: DISPLAY 25645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (unsigned short i = 0; i < num_style_properties; ++i) { 2566a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 name = (LPCWSTR)style_properties[i]; 25676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::StringToLowerASCII(&name); 25685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (name == L"display") { 2569a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 display = GetString16Attribute( 25705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DISPLAY); 25715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[i] = SysAllocString(display.c_str()); 25725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 25735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) style_values[i] = NULL; 25745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 25765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollTo(boolean placeTopLeft) { 25815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scrollTo(placeTopLeft ? 25822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IA2_SCROLL_TYPE_TOP_LEFT : IA2_SCROLL_TYPE_ANYWHERE); 25835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_parentNode(ISimpleDOMNode** node) { 2586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 25875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 25905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 25915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2592a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *node = GetParent()->ToBrowserAccessibilityWin()->NewReference(); 25935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 25945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 25955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 25965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_firstChild(ISimpleDOMNode** node) { 2597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 25985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 25995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2603f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (PlatformChildCount() == 0) { 26045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2608f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *node = PlatformGetChild(0)->ToBrowserAccessibilityWin()->NewReference(); 26092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_lastChild(ISimpleDOMNode** node) { 2613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2619f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (PlatformChildCount() == 0) { 26205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *node = PlatformGetChild(PlatformChildCount() - 1) 2625f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ->ToBrowserAccessibilityWin()->NewReference(); 26262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_previousSibling( 26305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISimpleDOMNode** node) { 2631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2637a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!GetParent() || GetIndexInParent() <= 0) { 26385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2642a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *node = GetParent()->InternalGetChild(GetIndexInParent() - 1)-> 26432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToBrowserAccessibilityWin()->NewReference(); 26442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_nextSibling(ISimpleDOMNode** node) { 2648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2654a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (!GetParent() || 2655a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetIndexInParent() < 0 || 2656a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetIndexInParent() >= static_cast<int>( 2657a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent()->InternalChildCount()) - 1) { 26585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch *node = GetParent()->InternalGetChild(GetIndexInParent() + 1)-> 26632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ToBrowserAccessibilityWin()->NewReference(); 26642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_childAt( 26685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int child_index, 26695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ISimpleDOMNode** node) { 2670a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!node) 26745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2676f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (child_index >= PlatformChildCount()) 2677f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 2678f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 26790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserAccessibility* child = PlatformGetChild(child_index); 26800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (!child) { 26815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *node = NULL; 26825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 26835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 26842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 26850f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) *node = child->ToBrowserAccessibilityWin()->NewReference(); 26862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return S_OK; 26875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 26885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ISimpleDOMText methods. 26915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 26925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_domText(BSTR* dom_text) { 2694a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 26955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 26965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 26975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!dom_text) 26985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_INVALIDARG; 26995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27003551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return GetStringAttributeAsBstr( 27015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_NAME, dom_text); 27025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 27035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2704f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_clippedSubstringBounds( 2705f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int start_index, 2706f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int end_index, 2707f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_x, 2708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_y, 2709f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_width, 2710f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_height) { 2711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(dmazzoni): fully support this API by intersecting the 2712f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // rect with the container's rect. 2713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return get_unclippedSubstringBounds( 2714f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index, end_index, out_x, out_y, out_width, out_height); 2715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2716f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2717f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::get_unclippedSubstringBounds( 2718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int start_index, 2719f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int end_index, 2720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_x, 2721f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_y, 2722f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_width, 2723f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int* out_height) { 2724a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_FAIL; 2726f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2727f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!out_x || !out_y || !out_width || !out_height) 2728f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 2729f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 2731f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (start_index > text_str.size() || 2732f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) end_index > text_str.size() || 2733f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index > end_index) { 2734f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 2735f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2736f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2737f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) gfx::Rect bounds = GetGlobalBoundsForRange( 2738f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index, end_index - start_index); 2739f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_x = bounds.x(); 2740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_y = bounds.y(); 2741f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_width = bounds.width(); 2742f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) *out_height = bounds.height(); 2743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return S_OK; 2744f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2745f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2746f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::scrollToSubstring( 2747f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int start_index, 2748f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) unsigned int end_index) { 2749a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 2750f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_FAIL; 2751f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2752a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text_str = TextForIAccessibleText(); 2753f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (start_index > text_str.size() || 2754f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) end_index > text_str.size() || 2755f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index > end_index) { 2756f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return E_INVALIDARG; 2757f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 2758f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2759a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ScrollToMakeVisible(*this, GetLocalBoundsForRange( 2760f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) start_index, end_index - start_index)); 2761a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->TrackScrollingObject(this); 2762f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2763f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return S_OK; 2764f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 2765f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// IServiceProvider methods. 27685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 27695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 27702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::QueryService(REFGUID guidService, 27712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) REFIID riid, 27722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void** object) { 2773a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!instance_active()) 27745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 27755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2776d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // The system uses IAccessible APIs for many purposes, but only 2777d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // assistive technology like screen readers uses IAccessible2. 2778d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) // Enable full accessibility support when IAccessible2 APIs are queried. 2779d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (riid == IID_IAccessible2) 2780d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) BrowserAccessibilityStateImpl::GetInstance()->EnableAccessibility(); 2781d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 27822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (guidService == GUID_IAccessibleContentDocument) { 27832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Special Mozilla extension: return the accessible for the root document. 27842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Screen readers use this to distinguish between a document loaded event 27852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on the root document vs on an iframe. 2786a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return manager()->GetRoot()->ToBrowserAccessibilityWin()->QueryInterface( 27872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IID_IAccessible2, object); 27882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 27892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 27905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (guidService == IID_IAccessible || 27915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessible2 || 27925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleAction || 2793c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) guidService == IID_IAccessibleApplication || 27945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleHyperlink || 27955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleHypertext || 27965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleImage || 27975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTable || 27985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTable2 || 27995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleTableCell || 28005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleText || 28015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_IAccessibleValue || 28025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMDocument || 28035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMNode || 28045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == IID_ISimpleDOMText || 28055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) guidService == GUID_ISimpleDOM) { 28065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QueryInterface(riid, object); 28075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only support the IAccessibleEx interface on Windows 8 and above. This 28105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is needed for the on-screen Keyboard to show up in metro mode, when the 28115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user taps an editable portion on the page. 28125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All methods in the IAccessibleEx interface are unimplemented. 28135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (riid == IID_IAccessibleEx && 28145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::win::GetVersion() >= base::win::VERSION_WIN8) { 28155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return QueryInterface(riid, object); 28165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_FAIL; 28205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::GetPatternProvider(PATTERNID id, 28232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) IUnknown** provider) { 28245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "In Function: " 28255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << __FUNCTION__ 28265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " for pattern id: " 28275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << id; 28285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == UIA_ValuePatternId || id == UIA_TextPatternId) { 28295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEditableText()) { 28305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning UIA text provider"; 2831f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::win::UIATextProvider::CreateTextProvider( 2832f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) GetValueText(), true, provider); 28335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 28345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOTIMPL; 28375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)STDMETHODIMP BrowserAccessibilityWin::GetPropertyValue(PROPERTYID id, 28405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) VARIANT* ret) { 28415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "In Function: " 28425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << __FUNCTION__ 28435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << " for property id: " 28445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) << id; 28455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V_VT(ret) = VT_EMPTY; 28465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (id == UIA_ControlTypePropertyId) { 28475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEditableText()) { 28485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) V_VT(ret) = VT_I4; 28495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ret->lVal = UIA_EditControlTypeId; 28505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning Edit control type"; 28515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 28525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DVLOG(1) << "Returning empty control type"; 28535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 28565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CComObjectRootEx methods. 28605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 28615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT WINAPI BrowserAccessibilityWin::InternalQueryInterface( 28635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void* this_ptr, 28645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const _ATL_INTMAP_ENTRY* entries, 28655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) REFIID iid, 28665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void** object) { 28675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (iid == IID_IAccessibleImage) { 28685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_GRAPHIC) { 28695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleTable || iid == IID_IAccessibleTable2) { 28735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_TABLE) { 28745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleTableCell) { 28785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_CELL) { 28795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_IAccessibleValue) { 28835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_PROGRESSBAR && 28845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_SCROLLBAR && 28855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_SLIDER) { 28865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (iid == IID_ISimpleDOMDocument) { 28905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ != ROLE_SYSTEM_DOCUMENT) { 28915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *object = NULL; 28925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return E_NOINTERFACE; 28935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 28955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 28965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return CComObjectRootBase::InternalQueryInterface( 28975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) this_ptr, entries, iid, object); 28985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 28995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 29015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Private methods. 29025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 29035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29040529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch// Called every time this node's data changes. 29050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserAccessibilityWin::OnDataChanged() { 29060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch BrowserAccessibility::OnDataChanged(); 29075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitRoleAndState(); 29095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose the "display" and "tag" attributes. 29115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_DISPLAY, "display"); 29125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_HTML_TAG, "tag"); 29135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_ROLE, "xml-roles"); 29145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Expose "level" attribute for headings, trees, etc. 29165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) IntAttributeToIA2(ui::AX_ATTR_HIERARCHICAL_LEVEL, "level"); 29175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose the set size and position in set for listbox options. 2919a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION && 2920a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent() && 2921a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetParent()->GetRole() == ui::AX_ROLE_LIST_BOX) { 29225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back( 2923a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch L"setsize:" + base::IntToString16(GetParent()->PlatformChildCount())); 29245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.push_back( 2925a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch L"setsize:" + base::IntToString16(GetIndexInParent() + 1)); 29265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_CHECKBUTTON || 29292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ == ROLE_SYSTEM_RADIOBUTTON || 29302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_role_ == IA2_ROLE_TOGGLE_BUTTON) { 29312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_attributes_.push_back(L"checkable:true"); 29322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose live region attributes. 29355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_LIVE_STATUS, "live"); 29365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_LIVE_RELEVANT, "relevant"); 29375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BoolAttributeToIA2(ui::AX_ATTR_LIVE_ATOMIC, "atomic"); 29385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BoolAttributeToIA2(ui::AX_ATTR_LIVE_BUSY, "busy"); 29395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose container live region attributes. 29415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_CONTAINER_LIVE_STATUS, 29425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-live"); 29435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) StringAttributeToIA2(ui::AX_ATTR_CONTAINER_LIVE_RELEVANT, 29445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-relevant"); 29455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BoolAttributeToIA2(ui::AX_ATTR_CONTAINER_LIVE_ATOMIC, 29465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-atomic"); 29475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BoolAttributeToIA2(ui::AX_ATTR_CONTAINER_LIVE_BUSY, 29485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "container-busy"); 29495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose slider value. 29515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_PROGRESSBAR || 29525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ == ROLE_SYSTEM_SCROLLBAR || 29535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ == ROLE_SYSTEM_SLIDER) { 29543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) ia2_attributes_.push_back(L"valuetext:" + GetValueText()); 29552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 29562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 29575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expose table cell index. 29585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_role_ == ROLE_SYSTEM_CELL) { 2959a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch BrowserAccessibility* table = GetParent(); 2960a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch while (table && table->GetRole() != ui::AX_ROLE_TABLE) 2961a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch table = table->GetParent(); 29625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (table) { 29633551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& unique_cell_ids = table->GetIntListAttribute( 29645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_UNIQUE_CELL_IDS); 29655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < unique_cell_ids.size(); ++i) { 2966a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (unique_cell_ids[i] == GetId()) { 29672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_attributes_.push_back( 2968a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16(L"table-cell-index:") + base::IntToString16(i)); 29695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 29735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The calculation of the accessible name of an element has been 29755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // standardized in the HTML to Platform Accessibility APIs Implementation 29765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Guide (http://www.w3.org/TR/html-aapi/). In order to return the 29775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // appropriate accessible name on Windows, we need to apply some logic 29785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to the fields we get from WebKit. 29795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): move most of this logic into WebKit. 29815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit gives us: 29835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name: the default name, e.g. inner text 29855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // title ui element: a reference to a <label> element on the same 29865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // page that labels this node. 29875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // description: accessible labels that override the default name: 29885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aria-label or aria-labelledby or aria-describedby 29895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // help: the value of the "title" attribute 29905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 29915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // On Windows, the logic we apply lets some fields take precedence and 29925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // always returns the primary name in "name" and the secondary name, 29935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if any, in "description". 29945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) int title_elem_id = GetIntAttribute( 29965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_TITLE_UI_ELEMENT); 29975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::string help = GetStringAttribute(ui::AX_ATTR_HELP); 29983551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string description = GetStringAttribute( 29995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_DESCRIPTION); 30005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit annoyingly puts the title in the description if there's no other 30025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // description, which just confuses the rest of the logic. Put it back. 30035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now "help" is always the value of the "title" attribute, if present. 30043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string title_attr; 30055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetHtmlAttribute("title", &title_attr) && 30065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description == title_attr && 30075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help.empty()) { 30085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) help = description; 30092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 30105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now implement the main logic: the descripion should become the name if 30135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // it's nonempty, and the help should become the description if 30145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // there's no description - or the name if there's no name or description. 30155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!description.empty()) { 3016a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_name(description); 30172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 30185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!help.empty() && description.empty()) { 30205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description = help; 30213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) help.clear(); 30225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3023a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (!description.empty() && name().empty() && !title_elem_id) { 3024a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_name(description); 30252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) description.clear(); 30265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If it's a text field, also consider the placeholder. 30293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::string placeholder; 3030a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_TEXT_FIELD && 30315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) HasState(ui::AX_STATE_FOCUSABLE) && 30325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetHtmlAttribute("placeholder", &placeholder)) { 3033a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (name().empty() && !title_elem_id) { 3034a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_name(placeholder); 30355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (description.empty()) { 30365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description = placeholder; 30375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetStringAttribute(ui::AX_ATTR_DESCRIPTION, description); 30415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SetStringAttribute(ui::AX_ATTR_HELP, help); 30423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 30432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // On Windows, the value of a document should be its url. 3044a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_ROOT_WEB_AREA || 3045a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_WEB_AREA) { 30465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_value(GetStringAttribute(ui::AX_ATTR_DOC_URL)); 30472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 30482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 30495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For certain roles (listbox option, static text, and list marker) 30505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit stores the main accessible text in the "value" - swap it so 30515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that it's the "name". 3052a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (name().empty() && 3053a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION || 3054a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_STATIC_TEXT || 3055a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch GetRole() == ui::AX_ROLE_LIST_MARKER)) { 3056a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string tmp = value(); 3057a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_value(name()); 3058a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) set_name(tmp); 30595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If this doesn't have a value and is linked then set its value to the url 30625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // attribute. This allows screen readers to read an empty link's destination. 3063a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (value().empty() && (ia_state_ & STATE_SYSTEM_LINKED)) 30645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) set_value(GetStringAttribute(ui::AX_ATTR_URL)); 30655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clear any old relationships between this node and other nodes. 30675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < relations_.size(); ++i) 30685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_[i]->Release(); 30695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_.clear(); 30705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Handle title UI element. 30725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title_elem_id) { 30735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a labelled by relationship. 30745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CComObject<BrowserAccessibilityRelation>* relation; 30755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HRESULT hr = CComObject<BrowserAccessibilityRelation>::CreateInstance( 30765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &relation); 30775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(SUCCEEDED(hr)); 30785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->AddRef(); 30795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->Initialize(this, IA2_RELATION_LABELLED_BY); 30805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relation->AddTarget(title_elem_id); 30815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) relations_.push_back(relation); 30825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 30845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 30850529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochvoid BrowserAccessibilityWin::OnUpdateFinished() { 30865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct the hypertext for this node. 30875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_.clear(); 30885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlinks_.clear(); 30895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hypertext_.clear(); 30900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) for (unsigned int i = 0; i < PlatformChildCount(); ++i) { 30910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) BrowserAccessibility* child = PlatformGetChild(i); 3092a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (child->GetRole() == ui::AX_ROLE_STATIC_TEXT) { 30935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) hypertext_ += base::UTF8ToUTF16(child->name()); 30945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 30955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlink_offset_to_index_[hypertext_.size()] = hyperlinks_.size(); 30965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hypertext_ += kEmbeddedCharacter; 30975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hyperlinks_.push_back(i); 30985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 30995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK_EQ(hyperlink_offset_to_index_.size(), hyperlinks_.size()); 31015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire an event when an alert first appears. 3103a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_ALERT && first_time_) 31045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager()->NotifyAccessibilityEvent(ui::AX_EVENT_ALERT, this); 31055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire events if text has changed. 3107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 text = TextForIAccessibleText(); 31085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (previous_text_ != text) { 31095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!previous_text_.empty() && !text.empty()) { 3110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->NotifyAccessibilityEvent( 31115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_EVENT_SHOW, this); 31125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): Look into HIDE events, too. 31155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_text_ = previous_text_; 31175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) previous_text_ = text; 31185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) BrowserAccessibilityManagerWin* manager = 31215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) this->manager()->ToBrowserAccessibilityManagerWin(); 31225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire events if the state has changed. 31245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!first_time_ && ia_state_ != old_ia_state_) { 31255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Normally focus events are handled elsewhere, however 31265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // focus for managed descendants is platform-specific. 31275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Fire a focus event if the focused descendant in a multi-select 31285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // list box changes. 3129a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch if (GetRole() == ui::AX_ROLE_LIST_BOX_OPTION && 31305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_FOCUSABLE) && 31315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_SELECTABLE) && 31325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (ia_state_ & STATE_SYSTEM_FOCUSED) && 31335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(old_ia_state_ & STATE_SYSTEM_FOCUSED)) { 313490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_FOCUS, unique_id_win()); 31355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((ia_state_ & STATE_SYSTEM_SELECTED) && 31385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !(old_ia_state_ & STATE_SYSTEM_SELECTED)) { 313990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONADD, 314090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unique_id_win()); 31415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (!(ia_state_ & STATE_SYSTEM_SELECTED) && 31425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (old_ia_state_ & STATE_SYSTEM_SELECTED)) { 314390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_OBJECT_SELECTIONREMOVE, 314490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) unique_id_win()); 31455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_ia_state_ = ia_state_; 31485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 31495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Fire an event if this container object has scrolled. 31515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int sx = 0; 31525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int sy = 0; 31535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetIntAttribute(ui::AX_ATTR_SCROLL_X, &sx) && 31545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetIntAttribute(ui::AX_ATTR_SCROLL_Y, &sy)) { 31555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!first_time_ && 31565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) (sx != previous_scroll_x_ || sy != previous_scroll_y_)) { 31575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager->MaybeCallNotifyWinEvent(EVENT_SYSTEM_SCROLLINGEND, 31585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unique_id_win()); 31595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) previous_scroll_x_ = sx; 31615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) previous_scroll_y_ = sy; 31625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 31635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 31645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) first_time_ = false; 31655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::NativeAddReference() { 31685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 31695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::NativeReleaseReference() { 31725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Release(); 31735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool BrowserAccessibilityWin::IsNative() const { 31765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 31775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BrowserAccessibilityWin::OnLocationChanged() { 3180a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager()->ToBrowserAccessibilityManagerWin()->MaybeCallNotifyWinEvent( 318190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EVENT_OBJECT_LOCATIONCHANGE, unique_id_win()); 3182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 3183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::NewReference() { 31855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRef(); 31865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 31875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 31885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)BrowserAccessibilityWin* BrowserAccessibilityWin::GetTargetFromChildID( 31905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const VARIANT& var_id) { 31915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (var_id.vt != VT_I4) 31925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 31935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG child_id = var_id.lVal; 31955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child_id == CHILDID_SELF) 31965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return this; 31975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31980f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) if (child_id >= 1 && child_id <= static_cast<LONG>(PlatformChildCount())) 31990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) return PlatformGetChild(child_id - 1)->ToBrowserAccessibilityWin(); 32005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3201a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return manager()->ToBrowserAccessibilityManagerWin()-> 3202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) GetFromUniqueIdWin(child_id); 32035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HRESULT BrowserAccessibilityWin::GetStringAttributeAsBstr( 32065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AXStringAttribute attribute, 32072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BSTR* value_bstr) { 3208a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 str; 32095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (!GetString16Attribute(attribute, &str)) 32115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 32125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (str.empty()) 32145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_FALSE; 32155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *value_bstr = SysAllocString(str.c_str()); 32175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(*value_bstr); 32185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return S_OK; 32205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::StringAttributeToIA2( 32235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AXStringAttribute attribute, 32242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 3225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 value; 32263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetString16Attribute(attribute, &value)) 32275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ia2_attributes_.push_back(base::ASCIIToUTF16(ia2_attr) + L":" + value); 32285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::BoolAttributeToIA2( 32315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AXBoolAttribute attribute, 32322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 32335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool value; 32345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetBoolAttribute(attribute, &value)) { 32355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ia2_attributes_.push_back((base::ASCIIToUTF16(ia2_attr) + L":") + 32365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (value ? L"true" : L"false")); 32375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::IntAttributeToIA2( 32415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AXIntAttribute attribute, 32422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const char* ia2_attr) { 32435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int value; 32443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (GetIntAttribute(attribute, &value)) { 32455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ia2_attributes_.push_back(base::ASCIIToUTF16(ia2_attr) + L":" + 32465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::IntToString16(value)); 32473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 32483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)} 32493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 3250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityWin::GetValueText() { 32513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) float fval; 32525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 value = base::UTF8ToUTF16(this->value()); 3253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 32543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) if (value.empty() && 32555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) GetFloatAttribute(ui::AX_ATTR_VALUE_FOR_RANGE, &fval)) { 32565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) value = base::UTF8ToUTF16(base::DoubleToString(fval)); 32573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) } 32583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) return value; 32595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 BrowserAccessibilityWin::TextForIAccessibleText() { 32622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsEditableText()) 32635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return base::UTF8ToUTF16(value()); 3264a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch return (GetRole() == ui::AX_ROLE_STATIC_TEXT) ? 32655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(name()) : hypertext_; 32665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3268a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void BrowserAccessibilityWin::HandleSpecialTextOffset( 3269a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 3270a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) LONG* offset) { 32712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (*offset == IA2_TEXT_OFFSET_LENGTH) 32725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *offset = static_cast<LONG>(text.size()); 32732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (*offset == IA2_TEXT_OFFSET_CARET) 32745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) get_caretOffset(offset); 32755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::TextBoundaryType BrowserAccessibilityWin::IA2TextBoundaryToTextBoundary( 32785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IA2TextBoundaryType ia2_boundary) { 32795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch(ia2_boundary) { 32805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_CHAR: return ui::CHAR_BOUNDARY; 32815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_WORD: return ui::WORD_BOUNDARY; 32825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_LINE: return ui::LINE_BOUNDARY; 32835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_SENTENCE: return ui::SENTENCE_BOUNDARY; 32845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_PARAGRAPH: return ui::PARAGRAPH_BOUNDARY; 32855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case IA2_TEXT_BOUNDARY_ALL: return ui::ALL_BOUNDARY; 32865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 32875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 32885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::CHAR_BOUNDARY; 32895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 32905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 32915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LONG BrowserAccessibilityWin::FindBoundary( 3293a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const base::string16& text, 32945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IA2TextBoundaryType ia2_boundary, 32955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LONG start_offset, 32965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextBoundaryDirection direction) { 32975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HandleSpecialTextOffset(text, &start_offset); 32985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary); 32993551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<int32>& line_breaks = GetIntListAttribute( 33005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_LINE_BREAKS); 33015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::FindAccessibleTextBoundary( 33023551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) text, line_breaks, boundary, start_offset, direction); 33035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33050529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochBrowserAccessibilityWin* BrowserAccessibilityWin::GetFromID(int32 id) { 33060529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return manager()->GetFromID(id)->ToBrowserAccessibilityWin(); 33075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 33085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void BrowserAccessibilityWin::InitRoleAndState() { 33105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ = 0; 33115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ = IA2_STATE_OPAQUE; 33125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_attributes_.clear(); 33135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_BUSY)) 33155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_BUSY; 33165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_CHECKED)) 33175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_CHECKED; 33185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_COLLAPSED)) 33195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_COLLAPSED; 33205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_EXPANDED)) 33215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_EXPANDED; 33225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_FOCUSABLE)) 33235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 33245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_HASPOPUP)) 33255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_HASPOPUP; 33265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_HOVERED)) 33275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_HOTTRACKED; 33285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_INDETERMINATE)) 33295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_INDETERMINATE; 33305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_INVISIBLE)) 33315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_INVISIBLE; 33325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_LINKED)) 33335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 33345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_MULTISELECTABLE)) { 33355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_EXTSELECTABLE; 33365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MULTISELECTABLE; 33375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(ctguil): Support STATE_SYSTEM_EXTSELECTABLE/accSelect. 33395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_OFFSCREEN)) 33405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_OFFSCREEN; 33415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_PRESSED)) 33425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PRESSED; 33435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_PROTECTED)) 33445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PROTECTED; 33455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_REQUIRED)) 33465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_REQUIRED; 33475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_SELECTABLE)) 33485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_SELECTABLE; 33495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_SELECTED)) 33505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_SELECTED; 33515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_VISITED)) 33525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_TRAVERSED; 33535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasState(ui::AX_STATE_ENABLED)) 33545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_UNAVAILABLE; 33555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_VERTICAL)) { 33565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_VERTICAL; 33575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 33585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_HORIZONTAL; 33595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 33605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_VISITED)) 33615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_TRAVERSED; 33625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebKit marks everything as readonly unless it's editable text, so if it's 33645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not readonly, mark it as editable now. The final computation of the 33655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // READONLY state for MSAA is below, after the switch. 33665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasState(ui::AX_STATE_READ_ONLY)) 33675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 33685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3369a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 invalid; 33705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetHtmlAttribute("aria-invalid", &invalid)) 33715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_INVALID_ENTRY; 33725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetBoolAttribute(ui::AX_ATTR_BUTTON_MIXED)) 33745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MIXED; 33755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 33765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetBoolAttribute(ui::AX_ATTR_CAN_SET_VALUE)) 33775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 33785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3379a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 html_tag = GetString16Attribute( 33805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_HTML_TAG); 33815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = 0; 33825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = 0; 3383a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch switch (GetRole()) { 33845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ALERT: 33855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ALERT; 33865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ALERT_DIALOG: 33885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DIALOG; 33895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_APPLICATION: 33915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_APPLICATION; 33925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ARTICLE: 33941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ia_role_ = ROLE_SYSTEM_DOCUMENT; 33955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 33965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 33975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_BUSY_INDICATOR: 33985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ANIMATION; 33995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_BUTTON: 34025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 34035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_aria_pressed_defined; 34045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_mixed; 34055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed)) 34065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_PRESSED; 34075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_aria_pressed_defined) 34085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; 34095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_mixed) 34105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_MIXED; 34115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CANVAS: 34135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetBoolAttribute(ui::AX_ATTR_CANVAS_HAS_FALLBACK)) { 341458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) role_name_ = L"canvas"; 341558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ia2_role_ = IA2_ROLE_CANVAS; 341658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 341758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 341858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 34195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CELL: 34215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CELL; 34225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CHECK_BOX: 34245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CHECKBUTTON; 34255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COLOR_WELL: 34275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 34285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_COLOR_CHOOSER; 34295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COLUMN: 34315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COLUMN; 34325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COLUMN_HEADER: 34355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COLUMNHEADER; 34365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COMBO_BOX: 34395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COMBOBOX; 34405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DIV: 34425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"div"; 34435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 34445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DEFINITION: 34465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 34475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 34485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL: 34512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) role_name_ = html_tag; 34522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 34532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 34555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DESCRIPTION_LIST_TERM: 34565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 34575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DIALOG: 34605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DIALOG; 34615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DISCLOSURE_TRIANGLE: 34645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINEBUTTON; 34655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DOCUMENT: 34685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ROOT_WEB_AREA: 34695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_WEB_AREA: 34705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_DOCUMENT; 34715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 34735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_EDITABLE_TEXT: 34755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 34765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SINGLE_LINE; 34775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 34785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::AX_ROLE_FIGCAPTION: 34801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci role_name_ = html_tag; 34811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ia2_role_ = IA2_ROLE_CAPTION; 34821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 34831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::AX_ROLE_FIGURE: 34841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci role_name_ = html_tag; 34851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ia_role_ = ROLE_SYSTEM_GROUPING; 34861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ia2_role_ = IA2_ROLE_SECTION; 34871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 34885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_FORM: 34895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"form"; 34905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_FORM; 34915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_FOOTER: 34935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = IA2_ROLE_FOOTER; 34945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 34965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_GRID: 34975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TABLE; 34985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 34995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_GROUP: { 3501a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 aria_role = GetString16Attribute( 35025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_ROLE); 35035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (aria_role == L"group" || html_tag == L"fieldset") { 35045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 35055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (html_tag == L"li") { 35065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 35075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 35085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_tag.empty()) 35095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"div"; 35105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 35115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 35125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 35135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_GROW_AREA: 35185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRIP; 35195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_HEADING: 35225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 35235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_HEADING; 35245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_HORIZONTAL_RULE: 35275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SEPARATOR; 35285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3529c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch case ui::AX_ROLE_IFRAME: 3530c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ia_role_ = ROLE_SYSTEM_CLIENT; 3531c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ia2_role_ = IA2_ROLE_INTERNAL_FRAME; 3532c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch break; 35335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_IMAGE: 35345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 35355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_IMAGE_MAP: 35385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = html_tag; 35395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_IMAGE_MAP; 35405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_IMAGE_MAP_LINK: 35435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LINK; 35445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 35455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LABEL_TEXT: 35485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 35495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_LABEL; 35505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::AX_ROLE_MAIN: 35521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ia_role_ = ROLE_SYSTEM_GROUPING; 35531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci break; 35545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_BANNER: 35555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_COMPLEMENTARY: 35565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_CONTENT_INFO: 35575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_NAVIGATION: 35585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SEARCH: 35595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 35605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 35615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LINK: 35645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LINK; 35655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_LINKED; 35665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST: 35685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LIST; 35695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_BOX: 35725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LIST; 35735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_BOX_OPTION: 35755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 35765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_state_ & STATE_SYSTEM_SELECTABLE) { 35775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 35785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_FOCUSED)) 35795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSED; 35805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 35815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LIST_ITEM: 35835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 35845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MATH_ELEMENT: 35875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_EQUATION; 35885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 35895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU: 35915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_BUTTON: 35925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUPOPUP; 35935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_BAR: 35955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUBAR; 35965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 35975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_ITEM: 35985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_MENUITEM; 35995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_LIST_POPUP: 36015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 36025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MENU_LIST_OPTION: 36045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_LISTITEM; 36055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (ia_state_ & STATE_SYSTEM_SELECTABLE) { 36065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSABLE; 36075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_FOCUSED)) 36085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_FOCUSED; 36095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_NOTE: 36125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 36135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_NOTE; 36145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_OUTLINE: 36175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 36185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_PARAGRAPH: 36215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) role_name_ = L"P"; 36225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_PARAGRAPH; 36235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_POP_UP_BUTTON: 36255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (html_tag == L"select") { 36265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_COMBOBOX; 36275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 36285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_BUTTONMENU; 36295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_PROGRESS_INDICATOR: 36325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PROGRESSBAR; 36335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_RADIO_BUTTON: 36365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_RADIOBUTTON; 36375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_RADIO_GROUP: 36395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 36405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 36415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_REGION: 36435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 36445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 36455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ROW: 36485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ROW; 36495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ROW_HEADER: 36525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_ROWHEADER; 36535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_RULER: 36565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 36575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_RULER; 36585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SCROLL_AREA: 36615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 36625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SCROLL_PANE; 36635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 3664010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ia2_state_ &= ~(IA2_STATE_EDITABLE); 36655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SCROLL_BAR: 36675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SCROLLBAR; 36685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SLIDER: 36705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SLIDER; 36715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SPIN_BUTTON: 36735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SPINBUTTON; 36745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SPIN_BUTTON_PART: 36765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 36775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SPLIT_GROUP: 36795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 36805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SPLIT_PANE; 36815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_ANNOTATION: 3684a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) case ui::AX_ROLE_LIST_MARKER: 36855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_STATIC_TEXT: 3686a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_STATICTEXT; 36875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_STATUS: 36895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_STATUSBAR; 36905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 36915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SPLITTER: 36935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_SEPARATOR; 36945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 36955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SVG_ROOT: 36962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_GRAPHIC; 36972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) break; 36985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TAB: 36995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PAGETAB; 37005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TABLE: { 3702a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 aria_role = GetString16Attribute( 37035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ui::AX_ATTR_ROLE); 37042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (aria_role == L"treegrid") { 37052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 37062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 37072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_role_ = ROLE_SYSTEM_TABLE; 37082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 37105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 37125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TABLE_HEADER_CONTAINER: 37135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_GROUPING; 37145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_SECTION; 37155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TAB_LIST: 37185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PAGETABLIST; 37195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TAB_PANEL: 37215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PROPERTYPAGE; 37225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TOGGLE_BUTTON: 37245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_PUSHBUTTON; 37255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; 37265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TEXT_AREA: 37285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 37295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_MULTI_LINE; 37305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 37315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 37325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TEXT_FIELD: 37345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TEXT; 37355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SINGLE_LINE; 37365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_EDITABLE; 37375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_state_ |= IA2_STATE_SELECTABLE_TEXT; 37385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TIMER: 37405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLOCK; 37415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TOOLBAR: 37445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TOOLBAR; 37455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TOOLTIP: 37485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_TOOLTIP; 37495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TREE: 37525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 37535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TREE_GRID: 37565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINE; 37575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_TREE_ITEM: 37605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_OUTLINEITEM; 37615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 37625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_WINDOW: 37645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_WINDOW; 37655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(dmazzoni): figure out the proper MSAA role for all of these. 37685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_BROWSER: 37695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DIRECTORY: 37705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_DRAWER: 37715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_HELP_TAG: 37725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_IGNORED: 37735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_INCREMENTOR: 37745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_LOG: 37755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MARQUEE: 37765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_MATTE: 37771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::AX_ROLE_NONE: 37785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_PRESENTATIONAL: 37795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_RULER_MARKER: 37805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SHEET: 37815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SLIDER_THUMB: 37825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_SYSTEM_WIDE: 37835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::AX_ROLE_VALUE_INDICATOR: 37845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 37855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ = ROLE_SYSTEM_CLIENT; 37865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 37875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compute the final value of READONLY for MSAA. 37905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 37915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We always set the READONLY state for elements that have the 37925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // aria-readonly attribute and for a few roles (in the switch above). 37935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We clear the READONLY state on focusable controls and on a document. 37945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Everything else, the majority of objects, do not have this state set. 37955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (HasState(ui::AX_STATE_FOCUSABLE) && 37965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_role_ != ROLE_SYSTEM_DOCUMENT) { 37975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ &= ~(STATE_SYSTEM_READONLY); 37985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 37995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (!HasState(ui::AX_STATE_READ_ONLY)) 38005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ &= ~(STATE_SYSTEM_READONLY); 38015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (GetBoolAttribute(ui::AX_ATTR_ARIA_READONLY)) 38025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia_state_ |= STATE_SYSTEM_READONLY; 38035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The role should always be set. 38055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(!role_name_.empty() || ia_role_); 38065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // If we didn't explicitly set the IAccessible2 role, make it the same 38085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // as the MSAA role. 38095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!ia2_role_) 38105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ia2_role_ = ia_role_; 38115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 38125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 38135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 3814